【问题标题】:Find if 2 triangles are perpendicular in 3D space查找 2 个三角形在 3D 空间中是否垂直
【发布时间】:2018-12-15 20:00:59
【问题描述】:

我在 3D 空间中有 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")

【问题讨论】:

  • 三角形 1 由 (x1, y1, z1), (x2, y2, z2), (x3, y3, z3) 三角形 2 由 (xx1, yy1, zz1) 组成, ( xx2, yy2, zz2), (xx3, yy3, zz3) 我假设我使用 (x2-x1,y2-y1,z2-z1) 和 (x3-x1, y3-y1, z3-z1) 为每个三角形创建 2 个向量) 和类似的 xx1 等。
  • 你的问题似乎比编程更数学。放在math.stackexchange.com 可能会更好。
  • 你问的是什么矩阵?

标签: python numpy math geometry dot-product


【解决方案1】:

我在这里假设三角形不需要实际相交即可被视为“垂直”。

在这种情况下,当且仅当它们的法向量垂直时,三角形才是垂直的。要找到三角形 1 的法向量,请取构成边的向量的叉积。 IE。如果三角形 1 由点t1p1t1p2t1p3 定义,则计算t1p2-t1p1t1p3-t1p1 的叉积。 (使用numpy.cross 执行此操作。)对三角形 2 执行相同操作。

现在使用点积来查看这些法线向量是否相互垂直。 (使用numpy.dot 来做到这一点。)如果它们的点积为零,则这些向量是垂直的。

如果你的点有浮点坐标,你应该检查“接近零”而不是“等于零”来处理轻微的计算错误。我将把实际的 Python/numpy 代码留给你。如果您需要更多帮助,请付出更多努力。

【讨论】:

  • 谢谢。我不得不删掉很多问题,因为网页认为我在解释我的问题时没有使用正确的语法。
  • 这是一个舍入问题:if np.absolute(np.dot(plane1,plane2))
【解决方案2】:

@Rory Daulton 的回答很直观而且非常好。我只想补充一点,您可以使用Binet-Cauchy formula 进行十倍的加速:

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

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多