3

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

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

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

谢谢!

4

4 回答 4

6

连接两点并使用两点形式得到线的方程(3D 推广很简单)。

然后求解 x = 0 的方程。

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

于 2010-03-15T13:26:41.537 回答
2

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

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

C 将按比例划分连接 A 和 B 的线x1/x2

因此,通过相似性 (y,z) 也会以相同的比例划分线连接 (y1,z1) 和 (y2,z2)。

因为 C 点在 YZ 平面上

x = 0 

截面公式

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);
        }
    }
于 2010-03-15T13:43:46.727 回答
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在左边。它可能与他们相反。

于 2010-03-15T14:02:40.110 回答
1

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

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

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

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

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

于 2017-02-07T14:51:59.057 回答