Как узнать точки в линии, заданные начальной и конечной точками для пересечения линии: любая формула?

Я использую AS3. Но не важно, на каком языке я использую. Я просто нахожу логику о том, как решить эту проблему.

Я закончил создание линии, рисуя с графическим классом, учитывая начальную и конечную точки линии. Теперь я снова рисую круг. Я хочу, чтобы этот круг пересек линию.

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

Например.. (0,0) и (20,20)

Я могу пересечь линию, назначив значения объекта этим...

object.x = 5;
object.y = 5;
object.x = 10;
object.y = 10;
and so on and so forth..

Я хочу, чтобы окружность моего объекта двигалась взад и вперед от начальной к конечной точке, а затем снова возвращалась к начальной точке, пересекая линию.

Любая формула, вы можете помочь мне с этим? Я попытался вычесть и добавить наклон, чтобы пересечь линию, но это работает только тогда, когда наклон положительный.

Примечание: во вспышке система координат отличается от обычной декартовой плоскости. Четвертый квадрант все положительный.

Вот моя текущая логика:

var speed:int = 10;

function makeItMove(packetNumber:int):void{
        var xcenter:int = xCenterPt[packetNumber];
        var ycenter:int = yCenterPt[packetNumber];
        var xfirst:int = xFirstPt[packetNumber];
        var yfirst:int = yFirstPt[packetNumber];
        var xsecond:int = xSecondPt[packetNumber];
        var ysecond:int = ySecondPt[packetNumber];
        var switchPath:Boolean = switchPathArr[packetNumber];
        var slope:int = 0;

        if((xsecond-xfirst) != 0){
            slope = ((ysecond - yfirst)/(xsecond - xfirst)) * speed;
        }

        if(slope<0){
            //slope = ((ysecond - yfirst)/(xsecond - xfirst)) * speed;
            slope = slope * -1;
        }
        //else if(slope)

        //trace("PacketNumber: "+packetNumber+", xcenter: "+xcenter+", ycenter: "+ycenter+", xfirst: "+xfirst+", yfirst: "+yfirst+", xsecond: "+xsecond+", ysecond: "+ysecond)
        if(xcenter <= xfirst && ycenter <= yfirst){
            switchPath = true;
            switchPathArr[packetNumber] = switchPath;
        }

        if(xcenter >= xsecond && ycenter >= ysecond){
            switchPath = false;
            switchPathArr[packetNumber] = switchPath;
        }

        if(switchPath){
            xcenter = xcenter+slope;
            ycenter = ycenter+slope;
            xCenterPt[packetNumber] = xcenter;
            yCenterPt[packetNumber] = ycenter;
            //trace("UP: xcenter = " + xcenter + ", ycenter = " + ycenter);
            this[mc_Packets[packetNumber]].x = xcenter;
            this[mc_Packets[packetNumber]].y = ycenter;
        }
        else{
            xcenter = xcenter-slope;
            ycenter = ycenter-slope;
            xCenterPt[packetNumber] = xcenter;
            yCenterPt[packetNumber] = ycenter;
            //trace("DOWN: xcenter = " + xcenter + ", ycenter = " + ycenter);
            this[mc_Packets[packetNumber]].x = xcenter;
            this[mc_Packets[packetNumber]].y = ycenter;
        }
    }

2 ответа

Я бы использовал вектор. При этом вы можете создать вектор направления из двух векторов положения. Значит вычесть два вектора. Начальная точка VectorA и конечная точка VectorB.

Затем вы меняете значение длины, и координаты вектора x и y изменятся соответственно.

проверьте этот класс в качестве примера:

http://code.google.com/p/as3ufw/source/browse/trunk/src/core/as3ufw/geom/Vector2D.as?r=93

это также полезно: http://emweb.unl.edu/math/mathweb/vectors/vectors.html

сначала прочтите это, прежде чем попробовать класс:)

Лучше использовать tweenLike API, чем решать его математически.

Вот ссылка:

http://www.greensock.com/tweenlite/

Другие вопросы по тегам