§ Графически-аналитически

На самом деле, тема очень простая. Необходимо рассчитать, где и каким образом пересекутся две прямые, с заданными векторами направления. Представим, что существует вектор AB и вектор CD. Необходимо найти точку пересечения M.

§ Задание линии параметрически

Задаем обе линии параметрическим методом.
Первая линия:
x = A_x + u(B_x - A_x)
y = A_y + u(B_y - A_y)
Вторая линия:
x = C_x + v(D_x - C_x)
y = C_y + v(D_y - C_y)

§ Решение уравнения

Потом приравниваем уравнения. Как можно заметить, существует некоторая общая точка (x,y), которая должна совпасть, когда у нас будет необходимый u, v. Приравниваем их:
A_x + u(B_x - A_x) = C_x + v(D_x - C_x)
A_y + u(B_y - A_y) = C_y + v(D_y - C_y)
Теперь переносим все неизвестные влево, а известные - вправо:
u(B_x - A_x) - v(D_x - C_x) = C_x - A_x
u(B_y - A_y) - v(D_y - C_y) = C_y - A_y
Заменим:
B_x-A_x = AB_x , D_x-C_x = CD_x , C_x-A_x = AC_x
B_y-A_y = AB_y , D_y-C_y = CD_y , C_y-A_y = AC_y
И вот что получилось:
u AB_x - v CD_x = AC_x
u AB_y - v CD_y = AC_y

§ Нахождение u, v, x, y

Как можно заметить, на самом деле это получилось обычное линейное уравнение, которое легко решается методом Крамера. Первым делом найдем определитель:
D = AB_y CD_x - AB_x CD_y
Если определитель равен 0, это означает только то, что линии параллельны и не имеют точек соприкосновения. Если же нет, то рассчитаем u. Для этого столбец справа, где AC, надо подставить в столбец слева, где AB и рассчитать определитель. После чего поделить на D.
\begin{vmatrix} AC_x & CD_x \\ AC_y & CD_y \end{vmatrix} = AC_y CD_x - AC_x CD_y
Значит, что u будет равен вот этому выражению:
u = \frac{AC_y CD_x - AC_x CD_y}{AB_y CD_x - AB_x CD_y}
А также бывает полезно рассчитать v:
v = \frac{AB_x AC_y - AB_y AC_x}{AB_y CD_x - AB_x CD_y}
Зная u, v легко рассчитать x, y :
x = A_x + u AB_x
y = A_y + u AB_y
Или:
x = C_x + v CD_x
y = C_y + v CD_y
Вот и всё. Точно так же получается и с v - разницы нет, они все равно пересекаются. Интересный факт - если v лежит в диапазоне от 0 до 1, то точка лежит на отрезке CD, точно та же как и u=[0,1] лежит на отрезке AB.

§ Реализация на QB


SCREEN 13

Ax = 100: Ay = 50: Bx = 250: By = 100
Cx = 150: Cy = 25: Dx = 200: Dy = 150

' ----------
LINE (Ax, Ay)-(Bx, By), 2
LINE (Cx, Cy)-(Dx, Dy), 10

' ----------
ABx = Bx - Ax: ABy = By - Ay
ACx = Cx - Ax: ACy = Cy - Ay
CDx = Dx - Cx: CDy = Dy - Cy

D = (ABy * CDx - ABx * CDy)
u = (ACy * CDx - ACx * CDy) / D
v = (ABy * ACx - ABx * ACy) / D

x = Ax + u * ABx
y = Ay + u * ABy

' ------------------
CIRCLE (x, y), 1, 15