Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Четырехугольник / 13 сообщений из 13, страница 1 из 1
10.11.2004, 19:56:55
    #32776320
Andrew07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Запрограммировать на Pascal:

Дано N точек на плоскости.
Найти четырехугольник с вершинами в заданных точках, содержащий наибольшее число заданных точек.

Подскажите, пожалуйста, алгоритм решения, выскажите свои мысли по поводу возможного способа решения данной задачи.
...
Рейтинг: 0 / 0
10.11.2004, 20:29:39
    #32776354
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Генерировать сочетания из N по 4. (алгоритм генерации сочетаний) Для каждой четверки:
1)Проверить прямоугольник на невырожденность
2)Подсчитать количество прочих N-4 точек внутри (алгоритм проверки попадания точки в полигон или в два треугольника)
...
Рейтинг: 0 / 0
10.11.2004, 22:38:32
    #32776413
Andrew07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Общий алгоритм решения более менее ясен.
Больше всего пока непонятно вот что:
По какому алгоритму проверять принадлежность точки четырехугольнику. Сначала хотел сравнивать расстояние, т.е. взять центр четырехугольника и точку на какой-нибудь его линии, узнать расстояние от центра до точки пересечения с этой линией и далее брать следующую точку (уже не на линии), опять высчитать до нее расстояние и сравнивать эти два расстояния. Если расстояние от центра до точки меньше чем от центра до точки пересечения с прямой – значит, точка принадлежит четырехугольнику.

Но проблема в том, что рассматривается четырехугольник и для него такой алгоритм не подходит (для ромба или куба, должен был подойти), т.к. расстояние от центра четырехугольника до каждой линии четырехугольника может различаться.
...
Рейтинг: 0 / 0
10.11.2004, 23:22:01
    #32776424
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Ты можешь проверят как попадание в один из двух треугольников, образующих четырехугольник, или использовать один из стандартных алгоритмов отсечения (см. компьютерная графика, там это описано(отсечение точек прямыми))

________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
11.11.2004, 00:56:49
    #32776451
c127
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
2 Andrew07

>По какому алгоритму проверять принадлежность точки четырехугольнику.

Есть книга: Шеймос, Персепрата "Вычислительная геометрия" (фамилии авторов мог слегка переврать). Там этот алгоритм имеется.
...
Рейтинг: 0 / 0
11.11.2004, 21:09:18
    #32778495
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Представь что четырехугольник - это 4 вектора V(4). Причем конец каждого вектора смотрит в начало следующего. Направление обхода - против часовой стрелки. Для каждого вектора V:
1) Вычислить вектор U начало которого совпадает с V а конец с искомой точкой.
2) Векторное произведение (U,V) должно быть положитным для всех четырех случаев. Если оно отрицательно, значит точка по правую сторону от вектора V. То есть НЕ ПРИНАДЛЕЖИТ четырехугольнику.

Эту формулу можно использовать для любых многоугольников без самопересечений.
...
Рейтинг: 0 / 0
16.11.2004, 13:24:41
    #32784219
Andrew07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Нет Mayton этот алгоритм неверен (или я что-то не так считаю?).
Смотри
T1(0,0) T2(0,2) T(2,2) T4(2,0) T5(0,1)
Образован четырехугольник T1-T4-T3-T2-T1
T5 лежит на стороне T2-T1, т.е. принадлежит фигуре.

Векторное произведение T1T5 и T1T4 дает –(минус) 2 не верно.

Это один из примеров, когда алгоритм не работает. Даже, если брать точку внутри четырехугольника, а не на стороне, можно взять такие координаты, что по данному алгоритму будет выдано, что точка не принадлежит четырехугольнику.

Вот так….
...
Рейтинг: 0 / 0
17.11.2004, 09:49:06
    #32785752
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Да. Ты прав. Дело в том, что я забыл упомянуть о том что этот алгоритм работает для выпуклых многоугольников. А если многоугульник вогнутый то можно его разбить на несколько выпуклых.
...
Рейтинг: 0 / 0
17.11.2004, 22:33:36
    #32787961
