Возможный дубликат:
Как определить, где пересекаются два отрезка?
Учитывая два балла 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
потому что единственная разница между точкой и вектором заключается в том, как она трансформируется аффинным преобразованием.
Это простая математика.
Но, во-первых, проверьте, что у вас есть пересечение. Если оба вектора параллельны, вы не сможете решить, что:
// 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
Надеюсь, что это помогло вам.
Похоже, проблема назначения для меня. Вот логика, которая поможет вам написать код.
Давайте назовем первый Луч как 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
, расширенные лучи пересекаются.