该行是:
Ax + By + Cz = D
Ex + Fy + Gz = H
我想要满足这些方程的任何点 (x,y,z)。
我尝试选择一个坐标设置为零,然后求解另外两个。这可以正常工作,除了:
1)当某些系数为零或接近零时,我不确定一种可靠的方法来选择哪个坐标为零而不会导致数值不稳定。
2)它涉及大量的 if 语句,这使得代码混乱并且难以测试所有条件组合。
编辑:我不在乎它找到哪一点。它不必让所有这些都被发现。
该行是:
Ax + By + Cz = D
Ex + Fy + Gz = H
我想要满足这些方程的任何点 (x,y,z)。
我尝试选择一个坐标设置为零,然后求解另外两个。这可以正常工作,除了:
1)当某些系数为零或接近零时,我不确定一种可靠的方法来选择哪个坐标为零而不会导致数值不稳定。
2)它涉及大量的 if 语句,这使得代码混乱并且难以测试所有条件组合。
编辑:我不在乎它找到哪一点。它不必让所有这些都被发现。
我想补充 jh314 的解决方案:
您还可以通过解决更复杂的问题来获得分数,例如:
Ax + By + Cz = D
Ex + Fy + Gz = H
(BG-CF)x+(-AG+CE)y+(AF-BE)z = 0
我认为这在数字上会更稳定
你有两个平面,交叉点是一条线。一条线由一个点和一个向量定义。
要获得向量,您可以对平面的法线向量进行叉积。
Ax + By + Cz = D has normal vector <A,B,C>
Ex + Fy + Gz = H has normal vector <E,F,G>
叉积是
<BG-CF,-AG+CE, AF-BE>
如果叉积为<0,0,0>
,则平面平行,不存在线。
然后在交点中找到一个点 (a,b,c)(通过求解原始的两个方程):
Ax + By + Cz = D
Ex + Fy + Gz = H
为此,您可以假设它z
为零。然后检查是否(A*F-E*B) != 0
。如果这是真的,那么评估x,y
:
x = (D*F-B*H)/(A*F-E*B)
y = (E*D-A*H)/(E*B-A*F)
否则,检查是否(A*G-E*C) != 0
. 如果是这样,那么你知道
x = (D*G-C*H)/(A*G-E*C)
z = (E*D-A*H)/(E*C-A*G)
否则,检查是否(B*G-C*F) != 0
. 如果是这样,那么你知道
y = (D*G-C*H)/(B*G-C*F)
z = (B*H-D*F)/(B*G-C*F)
那你有一条线!
x = a + (BG-CF)t
y = b + (CE-AG)t
z = c + (AF-BE)t
t
你的参数在哪里。对于t
你选择的任何一个,(x,y,z) 将是你想要的线上的一个点。