
Пересечение Отрезка с Отрезком
Функция для нахождения пересечения отрезка с отрезком (AS3).
public static function Line2Line( x1, y1, x2, y2, x3, y3, x4, y4 )
{
var k1, k2, b1, b2;
var rx, ry, xx, yy;
var res:Object = new Object();
//оба вертикальны
if (x1 == x2 && x3 == x4)
return 0;
//первый отрезок вертикальный
if (int(x1) == int(x2))
{
//параметры второго отрезка
k2 = (y3 - y4) / (x3 - x4);
b2 = y3 - k2 * x3;
//пересечение второго с первым
rx = x1;
ry = k2 * rx + b2;
}
else if (int(x3) == int(x4))
{
//параметры первого отрезка
k1 = (y1 - y2) / (x1 - x2);
b1 = y1 - k1 * x1;
//пересечение второго с первым
rx = x3;
ry = k1 * rx + b1;
}
else
{
//параметры первого отрезка
k1 = (y1 - y2) / (x1 - x2);
b1 = y1 - k1 * x1;
//параметры второго отрезка
k2 = (y3 - y4) / (x3 - x4);
b2 = y3 - k2 * x3;
if (k1 == k2) //параллельны
return 0;
rx = (b2 - b1) / (k1 - k2);
ry = k1 * rx + b1;
}
//проверка на попадание
//сортируем иксы и игреки
if (y2 < y1)
{
yy = y1;
y1 = y2;
y2 = yy;
}
if (y4 < y3)
{
yy = y3;
y3 = y4;
y4 = yy;
}
if (x2 < x1)
{
xx = x1;
x1 = x2;
x2 = xx;
}
if (x4 < x3)
{
xx = x3;
x3 = x4;
x4 = xx;
}
if (rx <= x2 && rx >= x1 && rx <= x4 && rx >= x3 && ry <= y2 && ry >= y1 && ry <= y4 && ry >= y3)
{
res.x = rx;
res.y = ry;
return res;
}
return 0;
}
- +5
- Vogd
Комментарии (2)
Если значение intersect у возвращаемого обьекта равно 1 — линии пересекаются, если -1 не пересекаются. Если равно 0 — линии параллельны.
В случае пересечения координату точки пересечения можно взять из point возвращаемого обьекта.
— Что руки?
— Руки оторвать… за отсутствие типизации.