Аксиальный куб и треугольник

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Аксиальный куб и треугольник

Сообщение Vovik » 14.06.2007 (Чт) 17:21

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.06.2007 (Пт) 16:58

Vovik
Сначала находишь пересечение куба с плоскостью, содержащей треугольник, далее уже полученной фигуры с треугольником.
И вообще, что нужно? Узнать пересекается, или нет, или найти фигуру пересечения?

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 25.06.2007 (Пн) 21:35

Mikle писал(а):Vovik
Сначала находишь пересечение куба с плоскостью, содержащей треугольник, далее уже полученной фигуры с треугольником.
И вообще, что нужно? Узнать пересекается, или нет, или найти фигуру пересечения?
Нужно просто ответить на вопрос: Есть ли пересечение?

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

Сообщение Хакер » 26.06.2007 (Вт) 1:09

Проверить, лежит ли точка в кубе мы ведь легко можем?
(Пусть есть функция PointInBox, которая возвращает 1 - если точка в кубе, и 0-если точке вне куба.)
Делаем так:



Код: Выделить всё
Function TestTriangleIntersectWithCube(Cube as MYCUBE, Triang() AS MYVECTOR) As Boolean
Dim Summator As Long
Summator  = PointInBox(Cube, Triang(0)) + _
                    PointInBox(Cube, Triang(1)) + _
                    PointInBox(Cube, Triang(2))

TestTriangleIntersectWithCube = (Summator = 1) or (Summator = 2)
End Function


Причём данный способ прокатит не везде, а только там где треугольник гораздо меньше чем куб. В противном случае, следует либо использовать другую функцию:

Код: Выделить всё
Function TestTriangleIntersectWithCube(Cube as MYCUBE, Triang() AS MYVECTOR) As Boolean
TestTriangleIntersectWithCube   = True
If LineIntersectBox(Cube, Triang(0), Triang(1)) Then
     Exit Function
ElseIf LineIntersectBox(Cube, Triang(1), Triang(2)) Then
     Exit Function
ElseIf LineIntersectBox(Cube, Triang(2), Triang(0)) Then
       Exit function
End if
TestTriangleIntersectWithCube   =   False
End Function


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

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 26.06.2007 (Вт) 9:35

Зачем плодить треугольники? Есть способ узнать, пересекает ли отрезок куб. Проверяем все 3 ребра треугольника.
Изображение

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

Сообщение Хакер » 26.06.2007 (Вт) 9:36

keks-n
Читай сообщение внимательнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.06.2007 (Вт) 10:27

keks-n писал(а):Зачем плодить треугольники? Есть способ узнать, пересекает ли отрезок куб. Проверяем все 3 ребра треугольника.

Треугольником считается вся плоская фигура, или только её граница?
Если вся, то пересекать рёбра мало.
Изображение

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 26.06.2007 (Вт) 23:02

tyomitch писал(а):
keks-n писал(а):Зачем плодить треугольники? Есть способ узнать, пересекает ли отрезок куб. Проверяем все 3 ребра треугольника.

Треугольником считается вся плоская фигура, или только её граница?
Если вся, то пересекать рёбра мало.
В том-то и дело, что треугольник вся плоская фигура... Я думал проецировать куб и грани треугольника на плоскости XY, XZ, ZY и смотреть пересечение квадрата с прямыми, но с очень-очень большим треугольником не катит... :cry:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.06.2007 (Ср) 0:22

Для случая, когда все вершины треугольника вне куба, а его стороны не пересекаются с рёбрами куба:
Пересекаешь плоскость треугольника с кубом, получаешь <=6-угольник.
Если хоть одна его вершина снаружи треугольника, то пересечения треугольника и куба нет. Иначе есть.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 27.06.2007 (Ср) 10:13

Строишь три полуплоскости от ребер треугольника внутрь. Если все три полуплоскости пересекают куб, то и треугольник пересекает.


Вернуться в Мультимедиа

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

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

    TopList  
cron