|
|
 |
Ответов
|
Jun 30 2010, 16:32
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 3-06-10
Пользователь №: 57 721

|
Если деление на треугольники прошло успешно (с невыпуклами четырехугольниками все сложнее), проверим лежит ли точка внутри одного из треугольников. Пусть треугольник ABC и точка M. проверяем лежит ли точка M в одной полуплоскости, скажем, с вершиной A относительно стороны ВС. Для этого находим точку пересечения O диагоналей четырехугольника МАВС (решаем систему из двух линейных уравнений). И сравниваем длины AO и АМ. Проверка успешна, если AO >= AM. Все тоже самое для точек B и C. Если все три проверки удачные, то точка внутри треугольника. Операций тут явно меньше, но надо проверить пару крайних случаев, в которых система линейных уравнений не решается Цитата(aaarrr @ Jun 30 2010, 20:18)  Ужас какой! Четырехугольник можно рассматривать как пересечение полуплоскостей, образованных его сторонами. То есть всего-то надо определить, принадлежит ли точка каждой из этих полуплоскостей. как же это быстро сделать?
|
|
|
|
|
Jun 30 2010, 16:50
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(mluk @ Jun 30 2010, 20:32)  как же это быстро сделать? Определить принадлежность точки полуплоскости просто. Для этого находим знак выражения: (x2 - x1) * (y - y1) - (y2 - y1) * (x - x1), где x1, y1 и x2, y2 - координаты точек прямой x, y - координаты определяемой точки Для выпуклого четырехугольника нужно выполнить четыре таких операции.
|
|
|
|
|
Jul 1 2010, 05:15
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 3-06-10
Пользователь №: 57 721

|
Цитата(aaarrr @ Jun 30 2010, 20:50)  Определить принадлежность точки полуплоскости просто. Для этого находим знак выражения: (x2 - x1) * (y - y1) - (y2 - y1) * (x - x1), где x1, y1 и x2, y2 - координаты точек прямой x, y - координаты определяемой точки
Для выпуклого четырехугольника нужно выполнить четыре таких операции. И какой же знак должен быть, плюс или минус??? Ясно, что по разные стороны от прямой это выражение принимает разные по знаку значения, а для того чтобы определить какие, нужно крепко подумать. Заметьте, что если вы поменяете местами x1,y1 и x2,y2 знак изменится.
Сообщение отредактировал mluk - Jul 1 2010, 05:22
|
|
|
|
|
Jul 1 2010, 05:28
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 3-06-10
Пользователь №: 57 721

|
Здесь надо знак выбирать такой же как при подстановке в выражение оставшейся из двух вершин четырехугольника. И это работает только для выпуклах четырехугольников.
|
|
|
|
|
Jul 1 2010, 06:28
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(mluk @ Jul 1 2010, 09:28)  И это работает только для выпуклах четырехугольников. А что, ещё вогнутые бывают? Прошу не пинать, в школе давно не был, а ребёнок в 1 классе, пока ещё не дошли... Понял, что за выпуклые. Для вогнутых тоже сработает. Проверьте на бумажке.Понял, не сработает... Тогда да, на 2 треугольника. Причём так: внешний, образованный 3-мя внешними вершинами, и внутренний, который как бы вырезан из 1-го. И проверять вхождение в 1-й и невхождение во 2-й. А бывают неправильные 4-угольники? Которые сами себя пересекают? Или это уже по-другому называется? Вот где ж... Цитата(mluk @ Jul 1 2010, 09:15)  Заметьте, что если вы поменяете местами x1,y1 и x2,y2 знак изменится. А если x1,y1 и x2,y2 воспринимать как координаты вектора, то знак однозначно определяет, с какой стороны ваша точка по отношению к этому вектору
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 1 2010, 08:15
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Пару месяцев назад на собеседовании в одну модную контору дали задание на пересечение простых многоугольников. Алгоритм нахождения принадлежности точки к многоугольнику я есс-но попытался найти готовый, но все что мне попадалось, как то меня не убедило. Я когда то слышал о таком варианте. делаете обход вершин многоугольника из искомой точки и подсчитываете сумму углов поворота вектора, образованного из точки и вершин. Если сумма ноль, точка снаружи, если +||- 2*pi, то внутри. ВАЖНО! Алгоритм протестирован только (и работает) для простых(как выпуклых, так и не выпуклых) многоугольников. Тестовое задание писалось на полном с++, так что пользы от исходников мало Вот метод класса полигон, проверяющий принадлежность точки: CODE bool Polygon::isInternal(const IVertex::Ptr v) { double angle = 0; for (IVertex::iter i = _vertexes.begin(); i < _vertexes.end(); i++) { angle += v->angle(**i, **((*i)->getFWVertex())); } return (angle > 1.0)||(angle < -1.0); }
|
|
|
|
|
Jul 1 2010, 09:04
|

Эксперт
    
Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183

|
QUOTE (Tanya @ Jul 1 2010, 12:57)  Все это вариации одного и того же. Чтобы вычислить угол, имея координаты точек, мы должны вычислить векторное произведение, потом произвести некоторые другие манипуляции. А что за формула написана в 4-м посте? И то, что в самом начале написал автор сводится тоже к тому же. Не совсем. Бывают многоугольники и впуклые, но правильные. Для которых работает обход по контуру. Из обхода по контуру можно вывести формулу в 4-м посте только для выпуклых многоугольников. Но не для впуклых. Трудно сходу представить себе правильный невыпуклый четырёхугольник)) Но это тоже бывает, буквой V Вот треугольник - он всегда выпуклый, а так - нет ЗЫ. Правильный, если кто забыл - это без самопересечений, если я правильно помню
|
|
|
|
Сообщений в этой теме
gsm_starter Обьект внутри четырех угольника Jun 30 2010, 15:35 aaarrr Ужас какой! Четырехугольник можно рассматриват... Jun 30 2010, 16:18         Tanya Цитата(fontp @ Jul 1 2010, 13:04) Не совс... Jul 1 2010, 09:21 MrYuran У вас что там, графический ускоритель на АВР?
М... Jul 1 2010, 05:24 aaarrr Цитата(mluk @ Jul 1 2010, 09:15) Ясно, чт... Jul 1 2010, 05:43 gsm_starter Цитата(aaarrr @ Jul 1 2010, 08:43) Всего-... Jul 12 2010, 18:07  scifi Цитата(gsm_starter @ Jul 12 2010, 22:07) ... Jul 12 2010, 19:44 Oldring Цитата(gsm_starter @ Jun 30 2010, 19:35) ... Jul 1 2010, 09:31 gsm_starter Нет, впуклые исключены. Jul 13 2010, 07:27 Oldring Цитата(gsm_starter @ Jul 13 2010, 11:27) ... Jul 13 2010, 07:38  mluk Проще сравнивать знак варажеия проверяемой точки с... Jul 13 2010, 03:02 scifi Цитата(gsm_starter @ Jul 13 2010, 11:27) ... Jul 13 2010, 05:19 mluk Цитата(scifi @ Jul 13 2010, 09:19) Тогда ... Jul 13 2010, 05:34 Muscat А можно я влезу тут и спрошу?
Почему нельзя опреде... Jul 13 2010, 05:44 mluk Цитата(Muscat @ Jul 13 2010, 09:44) А мож... Jul 13 2010, 05:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|