Пересечение Отрезка с Отрезком

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

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

0
Еще один вариант:


public static function lineIntersect(
        a1x:Number, a1y:Number, 
        a2x:Number, a2y:Number, 
        b1x:Number, b1y:Number, 
        b2x:Number, b2y:Number
):Object {
        
        var res:Object = new Object();
        res.intersect = -1;
        res.point = new Point();
        
        var d:Number = (a1x - a2x) * (b2y - b1y) - (a1y - a2y) * (b2x - b1x); 
        var da:Number = (a1x - b1x) * (b2y - b1y) - (a1y - b1y) * (b2x - b1x);
        var db:Number = (a1x - a2x) * (a1y - b1y) - (a1y - a2y) * (a1x - b1x);
        
        if (Math.abs(d) < 0.000001) {
                res.intersect = 0;
        } else {
                var ta:Number = da / d;
                var tb:Number = db / d;
                if ((0 <= ta) && (ta <= 1) && (0 <= tb) && (tb <= 1)) {
                        res.intersect = 1;
                        res.point.x = a1x + ta * (a2x - a1x);
                        res.point.y = a1y + ta * (a2y - a1y);
                } 
        }
        
        return res;
        
}


Если значение intersect у возвращаемого обьекта равно 1 — линии пересекаются, если -1 не пересекаются. Если равно 0 — линии параллельны.

В случае пересечения координату точки пересечения можно взять из point возвращаемого обьекта.
+2
— И руки!
— Что руки?
— Руки оторвать… за отсутствие типизации.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.