【问题标题】:3D line plane intersection, with simple plane3D线平面相交,与简单平面
【发布时间】:2010-03-15 13:21:31
【问题描述】:

我在 3D 空间中有两个点,它们的 X 坐标具有不同的符号。所以其中一个肯定位于 X 平面的一侧,另一个位于另一侧。

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

我知道如何进行一般线平面相交,但由于在这种情况下平面只是 x 平面,我认为应该有一些捷径可以走。

谢谢!

【问题讨论】:

  • 如果你指的是 x=0 的平面,那么我称之为 Y-Z 平面。
  • 是的,我的意思是这架飞机

标签: 3d geometry line plane


【解决方案1】:

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

然后求解 x = 0 的方程。

找到解决方案后,将它们翻译成您的编程语言。

【讨论】:

    【解决方案2】:
    P1 = (x1,y1,z1) P2 = (x2,y2,z2) k1 = -x2/(x1-x2) k2 = 1-k1 交点 = k1*P1 + k2*P2 或: Ix = 0 - 我们知道这个 Iy = k1*y1 + k2*y2 Iz = k1*z1 + k2*z2

    我假设 P1 在右边,P2 在左边。它可能与它们相反。

    【讨论】:

      【解决方案3】:

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

      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);
              }
          }
      

      【讨论】:

        【解决方案4】:

        这个问题很老,但由于有一个更方便的解决方案,我认为它可能会对某人有所帮助。

        如果正确实施,一般情况在实践中几乎完全一样快。

        用齐次坐标表示时,平面和线的交点非常优雅,但假设您只需要解决方案:

        有一个向量 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)

        为了获得更高的性能,使用表达式模板将允许编译器将解决方案折叠为最小情况。

        【讨论】:

          猜你喜欢
          • 2011-08-05
          • 1970-01-01
          • 2011-11-02
          • 2012-02-14
          • 2015-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多