3D线平面交叉,用简单的平面

时间:2010-03-15 13:21:32

标签: 3d geometry line plane

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:6)

连接两个点并使用two-point form得到线的等式(3D概括很简单)。

然后求解x = 0的等式。

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

答案 1 :(得分: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

CODE 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 :(得分: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在左边。它可能与它们相反。

答案 3 :(得分:1)

这个问题已经过时了,但由于有一个更方便的解决方案,我认为这可能有助于某人。

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

当用齐次坐标表示时,平面和直线交点相当优雅,但我们假设您只想要解决方案:

有一个向量4x1 p描述平面,使得平面上任何均匀点的p ^ Tx = 0。接下来计算线L = ab ^ T - ba ^ T的plucker坐标,其中a = {point_1; 1},b = {point_2; 1},计算行上的4x1:x = Lp = {x0,x1,x2,x3} x_intersect =({x0,x1,x2} / x3)

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