Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
12 янв 2025 Вс
Точка пересечения прямых
Я заметил, что пользуюсь некоторыми формулами графики, и причем очень часто. Эти формулы такого рода.
Я уже далеко не раз выводил эту формулу, но повторить не помешает. Есть две линии, отрезка, прямые, вектора, тут уж как угодно можно их называть, я уже в терминологии запутался. У каждого отрезка есть точка начала и точка конца. Итого, отрезок с началом в
Параметрическое уравнение прямой для каждого отрезка будет представлять собой вот такие вот формулы.
Итого, система линейных уравнений:
Чтобы найти точку пересечения, надо вычислить:
- Пересечение двух прямых
- Пересечение прямых с плоскостью
- Определение стороны, где лежит точка по отношению к прямой или плоскости
INTERSECT_STRAIGHT_2D
или INTERSECT_STRAIGHT_PLANE
. Только они как-то длинно звучат. Можно придумать покороче например ISTR2D
или ISTR3D
. Еще можно искать пересечения двух плоскостей, только это уже как-то посложнее и что-то я ни разу не делал этого, не потребовалось.Я уже далеко не раз выводил эту формулу, но повторить не помешает. Есть две линии, отрезка, прямые, вектора, тут уж как угодно можно их называть, я уже в терминологии запутался. У каждого отрезка есть точка начала и точка конца. Итого, отрезок с началом в
a
и концом в точке b
будет отрезком ab
. Это один отрезок. А есть второй, который назовём отрезком cd
.Параметрическое уравнение прямой для каждого отрезка будет представлять собой вот такие вот формулы.
# Уравнение прямой ab x = a.x + u*(b.x - a.x) y = a.y + u*(b.y - a.y) # Уравнение прямой cd x = c.x + v*(d.x - c.x) y = c.y + v*(d.y - c.y)Чтобы найти точку пересечения, надо приравнять эти две формулы между собой, и найти один из корней уравнения (
u
или v
). Какой из них — не имеет значения, они все равно будут пересекаться в одной точке. Либо не пересекаться, это тоже не стоит забывать. Если прямые нигде не пересекаются, то это значит, что они параллельны.Итого, система линейных уравнений:
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Сначала, отыскиваем детерминант:
D = (d.x-c.x)*(b.y-a.y) - (b.x-a.x)*(d.y-c.y)И если он равен 0, это указывает на то, что прямые параллельны и дальше считать ничего не надо. Они не пересекаются, и это факт. Если же D не равен нулю, то тогда найдем пересечения.
u = (d.x-c.x)*(c.y-a.y) - (c.x-a.x)*(d.y-c.y) ' Прямая АB v = (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y) ' Прямая CDКак я и говорил, чтобы понять, где именно пересекаются прямые, достаточно лишь одной компоненты. Однако, если мы говорим об отрезках, то важно, чтобы
u
, v
были не меньше чем 0 и не больше чем D
. Если они не попадают в данный диапазон, то сами по себе отрезки не пересекаются между собой.Чтобы найти точку пересечения, надо вычислить:
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)Это был разговор про точки пересечения. Теперь бы создать какую-нибудь функцию на Quick Basic 4.5, чтобы ее постоянно переиспользовать в дальнейшем.
screen 13 ' Объявление точек type p2: x as single: y as single: end type dim a as p2, b as p2, c as p2, d as p2 a.x = 50: a.y = 30: b.x = 100: b.y = 120 c.x = 30: c.y = 80: d.x = 120: d.y = 20 ' Нарисовать линии line (a.x, a.y)-(b.x, b.y),2 line (c.x, c.y)-(d.x, d.y),10 ' Найти точку пересечения и поставить ее u = istr2d(a,b,c,d) x = a.x + u*(b.x-a.x) y = a.y + u*(b.y-a.y) pset (x,y),12 ' Функция вычисления точки пересечения function istr2d(a as p2, b as p2, c as p2, d as p2) ax = b.x-a.x: ay = b.y-a.y: acx = c.x-a.x cx = d.x-c.x: cy = d.y-c.y: acy = c.y-a.y dt = cx*ay - ax*cy u = cx*acy - acx*cy v = ax*acy - acx*ay if dt <> 0 then istr2d = u / dt else istr2d = 0 end function
<< Ранние записи |
Поздние записи >>