Поиск факта пересечения двух плоских фигур

Различные геометрические алгоритмы.
brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Поиск факта пересечения двух плоских фигур

Сообщение brigval » 07.10.2011 (Пт) 15:39

Есть две произвольные плоские фигуры, контур каждой из которых состоит из прямых отрезков и дуг. Известны все необходимые координаты концов отрезков и дуг и параметры дуг.
Задача. Как узнать, пересекаются ли эти две фигуры. Есть ли хотя бы одна общая точка. Нужен только факт пересечния/непересечения.
Буду благодарен за любую полезную информацию или ссылку.
brigval

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поиск факта пересечения двух плоских фигур

Сообщение FireFenix » 07.10.2011 (Пт) 16:19

Для простых отрезков - форум или интернет
Для дуг - наверное что-то такое тоже есть или же нада выводить
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.10.2011 (Пт) 17:48

Пересечение фигур не равносильно пересечению их границ. Есть ещё случай вложенности. Причём для невыпуклых фигур проверка вложенности заметно усложняется.

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 07.10.2011 (Пт) 23:38

Qwertiy писал(а):Пересечение фигур не равносильно пересечению их границ.

Пример не пересекающихся фигур с пересекающимися границами приведи.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.10.2011 (Сб) 0:30

Хакер писал(а):Пример не пересекающихся фигур с пересекающимися границами приведи.

Я не говорил, что такое возможно. Я сказал "не равносильно", уточнив при этом, что есть случаи, когда границы не пересекаются, а фигуры пересекаются.
Пересечение границ в любом случае даёт пересечение фигур, т. к. граница - это часть фигуры (незамкнутые фигуры в тут не рассматриваются).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 08.10.2011 (Сб) 2:42

Qwertiy писал(а):что есть случаи, когда границы не пересекаются, а фигуры пересекаются.

Ну тогда пример вот этого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.10.2011 (Сб) 9:14

Хакер писал(а):
Qwertiy писал(а):что есть случаи, когда границы не пересекаются, а фигуры пересекаются.

Ну тогда пример вот этого.

Inside.png
Вот
Inside.png (9.14 Кб) Просмотров: 10756

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск факта пересечения двух плоских фигур

Сообщение iGrok » 08.10.2011 (Сб) 12:23

И где там "пересекающиеся" фигуры?
Одна в другой - да. Но они же не пересекаются. ,-)
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 08.10.2011 (Сб) 13:03

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

Алгоритм архипростой:
(Обозначим фигуры за A и B)
  • Проверяем пересечение контура A с контуром B. Если контуры пересекаются, то и фигуры пересекаются. Ответ дан.
  • Если контуры не пересекаются, берём произвольные точки X и Y, такие, что Математическая формула: {X}\in{A} и Математическая формула: {Y}\in{B}, и строим произвольные лучи, исходящие из этих точек. Считаем количество пересечений контура B с X-лучём и контура A с Y-лучём. Если хоть в одном случае получилось нечётное число, значит фигуры пересекаются.

Лучше проще всего брать горизонтальные или вертикальные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 09.10.2011 (Вс) 2:36

Кому-то будет подарок:
intersect_demo_nointersect.png
intersect_demo_nointersect.png (8.92 Кб) Просмотров: 10730

intersect_demo_partial.png
intersect_demo_partial.png (11.04 Кб) Просмотров: 10730

intersect_demo_ainb.png

intersect_demo_bina.png


Смотреть надо модуль modAlgo, там сам алгоритм — определение пересечения, всё остальное — обвес для возможности рисовать фигуры в окне. Алгоритм устойчив к самопересекающимся многоугольникам.
Вложения
poly_intersection_demo.zip
Определение пересечения фигур
(19.82 Кб) Скачиваний: 294
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 09.10.2011 (Вс) 19:55

Хакер писал(а):Кому-то будет подарок:
intersect_demo_nointersect.png

intersect_demo_partial.png

intersect_demo_ainb.png

intersect_demo_bina.png


Смотреть надо модуль modAlgo, там сам алгоритм — определение пересечения, всё остальное — обвес для возможности рисовать фигуры в окне. Алгоритм устойчив к самопересекающимся многоугольникам.


