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

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

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

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

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

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

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

Эту формулу можно использовать для любых многоугольников без самопересечений.
...
Рейтинг: 0 / 0
Четырехугольник
    #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
Четырехугольник
    #32785752
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Ты прав. Дело в том, что я забыл упомянуть о том что этот алгоритм работает для выпуклых многоугольников. А если многоугульник вогнутый то можно его разбить на несколько выпуклых.
...
Рейтинг: 0 / 0
Четырехугольник
    #32787961
Andrew07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, ничего страшного. Два дня, правда, вылетели попусту. А так ничего.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Четырехугольник
    #35632547
Margek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mayton а почему векторное произведение вычисляется? По логике вещей там скалярное должно быть. А алгоритм хорош...
...
Рейтинг: 0 / 0
Четырехугольник
    #35632566
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MargekMayton а почему векторное произведение вычисляется? По логике вещей там скалярное должно быть. А алгоритм хорош...
По какой логике? Поясни, почему.
...
Рейтинг: 0 / 0
Четырехугольник
    #35632976
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм я чуток так подумал, если нужен способ найти принадлежит ли точка многоугольнику каторый работает и для невыпуклых прямоугольников то можно сделать так?

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

зы. На вид сложновато, но думаю математически там будет не сложно.
...
Рейтинг: 0 / 0
Четырехугольник
    #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]