Найти, если 2 треугольника перпендикулярны в трехмерном пространстве - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть 2 треугольника в трехмерном пространстве, состоящих из 3 точек.

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

Я думаю, что у меня есть кусочки, но мне нужна помощь в их организации:)

Спасибо.

Текущий код включен ниже, не уверен, что он правильный.

vx1 = self.vertices[f[1]].x-self.vertices[f[0]].x
vy1 = self.vertices[f[1]].y-self.vertices[f[0]].y
vz1 = self.vertices[f[1]].z-self.vertices[f[0]].z

vx2 = self.vertices[f[2]].x-self.vertices[f[0]].x
vy2 = self.vertices[f[2]].y-self.vertices[f[0]].y
vz2 = self.vertices[f[2]].z-self.vertices[f[0]].z

plane1 = np.cross([vx1,vy1,vz1],[vx2, vy2, vz2])

vx3 = self.vertices[ff[1]].x-self.vertices[ff[0]].x
vy3 = self.vertices[ff[1]].y-self.vertices[ff[0]].y
vz3 = self.vertices[ff[1]].z-self.vertices[ff[0]].z

vx4 = self.vertices[ff[2]].x-self.vertices[ff[0]].x
vy4 = self.vertices[ff[2]].y-self.vertices[ff[0]].y
vz4 = self.vertices[ff[2]].z-self.vertices[ff[0]].z

plane2 = np.cross([vx3,vy3,vz3],[vx4, vy4, vz4])

print("p1",plane1)
print("p2",plane2)
print("dot",np.dot(plane1,plane2))

if np.dot(plane1,plane2) == 0:
    print("perpendictular")

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

@ Ответ Рори Долтона интуитивно понятен и прекрасноЯ бы просто добавил, что вы можете использовать формулу Бине-Коши для десятикратного ускорения:

import numpy as np

TR1, TR2 = np.random.random((2,3,3))

def xprod():
    return np.cross(*(TR1[:2]-TR1[2]))@np.cross(*(TR2[:2]-TR2[2]))

def bincau():
    aux = ((TR1[:2]-TR1[2])@(TR2[:2]-TR2[2]).T).ravel()
    return aux[0]*aux[3] - aux[1]*aux[2]

xprod()
# -0.04300263623056995
bincau()
# -0.043002636230569956

from timeit import timeit

timeit(xprod, number=100000)
# 7.751510428992333
timeit(bincau, number=100000)
# 0.620043026006897
0 голосов
/ 15 декабря 2018

Я предполагаю, что треугольники не обязательно должны пересекаться, чтобы считаться «перпендикулярными».

В этом случае треугольники перпендикулярны тогда и только тогда, когда их нормальные векторы перпендикулярны.Чтобы найти вектор нормали Треугольника 1, возьмите перекрестное произведение векторов, составляющих стороны.Т.е. если треугольник 1 определен точками t1p1, t1p2 и t1p3, рассчитайте перекрестное произведение t1p2-t1p1 и t1p3-t1p1.(Используйте numpy.cross, чтобы сделать это.) Сделайте то же самое для Треугольника 2.

Теперь используйте скалярное произведение, чтобы увидеть, что эти нормальные векторы перпендикулярны друг другу.(Используйте numpy.dot, чтобы сделать это.) Эти векторы перпендикулярны, если их скалярное произведение равно нулю.

Если ваши точки имеют координаты с плавающей точкой, вы должны проверить «близко к нулю», а не «равно нулю»"для обработки небольших ошибок в расчетах.Я оставлю вам фактический код Python / numpy.Если вам нужна дополнительная помощь, приложите больше усилий с вашей стороны.

...