Большое спасибо. К сожалению, там не учтены границы, включающие дуги. Но все-равно очень интересно. Поизучаю.
brigval

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 09.10.2011 (Вс) 20:00

Дуги чем представлены?
Как я должен учитывать это, если ты ничего не сказал? Это кривые Безье? Если да, то какой степени? Или может быть это NURBS-кривые? Или дуги, являющиеся дугами окружности с заданным радиусом и центром?

В любом случае это решается просто тем, что код, определяющий пересечений граней меняется на код, определяющий пересечение кривых.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 10.10.2011 (Пн) 4:43

Хакер писал(а):В любом случае это решается просто тем, что код, определяющий пересечений граней меняется на код, определяющий пересечение кривых.

Или представить дуги как ломаные перед проверкой пересечений.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 10.10.2011 (Пн) 4:45

Proxy писал(а):Или представить дуги как ломаные перед проверкой пересечений.

Это ужасный путь. Он не только ошибко-опасный (неточный), но ещё и очень малопроизводительный, потому что будет много отрезков, и все возможные пары нужно проверить на пересечение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Поиск факта пересечения двух плоских фигур

Сообщение ger_kar » 10.10.2011 (Пн) 6:45

Да уж, что тут скажешь, надо было геометрию в школе хорошо учить, что-бы решать такие задачи, хотя мне здается, что школьного курса геометрии здесь не хватит. Насколько я помню ничего подобного, кроме окружности в школьной геометрии не было:
Хакер писал(а):Это кривые Безье? Если да, то какой степени? Или может быть это NURBS-кривые? Или дуги, являющиеся дугами окружности с заданным радиусом и центром?
Из этого я например понял только про окружности с радиусом и центром и про дуги им соответствующие. Нет я конечно знаю, что такое кривая Безье, точнее как она выглядит на практике, потому как она часто применяется в графических редакторах, в том эе Photoshop и Corel , но какими она обладает математическими свойствами даже не представляю, а про NURBS-кривые, я вообще первый раз слышу :).
Бороться и искать, найти и перепрятать

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 10.10.2011 (Пн) 8:44

Хакер писал(а):Дуги чем представлены?
Как я должен учитывать это, если ты ничего не сказал? Это кривые Безье?

Вообще-то, в первом посте я написал про дуги. Обычные дуги (часть окружности)

Хакер писал(а):В любом случае это решается просто тем, что код, определяющий пересечений граней меняется на код, определяющий пересечение кривых.

К сожалению, не удется уделить побольше времени на эту задачу. Могу только постепенно ею заниматься. В принципе, идея понятна. Думаю, что с реализацией разберусь. Большое спасибо за информацию.
brigval

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 10.10.2011 (Пн) 11:01

Хакер писал(а):Это ужасный путь. Он не только ошибко-опасный (неточный), но ещё и очень малопроизводительный, потому что будет много отрезков, и все возможные пары нужно проверить на пересечение.

Пригодность зависит от цели, на него возложенные...
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 10.10.2011 (Пн) 11:06

Если ты разобьёшь две кривых на 50 частей каждую, тебе потребуется сделать 50×50 проверок на пересечение отрезков. А если не разобьёшь — один раз решить не очень сложную систему уравнений.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 10.10.2011 (Пн) 11:25

Хакер писал(а):Если ты разобьёшь две кривых на 50 частей каждую, тебе потребуется сделать 50×50 проверок на пересечение отрезков. А если не разобьёшь — один раз решить не очень сложную систему уравнений.

А если дуга - исключительная ситуация в модели и её достаточно разбить всего на 3-4 отрезка (смотря какая ситуация), то не к чему нагружать collision detection избыточным кодом. Вспомни тот же GTA 3, там каждый автомобиль когда-то для проверки пересечения представлялся как 30-40 треугольников. И хватало.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 10.10.2011 (Пн) 11:57

Proxy писал(а):А если дуга - исключительная ситуация в модели и её достаточно разбить всего на 3-4 отрезка (смотря какая ситуация)

Даже если ты разобьёшь на 3—4. Будет 9—16 раз решаться СЛАУ. А так один раз уравнение. С дугами окружности вообще простота.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 10.10.2011 (Пн) 12:09

