Как узнать точки в линии, заданные начальной и конечной точками для пересечения линии: любая формула?
Я использую 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, чем решать его математически.
Вот ссылка: