Пересечение Круга с Отрезком.

Пожалуй, буду использовать этот блог для разных полезностей, которые и самому могут потом пригодиться.

Функция для нахождения пересечения круга с отрезком (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

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.