Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как отследить пересечение линий (http://www.flasher.ru/forum/showthread.php?t=186735)

vivado 07.11.2012 18:04

Как отследить пересечение линий
 
Вложений: 1
Всем привет,
Есть код который вытаскивает из библиотеки копии мувика MC и рандомом размещает их на сцене соединяя линиями. Мувики можно таскать мышкой. Как мне отследить пересечение линий которыми соеденены эти мувики?

Код AS3:

import flash.geom.Rectangle;
 
var vsego_muvikov:Number = 4; //Количество окружностей/линий
var lines:Sprite = new Sprite();
 
this.addEventListener(MouseEvent.MOUSE_MOVE, drawLine);
 
for (var i:uint = 0; i < vsego_muvikov; i++) {
 
        var muvik:MC = new MC();
        this.addChild(muvik);
 
        muvik.buttonMode = true;
        muvik.name = "muvik" + i;
        muvik.x=50+Math.random() * 300;
        muvik.y=50+Math.random() * 200;
        trace (muvik.name+"x= "+muvik.x+", y= "+muvik.y);
 
        muvik.addEventListener(MouseEvent.MOUSE_DOWN, muvik_mouseDown);
        muvik.addEventListener(MouseEvent.MOUSE_UP, muvik_mouseUp);
}
 
 
function muvik_mouseDown(event:MouseEvent){
        event.target.startDrag(false,new Rectangle(50,50,500,300));
}
function muvik_mouseUp(event:MouseEvent){
        event.target.stopDrag();
}
 
function drawLine(event:MouseEvent):void {
 
        lines.graphics.clear();                        //Очищаем поле от нарисованых линий
        lines.graphics.lineStyle(1, 0x000000);
        for (var i:uint = 0; i < vsego_muvikov; i++) {
 
                var dispObjCurr:DisplayObject = this.getChildByName("muvik" + i);
                var dispObjNext:DisplayObject = this.getChildByName("muvik" + (i+1));
                if (i == (vsego_muvikov-1)) dispObjNext = this.getChildByName("muvik0");
 
                lines.graphics.moveTo(dispObjCurr.x, dispObjCurr.y);
                lines.graphics.lineTo(dispObjNext.x, dispObjNext.y);
 
                this.addChild(lines);                //Отрисовывае линии
                //this.addChildAt(lines,0);        //Помещаем линии на самый низ
        }
}

По сути в центре каждого мувика эти линии уже пересекаются изначально.

spirit2 07.11.2012 18:19

точка пересечения двух отрезков

wvxvw 08.11.2012 04:13

А нужны именно координаты точки, или только факт пересечения? Последнее легче посчитать, если что.

Alex Lexcuk 08.11.2012 13:05

c c++ я уже переводил.
http://www.murmadillo.tut.su/html/li...Intersect.html
Сначала определеяется могут ли линии пересекаться, а потом если могут и если надо ищется точка пересечения.

vivado 08.11.2012 14:50

Мне нужен именно факт пересечения, координаты точки пересечения не важны.
Но как я писал ранее получается, что линии уже изначально пересекаются (см. рис слева) поэтому по HitTest не знаю как отследить. Может что посоветуете?

Alex Lexcuk наверное это то, что надо, но не могу разобраться как применить это к моему коду - я недавно AS 3.0 изучать начал еще нифига не знаю как это все использовать.

expl 08.11.2012 16:04

Цитата:

Мне нужен именно факт пересечения, координаты точки пересечения не важны.
Недавно узнал забавный способ определить факт пересечения _отрезков_
1. По точкам получаем 2 уравнения для 2-х прямых в канонической форме: Ax + By + C = 0;
2. Подставляем 2 точки от одного отрезка в уравнение прямой другого отрезка. Если результаты Ax + By + C имеют разные знаки - значит точки лежат по разную сторону прямой
3. Проделываем это сравнение для других 2-х точкек и второго уравнения прямой - если тоже разные знаки - значит есть пересечение.
Цитата:

Но как я писал ранее получается, что линии уже изначально пересекаются (см. рис слева) поэтому по HitTest не знаю как отследить. Может что посоветуете?
HitTest здесь вряд ли поможет.
"Боюсь нам нужно использовать...
Математику."

wvxvw 08.11.2012 17:58

Цитата:

Но как я писал ранее получается, что линии уже изначально пересекаются
Ну так вам же известно пересечение каких линий превратит фигуру в "сложный" многоугольник. Вам нужно попарно проверять (если у вас четырехугольник) противоположные стороны на пересечение. В таком случае пересекаются ли смежные стороны - для вас не имеет значения.


Часовой пояс GMT +4, время: 03:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.