在去国旗并将其标记为傻瓜之前,请承认我有轻微的c++经验,并且我不完全理解有关matrices或更高级数学的一些问题的答案。
我有3个点定义的三角形,A(0,0,0),B(1,0,0),C(0,1,1)
我有一个由2个点定义的线段,D(0,1 / 2,0)和E(1,1 / 2,1)
现在,关于第一个链接,我理解如果四个ABCD的体积= 0或四个ABCE = 0,则三角形面内有一个点。但是当提到负数量时:
这是解决问题的一种方法。计算四面体的体积Td =(a,b,c,d)和Te =(a,b,c,e)。如果Td或Te的任一体积为零,则段de的一个端点位于包含三角形(a,b,c)的平面上。如果Td和Te的体积具有相同的符号,则de严格地位于一侧,并且没有交叉点。如果Td和Te具有相反的符号,则de穿过包含(a,b,c)的平面。
如何成交量为负数?我错过了什么吗?
我有一个2d三角形的代码,但我找不到任何在线的三维三角形,这是可以理解/容易翻译成代码,
def areaOfTri(x1, y1, x2, y2, x3, y3):
return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0)
def pointIn2dTri(x1, y1, x2, y2, x3, y3, x, y):
# Calculate area of triangle ABC
A = areaOfTri (x1, y1, x2, y2, x3, y3)
# Calculate area of triangle PBC
A1 = areaOfTri (x, y, x2, y2, x3, y3)
# Calculate area of triangle PAC
A2 = areaOfTri (x1, y1, x, y, x3, y3)
# Calculate area of triangle PAB
A3 = areaOfTri (x1, y1, x2, y2, x, y)
# Check if sum of A1, A2 and A3
# is same as A
if(A == A1 + A2 + A3):
return True
else:
return False
在这种情况下,该线穿过包含(a, b, c)
的平面。
证明:
abcd = np.array([[0, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 1, 1],
[0, 0.5, 0, 1]])
abce = np.array([[0, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 1, 1],
[1, 0.5, 1, 1]])
print(np.sign(np.linalg.det(abcd)))
print(np.sign(np.linalg.det(abce)))
输出:
1.0
-1.0
负面卷的解释可能不是本网站的主题,但请参阅this answer。
简而言之,向量有一个方向,表示你来自哪里与你去的地方,用他们的标志来表示。
我们可以通过识别某个卷由某些向量限定来扩展该卷,这些向量本身具有方向。
让段由参数方程描述
P(t) = D + (E-D)*t
和三角形定义了它的平面中的双参数坐标系
F(u,v) = A + u*(B-A) + v*(C-A)
制作属于该平面的分段点的三个线性方程组
D.X + (E.X - D.X) * t = A.X + u*(B.X-A.X) + v*(C.X-A.X)
similar for y,z
为未知的t,u,v
解决它(用NumPy应该很容易)。
如果存在解决方案,则段确实与三角形相交
t is in range 0..1
u ~ 0..1
v ~ 0..1
u+v ~ 0..1
在成功的情况下,将t
替换为第一个方程以获得交点