【问题标题】:Find any point on a 3D line defined by implicit equations查找由隐式方程定义的 3D 线上的任何点
【发布时间】:2013-07-13 02:44:33
【问题描述】:

该行是:

Ax + By + Cz = D

Ex + Fy + Gz = H

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

我尝试选择一个坐标设置为零,然后求解另外两个。这可以正常工作,除了:

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

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

编辑:我不在乎它找到哪一点。它不必让所有这些都被找到。

【问题讨论】:

  • 你对向量代数感到满意吗?

标签: math geometry line linear-algebra


【解决方案1】:

我想补充 jh314 的解决方案:

您还可以通过解决更复杂的问题来获得分数,例如:

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

我认为这在数值上会更稳定

【讨论】:

  • 看起来很漂亮!也许比 jh314 的答案慢,但更干净。
【解决方案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>

如果叉积为&lt;0,0,0&gt;,则平面平行,不存在直线。

然后在交点中找到一个点 (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) 将是您想要的线上的一个点。

【讨论】:

  • 你原来的两个方程。我会提到这一点。
  • 这又回到了我原来的解决方案。在保证数值稳定性的同时解决这些问题并不容易,因为未知数比方程多。
  • 假设 z=0 并不总是有效。例如,当 A=B=E=G=0 时。你可以用很多条件语句来解决这个问题,但这是我已经拥有的解决方案,我觉得它太丑了,很难对其可靠性充满信心。
  • 有3个案例。 x 可以是 0,y 可以是 0,或者 z 可以是 0。其中之一必须为真。
  • 我不能使用 != 因为它们是浮点数。相反,我会找到(AF-EB)、(AG-EC)和(BG-CF)的最大值来决定哪个坐标为零。该测试本身实施起来非常混乱。你可以看到这段代码变得非常复杂,这是我希望避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多