LINUX.ORG.RU

Алгоритм пересечения фигурв пространстве

 , ,


0

3

Подскажите, пожалуйста, как мне узнать, что две плоских фигуры пересекаются в пространстве. Воспоминания о тригонометрии подсказывают, что надо искать пересечения проекций этих фигур на оси. То есть, если все три проекции XY XZ YZ пересекаются, то и фигуры пересекаются. Так как реализация будет применяться в алгоритме с порядком роста n^2, хочется сделать не совсем тормозной алгоритм, то есть грамотно использовать всякие там боундинг бокс, ну и что ещё в таких случаях используют.

Если фигуры пересекаются, то и их проекции пересекаются. Обратное НЕ ВЕРНО! Проекции могу пересекаться, а фигуры - нет.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Так а он написал же не одна проекция, а

если все три проекции XY XZ YZ пересекаются, то и фигуры пересекаются

Вроде логично

anonymous
()
Ответ на: комментарий от x4DA

только выпуклые, ок, добавил на почитать

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от x4DA

Definition: A point set K⊆Rd is called a cone with apex 0, if K=R+K (i.e., ∀p∈K,∀λ>0:λp∈K) and it is called a cone with apex x, x∈Rd, if K=x+R+(K−x). A cone K is called a pyramid if K is a polyhedron.

не, ну это слишком сложно:)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от anonymous

Хотя та же логика подсказывает, что проекциями в ZX ZY XY не обойтись.

anonymous
()
Ответ на: комментарий от anonymous

Вроде логично

нет, не логично. Нет такого критерия.

mashina ★★★★★
()
Ответ на: комментарий от pseudo-cat

Как именно точками? Если это многоугольник на плоскости, то даны вершины ломаной его ограничивающей? Потому что алгоритм как раз и зависит от того, как с-но фигуры заданы.

AIv ★★★★★
()

Возьмём треугольник

(2, 0, 0) - (0, 2, 0) - (0, 0, 2)
И ещё один такой же сдвинутый на 1 по одной из оси
(2, 0, 1) - (0, 2, 1) - (0, 0, 3)
Думаю очевидно что они не пересекаются в пространстве, но все три их проекции пересекаются. Т.е. способ определения по пересечению проекций не работает.


На ум приходит такой способ определить, пересекаются ли фигуры. Вычисляем уравнение плоскостей в который лежат эти фигуры:
A1 * x + B1 * y + C1 * z = D1
A2 * y + B2 * y + C2 * z = D2
Ищем линию пересечения этих плоскостей. Теперь ищем отрезки - места пересечения фигур с этой линией (двухмерная задача). Если отрезки пересекаются, то и фигуры пересекаются и наоборот.

Micky53
()

SAT, Сумма(разность) Минковского, GJK

Bad_ptr ★★★★★
()
Ответ на: комментарий от AIv

наверное так, ну в том плане что важна их последовательность? но разве для выпуклой фигуры важен порядок? в общем, если треугольник, то даны точки A(x,y,z), B(x,y,z), C(x, y, z)

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

У них там математическая строгость по всем фронтам, смотри исходники станет понятней.

x4DA ★★★★★
()
Ответ на: комментарий от anonymous

Нет, не логично. Два треугольника:

  • (0, 0, 1), (0, 1, 0), (1, 0, 0)
  • (0, 0, 2), (0, 2, 0), (2, 0, 0)

Не пересекаются, но проекции первого находятся внутри проекций второго.

anonymous
()
Ответ на: комментарий от pseudo-cat

Если фигуры плоские, то необходимо и достаточно, что бы отрезок (ребро) одной фигуры имел хотя бы одну общую точку с другой фигурой. Проверять надо как вхождение фигуры 1 в 2, так и 2 в 1. Задача сводится к проверке пересечения отрезка и треугольника в пр-ве - любой многоугольник может быть представлен как совокупность треугольников, выпуклый многоугольник представляется так тривиальным образом.

AIv ★★★★★
()

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

1) найти линию пересечения плоскостей, 2) найти пересечения этой линии фигурами. 3) определить имеют ли эти пересечения общие точки