Andrew07
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Ладно, ничего страшного. Два дня, правда, вылетели попусту. А так ничего.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
03.11.2008, 17:06:29
    #35632547
Margek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Mayton а почему векторное произведение вычисляется? По логике вещей там скалярное должно быть. А алгоритм хорош...
...
Рейтинг: 0 / 0
03.11.2008, 17:25:34
    #35632566
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
MargekMayton а почему векторное произведение вычисляется? По логике вещей там скалярное должно быть. А алгоритм хорош...
По какой логике? Поясни, почему.
...
Рейтинг: 0 / 0
04.11.2008, 02:21:26
    #35632976
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
Хмм я чуток так подумал, если нужен способ найти принадлежит ли точка многоугольнику каторый работает и для невыпуклых прямоугольников то можно сделать так?

1. перекинуть начало отчета в любую точку.
2. перебрать все возможные комбинации треугольников, где одна из вершин начало кординат
3. построить прямую через искомую точку паралельно тем двум оставимся.
4. найти расстояние между прямыми и началом кординат (привести к каноноческому виду вроде так называеться)
5. найти углы какие имеют точки относительно нач коорд.
6. если расстояние искомой точки найденой из пункта 4 по знаку одинаково и меньше чем для двух остльных, затем если угол искомой находиться между этими двумя то точка внутри треугольника, из каторого состоит искомая фигура

зы. На вид сложновато, но думаю математически там будет не сложно.
...
Рейтинг: 0 / 0
04.11.2008, 11:50:00
    #35633186
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Четырехугольник
РенатХмм я чуток так подумал, если нужен способ найти принадлежит ли точка многоугольнику каторый работает и для невыпуклых прямоугольников то можно сделать так?

1. перекинуть начало отчета в любую точку.
2. перебрать все возможные комбинации треугольников, где одна из вершин начало кординат
3. построить прямую через искомую точку паралельно тем двум оставимся.
4. найти расстояние между прямыми и началом кординат (привести к каноноческому виду вроде так называеться)
5. найти углы какие имеют точки относительно нач коорд.
6. если расстояние искомой точки найденой из пункта 4 по знаку одинаково и меньше чем для двух остльных, затем если угол искомой находиться между этими двумя то точка внутри треугольника, из каторого состоит искомая фигура

Когда речь идёт о комбинациях, в алгоритм вводится "комбинаторная" сложность. Это значит, что время работы алгоритма зависит не линейно а факториально от количества исходных данных. В данном случае, это будет количество вершин твоего многоугольника. Грубо говоря, для большого количества вершин (10-20) можно спокойно отправляться курить или пить кофе (или спать), пока твой алгоритм закончит работу (для проверки одной точки).

Для проверок углов ты будешь использовать сложные формулы тригонметрии, хотя тебе дан в руки аппарат, который называется "векторная алгебра". Суть твоих проверок сводится к определению следующего - "как лежит точка относительно прямой (отрезка или луча)". Я это делаю перемножением векторов. Знак векторного произведения даст тебе ориентацию точки относительно прямой. Векторное произведение вычисляется мгновенно и не имеет побочных эффектов, типа "области допустимых значений", периодичности для функций семейства arc*, которые ты обязательно впихнёшь.

Почитай также алгоритм Метод Трассировки Луча у Ласло. Подходит для невыпуклых многоугольников.

Если полигон состоит из большого количества вершин, и точек очень много (порядка 1000 и более), его можно индексировать. Я-бы предложил разбить его на трапеции, с основанием, параллельным оси X (или Y) и проверять попадение точки в соотв. Трапецию. Поиск трапеций можно выполнять дихотомически. Это позволит уйти от факториальной сложности к логарифмической (только во время проверки естесственно).

Почитай

1. Ласло, "Вычислительная геометрия и компьютерная графика на С++"
2. Шикин, Боресков "Компьютерная графика и полигональные модели".
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Четырехугольник / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]