Math 查找由隐式方程定义的三维线上的任意点

Math 查找由隐式方程定义的三维线上的任意点,math,geometry,line,linear-algebra,Math,Geometry,Line,Linear Algebra,电话是: Ax+By+Cz=D Ex+Fy+Gz=H 我想要满足这些方程的任意点(x,y,z) 我试着选择一个坐标设置为零,然后求解另外两个。除以下情况外,此功能正常工作: 1) 当某些系数为零或接近零时,我不确定是否有可靠的方法来选择哪个坐标为零,而不会导致数值不稳定 2) 它涉及大量的if语句,这使得代码凌乱,很难测试所有条件的组合 编辑:我不在乎它找到哪一点。它不必允许找到所有平面。有两个平面,交点是一条线。直线由点和向量定义 要得到向量,你可以做平面法向量的叉积 Ax + By + Cz

电话是:

Ax+By+Cz=D

Ex+Fy+Gz=H

我想要满足这些方程的任意点(x,y,z)

我试着选择一个坐标设置为零,然后求解另外两个。除以下情况外,此功能正常工作:

1) 当某些系数为零或接近零时,我不确定是否有可靠的方法来选择哪个坐标为零,而不会导致数值不稳定

2) 它涉及大量的if语句,这使得代码凌乱,很难测试所有条件的组合


编辑:我不在乎它找到哪一点。它不必允许找到所有平面。

有两个平面,交点是一条线。直线由点和向量定义

要得到向量,你可以做平面法向量的叉积

Ax + By + Cz = D has normal vector <A,B,C>
Ex + Fy + Gz = H has normal vector <E,F,G>
为此,可以假设
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)
y = (D*G-C*H)/(B*G-C*F)
z = (B*H-D*F)/(B*G-C*F)
否则,请检查
(B*G-C*F)!=0
。如果是的话,那么你知道

x = (D*G-C*H)/(A*G-E*C)
z = (E*D-A*H)/(E*C-A*G)
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)将是所需直线上的一个点。

有两个平面,交点是一条直线。直线由点和向量定义

要得到向量,你可以做平面法向量的叉积

Ax + By + Cz = D has normal vector <A,B,C>
Ex + Fy + Gz = H has normal vector <E,F,G>
为此,可以假设
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)
y = (D*G-C*H)/(B*G-C*F)
z = (B*H-D*F)/(B*G-C*F)
否则,请检查
(B*G-C*F)!=0
。如果是的话,那么你知道

x = (D*G-C*H)/(A*G-E*C)
z = (E*D-A*H)/(E*C-A*G)
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)将是您所需线路上的一个点。

我想补充jh314的解决方案:

您还可以通过解决更复杂的问题获得一个点,如:

Ax + By + Cz = D 
Ex + Fy + Gz = H 
(BG-CF)x+(-AG+CE)y+(AF-BE)z = 0

我认为这在数值上更稳定

我想补充jh314的解决方案:

您还可以通过解决更复杂的问题获得一个点,如:

Ax + By + Cz = D 
Ex + Fy + Gz = H 
(BG-CF)x+(-AG+CE)y+(AF-BE)z = 0

我认为这在数值上更稳定

你对向量代数满意吗?你对向量代数满意吗?你原来的两个方程。我要提到这一点。这又回到了我最初的解决方案。在保证数值稳定性的同时解决这些问题并不容易,因为未知量比方程多。假设z=0并不总是可行的。例如,当A=B=E=G=0时。你可以用很多条件语句来解决这个问题,但这是我已有的解决方案,我觉得它太难看了,很难对它的可靠性有信心。x可以是0,y可以是0,或者z可以是0。其中一个必须是真的,我不能用因为它们是浮点数。相反,我会找到(AF-EB)、(AG-EC)和(BG-CF)的最大值来决定哪个坐标为零。这个测试本身就很难实现。你可以看到这个代码变得非常复杂,这是我希望避免的。你原来的两个方程。我要提到这一点。这又回到了我最初的解决方案。在保证数值稳定性的同时解决这些问题并不容易,因为未知量比方程多。假设z=0并不总是可行的。例如,当A=B=E=G=0时。你可以用很多条件语句来解决这个问题,但这是我已有的解决方案,我觉得它太难看了,很难对它的可靠性有信心。x可以是0,y可以是0,或者z可以是0。其中一个必须是真的,我不能用因为它们是浮点数。相反,我会找到(AF-EB)、(AG-EC)和(BG-CF)的最大值来决定哪个坐标为零。这个测试本身就很难实现。你可以看到这个代码变得非常复杂,这是我希望避免的。看起来很漂亮!也许比jh314的答案慢,但更干净。看起来很漂亮!也许比jh314的答案慢,但要干净得多。