
Пересечение Круга с Отрезком.
Пожалуй, буду использовать этот блог для разных полезностей, которые и самому могут потом пригодиться.
Функция для нахождения пересечения круга с отрезком (AS3).
Функция для нахождения пересечения круга с отрезком (AS3).
public static function Line2Circle( x1, y1, x2, y2, x3, y3, r )
{
var k, b, d, d1, d2, xx, yy;
var rx1, ry1, rx2, ry2;
var res:Object = new Object();
res.b_intersect1 = true;
res.b_intersect2 = true;
//сдвигаем все на координаты круга
x1 -= x3;
y1 -= y3;
x2 -= x3;
y2 -= y3;
//если первый отрезок вертикальный
if (int(x1) == int(x2))
{
d = r * r - x1 * x1;
if (d < 0)
res = 0;
else
{
ry1 = Math.sqrt(d);
ry2 = -ry1;
res.x1 = x1 + x3;
res.y1 = ry1 + y3;
res.x2 = x2 + x3;
res.y2 = ry2 + y3;
}
}
else
{
//параметры первого отрезка
k = (y1 - y2) / (x1 - x2);
b = y1 - k * x1;
d = k * k * b * b - (k * k + 1) * (b * b - r * r);
if (d < 0)
res = 0;
else
{
d = Math.sqrt(d);
rx1 = (-k * b + d) / (k * k + 1);
rx2 = (-k * b - d) / (k * k + 1);
ry1 = k * rx1 + b;
ry2 = k * rx2 + b;
res.x1 = rx1 + x3;
res.y1 = ry1 + y3;
res.x2 = rx2 + x3;
res.y2 = ry2 + y3;
}
}
x1 += x3;
y1 += y3;
x2 += x3;
y2 += y3;
//осталось отсортировать по близости к (x1, y1)
if (res)
{
d1 = (res.x1 - x1) * (res.x1 - x1) + (res.y1 - y1) * (res.y1 - y1);
d2 = (res.x2 - x1) * (res.x2 - x1) + (res.y2 - y1) * (res.y2 - y1);
if (d2 < d1)
{
rx1 = res.x1;
res.x1 = res.x2;
res.x2 = rx1;
ry1 = res.y1;
res.y1 = res.y2;
res.y2 = ry1;
}
}
//и еще нужно проверить что попадаем в отрезок
if (res)
{
if (x1 > x2)
{
xx = x1;
x1 = x2;
x2 = xx;
}
if (y1 > y2)
{
yy = y1;
y1 = y2;
y2 = yy;
}
if (res.x1 < x1 || res.x1 > x2 || res.y1 < y1 || res.y1 > y2)
{
res.x1 = 0;
res.y1 = 0;
res.b_intersect1 = false;
}
if (res.x2 < x1 || res.x2 > x2 || res.y2 < y1 || res.y2 > y2)
{
res.x2 = 0;
res.y2 = 0;
res.b_intersect2 = false;
}
}
return res;
}
- +3
- Vogd
Комментарии (0)