п1 - вспомни тригонометрию :) п2 - или триангулировать фигуры, или решать аналитически (если фигуры заданы функциями) п3 - совсем просто.

MKuznetsov ★★★★★
()

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

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

kamre ★★★
()
Ответ на: комментарий от AIv

не понял, а зачем проверять пересечение рёбер фигуры 2 в фигуре 1?

Звучит просто и понятно, без всяких заумных разностей Минковского, да и по производительности вполне сносно. Если 1 ребро пересекается, то значит 1 общая точка, если 2 то фигуры пересекаются отрезком AB, где А и B - точки пересечения рёбер. Правильно я понял?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от pseudo-cat

Затем, что ребра фигуры 1 могу не пересекать фигуру 2, а ребра фигуры 2 при этом будут пересекать фигуру 1.

Вариант с пересечением двух плоскостей и потом анализа пересечения с прямой м.б. и попроще.

AIv ★★★★★
()
Ответ на: комментарий от Micky53

Твой метод поиска пересечения мне нравится даже больше.

Waterlaz ★★★★★
()

когда учился в универе писанул https://code.google.com/p/polypuch/ код там нормальный его и посмотри. структура проекта какашка конечно - с нее не ржать.

смотри

  • svn/ trunk/ src/ libs/ Polygon/ Simple/ simple_have.cpp
  • svn/ trunk/ src/ libs/ Polygon/ General/ general_have.cpp
  • svn/ trunk/ src/ libs/ Polygon/ Convex/ convex_jarvis.cpp
  • svn/ trunk/ src/ libs/ Polygon/ Convex/ convex_hoare.cpp
  • svn/ trunk/ src/ libs/ Polygon/ Convex/ convex_have.cpp
  • svn/ trunk/ src/ libs/ Polygon/ Convex/ convex_graham.cpp
punya ★★
()
Последнее исправление: punya (всего исправлений: 1)

если хочешь по серьезному подойти к этому вопросу : "Ф. Препарата, М. Шеймос - Вычислительная Геометрия" полностью задрачивай

punya ★★
()
Последнее исправление: punya (всего исправлений: 2)
Ответ на: комментарий от MKuznetsov

найти пересечения этой линии фигурами.

здесь совсем не понятно. Предположим у меня есть уравнение прямой(образованной пересечением плоскостей) в виде (x-x1)/l = (y-y1)/m = (z-z1)/n, где (x1,y1,z1) - точка прямой. (l,m,n) - направляющий вектор. Их я знаю как найти. Что дальше?

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от kamre

плоскости пересекаются по прямой и общие точки могут быть только на этой прямой.

имея уравнение прямой, как определить общие точки этих фигур.

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от Micky53

Теперь ищем отрезки - места пересечения фигур с этой линией (двухмерная задача).
двухмерная задача

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

pseudo-cat ★★★
() автор топика
Последнее исправление: pseudo-cat (всего исправлений: 1)
Ответ на: комментарий от pseudo-cat

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

Micky53
()
Ответ на: комментарий от pseudo-cat

имея уравнение прямой, как определить общие точки этих фигур

обходишь фигуру по кругу. в момент, когда ребро пересекает прямую, регистрируешь начало/конец отрезка. например, когда векторное произведение ( направляющего вектора прямой на радиус-вектор очередной вершины ) меняет направление на противоположное

потом то же для второй фигуры. и проверяешь полученные наборы отрезков на пересечения

MyTrooName ★★★★★
()
Ответ на: комментарий от pseudo-cat

текстом не напишешь, рисовать надо. гугли вычислительную геометрию (если термин не путаю).

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

У тебя от прямой остался только направляющий вектор? Но ведь при параллельном переносе в нормальной плоскости он не меняется в отличие от точки пересечения. Что-то тут не так.

anonymous
()
Ответ на: комментарий от anonymous

да, верно. уточняю:

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

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

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 1)

Пересечение любых из трёх проекций не гарантирует пересечение самих фигур

blexey ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.