在转到 flag 并将其标记为“欺骗”之前,请承认我有c++的经验,并且我不完全理解有关{{ 3}}或更高级别的数学。
我有一个由3个点定义的三角形A(0,0,0),B(1,0,0),C(0,1,1)
我有一条线段,由2个点定义,D(0,1 / 2,0)和E(1,1 / 2,1)
现在,对于第一个链接,我了解到,如果tetra ABCD = 0或tetra 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 三角形的代码,但是我无法在线找到 3d 三角形的任何内容,可以理解/容易将其翻译为代码,
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
答案 0 :(得分:0)
在这种情况下,该线确实穿过了包含(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。
简而言之,向量的方向代表着您来自何方和去向,以其符号表示。
我们可以通过认识到某个体积被某些矢量所限制,而这些矢量本身具有方向,从而可以将该概念扩展到体积上。
答案 1 :(得分:0)
让路段由参数方程式描述
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
代入第一个方程以获得交点