2010-03-15 49 views
3

我有两个点在3D空间中有不同符号的X坐标。所以他们中的一个肯定位于X平面的一侧,另一侧位于另一侧。三维平面交叉点,简单的平面

现在我想以最简单和最优化的方式找到这个平面与由这两个点组成的线的交点。

我知道如何做一般线平面交叉,但因为在这种情况下,飞机只是X平面,我认为应该有一些捷径,我可以采取。

谢谢!

+1

如果您的意思是x = 0的平面,那么我会称之为Y-Z平面。 – 2010-03-15 13:34:39

+0

yepp,这就是我所说的飞机 – clamp 2010-03-15 13:39:23

+0

[3D Line-Plane Intersection]的可能重复(http://stackoverflow.com/questions/5666222/3d-line-plane-intersection) – ideasman42 2015-10-23 04:59:02

回答

6

连接两个点,并使用two-point form(3D泛化简单)得到线的方程。

然后求解x = 0的

方程式你已经得到了解决方案之后,其转化为你的编程语言。

2

试试这个我还在计算:)改善...让我知道它是否有效。

A = (x1,y1,z1) 
B = (x2,y2,z2) 
C = (x,y,z) 

C将按照比例x1/x2划分加入A和B的线。因此通过相似性(y,z)也将划分连线(y1,z1)和(y2,z2)的比例相同。

由于C点位于Y-Z平面

x = 0 

通过Section Formula

y = (r*y2 + y1)/(r+1) 

z = (r*z2 + z1)/(r+1) 

where r = |x1|/|x2| 

简单的例子:

A = (1,2,2)B = (-2,2,2)然后C显然应该(0,2,2)

x = 0 
r = 1/2 = 0.5 
y = (0.5*2 + 2)/(0.5+1) = 2 
z = (0.5*2 + 2)/(0.5+1) = 2 

代码C#:

public class Point 
    { 
     public double x { get; set; } 
     public double y { get; set; } 
     public double z { get; set; } 

     public Point(double X, double Y, double Z) 
     { 
      x = X; 
      y = Y; 
      z = Z; 
     } 

     public override string ToString() 
     { 
      return string.Format("({0},{1},{2})",x,y,z); 
     } 
    } 

    public class Program 
    { 
     public static void Main() 
     { 
      Point a = new Point(-10, 0, 10); 
      Point b = new Point(10, 0, 0); 

      Console.WriteLine(GetIntersectionWithYZ(a,b)); 
     } 

     public static Point GetIntersectionWithYZ(Point A, Point B) 
     { 
      double r = - A.x/B.x; 

      double y = (r * B.y + A.y)/(r + 1); 
      double z = (r * B.z + A.z)/(r + 1); 

      return new Point(0, y, z); 
     } 
    } 
2
 
P1 = (x1,y1,z1) 
P2 = (x2,y2,z2) 

k1 = -x2/(x1-x2) 
k2 = 1-k1 

Intersection = k1*P1 + k2*P2 or: 
Ix = 0    - we know this one 
Iy = k1*y1 + k2*y2 
Iz = k1*z1 + k2*z2 

我假设P1是在右边和P2的左侧。它可能与他们逆转。

0

这个问题很古老,但既然有这样一个更方便的解决方案,我觉得它可能有助于某人。

如果正确实施,一般情况下在实践中非常接近完全一样快。

有一个向量4X1 P,其描述了平面使得P ^的Tx = 0任何均匀点:在齐次坐标表示的,但是让我们假设你只是想解决方案时

平面和直线相交处都相当优雅在飞机上。接下来计算行L = ab^T - ba^T的拔取器坐标,其中a = {point_1; 1},b = {point_2; 1},线上的4x1都计算:x = Lp = {x0,x1,x2,x3} x_intersect =({x0,x1,x2}/x3)

For higher表达式模板的高效使用将允许编译器将解决方案折叠到最小的情况。