Хакер писал(а):С дугами окружности вообще простота.

Вообще кривая Безье гораздо универсальнее.
Хакер писал(а):Будет 9—16 раз решаться СЛАУ.

Если код при этом будет на кучу строк короче, то выбор очевиден. Это если рассматривать отдельно пересечения отрезков, пересечения отрезков с дугами и пересечение дуг, в противном случае о производительности и мечтать не придётся.
Follow the white rabbit.

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 10.10.2011 (Пн) 12:20

Proxy писал(а):
Хакер писал(а):Это ужасный путь. Он не только ошибко-опасный (неточный), но ещё и очень малопроизводительный, потому что будет много отрезков, и все возможные пары нужно проверить на пересечение.

Пригодность зависит от цели, на него возложенные...

В данном случае, извините, Хакер прав. Если угол одной фигуры попадет на часть дуги, ограниченной апроксимирующей хордой, пересечение не будет найдено. Сколь бы малой хорда не была.
Просто, в данном случае нужно узнать факт реального пересечения/непресечения.
Да и фигур "одна" может быть несколько десятков, а фигур "вторая" может быть до нескольких десятков тысяч.
brigval

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 10.10.2011 (Пн) 12:37

Proxy писал(а):Вообще кривая Безье гораздо универсальнее.

Нет, ими, например, нельзя «выразить» те же дуги окружности :P
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 10.10.2011 (Пн) 13:40

Хакер писал(а):Нет, ими, например, нельзя «выразить» те же дуги окружности :P

Т.е. нельзя? Окружность представляется как фигура, состоящая из 2-х (или при желании большего числа) кривых Безье, каждая из которых является дугой.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 10.10.2011 (Пн) 21:05

Напиши координаты «контрольных точек» Безье-сплайна для окружности радиусом R в центре с (0; 0).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 11.10.2011 (Вт) 8:53

опорные:
(-R,0)
(R,0)
Направляющие:
(-R,R)
(R,R)
ещё пара направляющих:
(-R,-R)
(R,-R)
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 11.10.2011 (Вт) 10:15

Вот я когда увидел твои опорные точки, устно определил, что вершина такого кубического Безье-сплайна пройдёт в Математическая формула: \frac{3}{4}R от центра на окружности.

Предлагаю тебе в уме посчитать, какие координаты будет иметь точка сплайна с параметром t = 0.5, глядя вот на эту анимацию:
Изображение



P.S. Ну и напоследок: представить дугу окружности с помощью сплайна Безье невозможно, это математически достоверный факт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 11.10.2011 (Вт) 17:25

Хакер писал(а):Вот я когда увидел твои опорные точки, устно определил, что вершина такого кубического Безье-сплайна пройдёт в Математическая формула: \frac{3}{4}R от центра на окружности.

неправильно я написал...
Proxy писал(а):опорные:
(-R;0)
(R;0)
Направляющие:
(-R; 1,(3)4 * R)
(R; 1,(3)4 * R)
ещё пара направляющих:
(-R; -1,(3)4 * R)
(R; -1,(3)4 * R)


Хакер писал(а):P.S. Ну и напоследок: представить дугу окружности с помощью сплайна Безье невозможно, это математически достоверный факт.

Увеличиваем число "контрольных точек" — сумма квадратов разности с Sin; Cos падает. С определённым числом точек можно достигнуть необходимой точности. Сумма квадратов разности асимптотически приближается к абсцисс с увеличением числа точек (график суммы квадратов разности от числа точек).
Follow the white rabbit.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Поиск факта пересечения двух плоских фигур

Сообщение Debugger » 11.10.2011 (Вт) 18:43

Это аппроксимация. Можно любую кривую аппроксимировать, например, ломаной. А вот выразить - нельзя.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 11.10.2011 (Вт) 19:35

Debugger писал(а):Это аппроксимация. Можно любую кривую аппроксимировать, например, ломаной. А вот выразить - нельзя.

Аппроксимации достаточно почти для любой задачи. И способов очень много, можно хоть до разложения в ряд Тейлора дойти.
Ну а насчёт "выразить" я действительно погорячился.
Follow the white rabbit.

След.

Вернуться в Геометрия

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList