Для начала вам очень нужна некоторая реализация класса Vector3
, пишете ли вы свою собственную, находите где-нибудь автономную реализацию в Интернете или используете библиотеку, которая содержит такую, как XNA или Sharp3D.Math .
Обычно линии в трехмерном пространстве представлены не двумя точками, а параметрическими уравнениями и управляются векторами, а не скалярами.Ваше параметрическое уравнение будет иметь вид:
x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1)
Вектор u определяется коэффициентами t
..
Вектор PQ определяется выбранной вами точкой Q минус точка P на линии.Можно выбрать любую точку на линии, поэтому проще всего использовать линию t = 0
, которая упрощается до x1, y1 и z1.
Определение кратчайшего расстояния между точкой и линией в трехмерном пространстве выглядит следующим образом:
D = || PQ x и ||/ || u ||
Где x
- оператор перекрестного произведения, а || ... ||
- величина содержащегося вектора.В зависимости от того, какую библиотеку вы выберете, ваш код может отличаться, но он должен быть очень похожим:
Vector3 u = new Vector3(x2 - x1, y2 - y1, z2 - z1);
Vector3 pq = new Vector3(x3 - x1, y3 - y1, z3 - z1);
float distance = Vector3.Cross(pq, u).Length / u.Length;
Редактировать : я только что понял, что вы хотите фактическую точку пересечения, а нерасстояние.Формула, чтобы найти фактическую точку немного отличается.Вам нужно использовать внутреннее пространство продукта, чтобы получить компонент u , перпендикулярный PQ .Для этого вам нужно найти компонент u в направлении PQ :
(( PQ · u) / || u || ^ 2) * u
Это дает нам компонент w1 , но мы хотим w2 , который является компонентом между Q и линией:
PQ = w1 + w2
w2 = PQ - w1
Оттуда мы берем w2 идобавьте его к точке Q , чтобы получить точку на линии, ближайшей к Q .В коде это будет:
Vector3 p1 = new Vector3(x1, y1, z1);
Vector3 p2 = new Vector3(x2, y2, z2);
Vector3 q = new Vector3(x3, y3, z3);
Vector3 u = p2 - p1;
Vector3 pq = q - p1;
Vector3 w2 = pq - Vector3.Multiply(u, Vector3.Dot(pq, u) / u.LengthSquared);
Vector3 point = q - w2;
Где point.X
равно x4
, point.Y
равно y4
и point.Z
равно z4
.