3D пересечение плоской линии, с простой плоскостью - PullRequest
3 голосов
/ 15 марта 2010

У меня есть две точки в трехмерном пространстве, которые имеют X-координаты с разным знаком. поэтому один из них определенно лежит на одной стороне плоскости Х, а другой - на другой.

Теперь я хочу найти пересечение этой плоскости и линии, составленной двумя точками, самым простым и оптимизированным способом.

Я знаю, как сделать пересечение плоскости общей линии, но так как в этом случае плоскость - это просто плоскость x, я думаю, что должны быть некоторые ярлыки, которые я могу взять.

спасибо!

Ответы [ 4 ]

6 голосов
/ 15 марта 2010

Соедините две точки и получите уравнение прямой, используя двухточечную форму (трехмерное обобщение простое).

Тогда решите уравнение для х = 0.

Получив решения, переведите их на свой язык программирования.

2 голосов
/ 15 марта 2010
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 слева. Это может работать с ними в обратном порядке.

2 голосов
/ 15 марта 2010

Попробуйте, я все еще рассчитываю :) улучшается ... Дайте мне знать, если это работает.

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

C разделит соединяющие линии A и B в соотношении x1/x2.

Таким образом, по подобию (y, z) также разделим объединение линий (y1, z1) и (y2, z2) в том же соотношении.

Поскольку точка C лежит в плоскости Y-Z

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);
        }
    }
1 голос
/ 07 февраля 2017

Этот вопрос старый, но, поскольку есть гораздо более удобное решение, я подумал, что оно может кому-то помочь.

Общий случай на практике почти такой же быстрый, если его правильно реализовать.

Пересечения плоскостей и линий довольно элегантны, когда выражаются в однородных координатах, но давайте предположим, что вам просто нужно решение:

Существует вектор 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)

Для более высокой производительности использование шаблонов выражений позволит компилятору свернуть решение до минимального случая.

...