Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полигон и отрезок, Когда пересекаются? 
:(
    Опции темы
Sail
Дата 28.6.2004, 20:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть: Полигон в 3D, известны координаты всех вершин в 3D, заведомо плоский и выпуклый многоугольник; и отрезок, координаты концов тоже известны.

Надо: Быстро определить, пересекает ли отрезок этот полигон (именно отрезок, а не прямая, и именно полигон, а не плоскость).

Идеи: По трем вершинам полигона сочиняем уравнение плоскости и находим точку пересечения плоскости и прямой, содержащей отрезок (выразив координаты точки пересечений функциями от нужных геометрических параметров). Отлавливаем divbyzero если они параллельны. Подставляем концы отрезка в уравнение плоскости: если значения имеют разные знаки, то отрезок пересекает плоскость. Осталось определить, он пересекает ее в полигоне или нет.
Вот я и завис... Уж без того куча делений будет, а тут еще тригонометрией попахивает.

Наверняка все в корне можно сделать не так. Может как-нибудь побыстрее можно? Хотя бы для частного случая, когда полигон - треугольник...
  Вверх
maxim1000
Дата 29.6.2004, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну для начала желательно найти точку пересечения отрезка с плоскостью
потом надо определить, внутри ли многоугольника находится точка:
1. записываем вершины многоугольника по порядку (т.е. соседние вершины в списке идут друг за другом)
2. идем по ребрам многоугольника и смотрим справа исследуемая точка или слева
3. если точка всегда была с одной стороны, значит, она внутри, иначе - снаружи
---
как определить справа точка или слева:
ребро - AB, точка - O
считаем векторное произведение ABxAO
его знак указывает на то, справа или слева точка от ребра
если при проходе по всем ребрам знак не изменился, значит, точка O внутри


--------------------
qqq
PM WWW   Вверх
yurgen20
Дата 2.7.2004, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.4.2003

Репутация: нет
Всего: нет



А можно еще свести задачу к двумерной. Т.е. выполнить преобразования координат так, чтобы плоскость многоугольника совпала с одной из координатных плоскостей. Исключая из расчетов одну из координат можно существенно ускорить алгоритм.
PM MAIL   Вверх
Sail
Дата 2.7.2004, 19:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 yurgen20
Хорошая идея wink.gif Так побыстрее будет. Но при преобразовании координат все равно потребуется вычислять нормаль и умножать матрицы 3x3 на (3x(n+2)), где n-количество вершин у полигона...
Зато легко определится, пересекает ли отрезок эту плоскость, а точка пересечения найдется из подобия треугольников cool.gif

2 maxim1000
Нормальный вариант, особенно когда одна координата нулевая, векторное произведение считается просто cool.gif

Наверно ничего оптимальнее не придумать... или придумать?..[s][/s]
  Вверх
maxim1000
Дата 2.7.2004, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
считаем векторное произведение ABxAO
его знак указывает на то, справа или слева точка от ребра
если при проходе по всем ребрам знак не изменился, значит, точка O внутри

ужас какой написал, а никто не заметил smile.gif
конечно, нужно смотреть не знак векторного произведения smile.gif, а его скалярного произведения на нормаль...



--------------------
qqq
PM WWW   Вверх
Sail
Дата 3.7.2004, 15:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

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

Зачем скалярное произведение?
Векторные произведения будут параллельны нормали и достаточно следить знак любой проекции векторного произведения на x, y или z , которая у нормали не нулевая.
  Вверх
maxim1000
Дата 3.7.2004, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
Векторные произведения будут параллельны нормали и достаточно следить знак любой проекции векторного произведения на x, y или z , которая у нормали не нулевая.

да, не заметил...
просто скалярное произведение - первое, что пришло в голову


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.