该行是:
Ax + By + Cz = D
Ex + Fy + Gz = H
我想要满足那些方程的任何点(x,y,z)。
我试过选择一个坐标设置为零,然后解决另外两个坐标。这可以正常工作,除了:
1)当一些系数为零或接近零时,我不确定选择哪个坐标为零而不会导致数值不稳定的可靠方法。
2)它涉及很多if语句,这些语句会使代码变得混乱而且难以测试所有条件组合。
编辑:我不关心它找到了哪一点。它不必允许找到所有这些。
答案 0 :(得分:3)
我想补充jh314的解决方案:
你也可以通过解决更复杂的问题来获得一点:
Ax + By + Cz = D
Ex + Fy + Gz = H
(BG-CF)x+(-AG+CE)y+(AF-BE)z = 0
我认为这在数值上更稳定
答案 1 :(得分:2)
你有两个飞机,交叉点是一条线。线由点和矢量定义。
要获得向量,可以执行平面法线向量的叉积。
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)将是您所需行上的一个点。