Учитывая две точки и два вектора, найти точку пересечения

Возможный дубликат:
Как определить, где пересекаются два отрезка?

Учитывая два балла a а также b плюс два вектора v а также u Я хочу найти третью точку c, который является точкой пересечения следующим образом:

vector2 intersection(vector2 a, vector2 v, vector2 b, vector2 u)
{
float r, s;

a + r * v = b + s * u;
r * v - s * u = b - a

r * v.x - s * u.x = b.x - a.x
r * v.y - s * u.y = b.y - a.y
}

Есть ли другой способ, кроме использования гауссовского исключения для решения этой системы? Или это лучший (или, по крайней мере, приемлемый) способ справиться с этим?

РЕДАКТИРОВАТЬ:
Значение vector2

typedef union vector2
{
float v[2];
struct { float x, y; };
} vector2;

a а также b также имеют тип vector2потому что единственная разница между точкой и вектором заключается в том, как она трансформируется аффинным преобразованием.

3

Решение

Это простая математика.

Но, во-первых, проверьте, что у вас есть пересечение. Если оба вектора параллельны, вы не сможете решить, что:

// Edit this line to protect from division by 0
if (Vy == 0 && Uy == 0) || ((Vy != 0 && Uy != 0 && (Vx/Vy == Ux/Uy)) // => Fail.

Затем (я хочу показать расчет, потому что они долго, но):

R = (AxUy - AyUx + ByUx - BxUy) / (VyUx - VxUy)
S = (Ax - Bx + RVx) / Ux

Надеюсь, что это помогло вам.

1

Другие решения

Похоже, проблема назначения для меня. Вот логика, которая поможет вам написать код.

Давайте назовем первый Луч как R0,
Локус точки на R0 определяется как P:

P = P0 + alpha x V0

Для второго луча R1:

P = P1 + beta x V1

Так как они должны пересекаться:

P0 + alpha x V0 = P1 + beta x V1

alpha а также beta неизвестны, и у нас есть два уравнения в x любой y,

Разыщите неизвестных и верните точку пересечения.

т.е.

P0.x + alpha * V0.x = P1.x + beta * V1.x
P0.y + alpha * V0.y = P1.y + beta * V1.y

решить для alpha а также beta,

Если есть реальное положительное решение для обоих alpha а также betaлучи пересекаются.
Если существует реальное, но хотя бы одно отрицательное решение для обоих alpha а также beta, расширенные лучи пересекаются.

1

По вопросам рекламы [email protected]