Простое пересечение плоской линии на фиксированной оси Z? - PullRequest
3 голосов
/ 26 мая 2011

Что является и есть быстрый способ проверить, где в плоскости будет пересекаться моя линия, если я знаю, что плоскость всегда находится на одной оси z (поэтому ее нельзя повернуть), а также ее ширина / высота бесконечно? Кроме того, моя «линия» на самом деле не линия, а трехмерный вектор, поэтому «линия» может идти на бесконечное расстояние.

Вот код, который опирается на два пункта: (p1 и p2 - начальная и конечная точки линии. plane_z = где находится плоскость)

k1 = -p2.z/(p1.z-p2.z-plane_z);
k2 = 1.0f-k1;
ix = k1*p1.x + k2*p2.x;
iy = k1*p1.y + k2*p2.y;
iz = plane_z; // where my plane lays

Другое решение, которое работает с вектором (я заставил его использовать две точки, как и в первом примере, «p2.x-p1.x» и т. Д. - векторное вычисление):

a = (plane_z-p1.z)/(p2.z-p1.z);
ix = p1.x + a*(p2.x-p1.x);
iy = p1.y + a*(p2.y-p1.y);
iz = plane_z;

Edit3: добавлено решение Орблинга, которое немного быстрее и не обязательно опирается на две точки.

1 Ответ

3 голосов
/ 26 мая 2011

Вы можете реализовать прямолинейное решение, как здесь http://paulbourke.net/geometry/planeline/,, а затем применить свои упрощения. В алгебраическом решении (# 2) A и B - нули в вашем случае (если я правильно понимаю это утверждение)

Плоскость всегда находится на одной оси Z (поэтому ее нельзя вращать)

Примечание: ваша линия должна быть точкой и направлением или двумя точками, верно?

...