2010-03-15 4 views
3

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

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

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

спасибо!

+1

Если вы имеете в виду плоскость, где x = 0, то я бы назвал это плоскостью Y-Z. –

+0

yepp, это плоскость, я имею в виду – clamp

+0

Возможный дубликат [3D Line-Plane Intersection] (http://stackoverflow.com/questions/5666222/3d-line-plane-intersection) – ideasman42

ответ

6

Подключите две точки и получите уравнение линии, используя two-point form (простое трехмерное обобщение).

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

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

2

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

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

С будет делить линию, соединяющую А и В в соотношении x1/x2.

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

В точке С лежит в 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 находится справа и Р2 слева. Он может работать с ними в обратном порядке.

0

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

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

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

Там есть вектор 4х1 р, который описывает плоскость, что р^Tx = 0 для любого однородного точки на самолете.Затем вычислим координаты plucker для прямой 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)

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

Смежные вопросы