Код AS3:
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
public class Main extends Sprite
{
private var pX:Array = [200, 300, 250, 150, 100];
private var pY:Array = [100, 200, 300, 300, 200];
private var totalLen:Number=0;
private var totalPos:Number = 0;
private var step:Number = 2;
public function Main():void
{
var m:Shape = new Shape();
addChild(m);
for (var i:int = 0; i < pX.length; i++)
{
// маркер точки
m.graphics.beginFill(0x808080);
m.graphics.drawCircle(pX[i], pY[i], 6);
// сумма всех длин
var j:int = (i + 1) % pX.length;
totalLen += new Line(pX[i], pY[i], pX[j], pY[j]).length;
}
this.addEventListener(Event.ENTER_FRAME, this_enterFrame);
}
private function this_enterFrame(e:Event):void
{
// шаг по общей длине
totalPos += step;
totalPos %= totalLen;
var prevLen:Number = 0;
var curLen:Number = 0;
var line:Line;
var lineLen:Number;
// Ищем текущий отрезок
for (var i:int = 0; i < pX.length; i++)
{
var j:int = (i + 1) % pX.length;
line = new Line(pX[i], pY[i], pX[j], pY[j]);
lineLen = line.length;
prevLen = curLen;
curLen += lineLen;
if (curLen > totalPos) break;
}
// точка на текущем отрезке
var posOnLine:Number = (totalPos - prevLen) / lineLen;
var tP:Point = line.getPos(posOnLine);
graphics.clear();
graphics.lineStyle(2);
graphics.moveTo(pX[0], pY[0]);
graphics.lineTo(tP.x, tP.y);
}
}
}
import flash.geom.Point;
class Line
{
public var x1:Number;
public var x2:Number;
public var y1:Number;
public var y2:Number;
public var length:Number;
public function Line(x1:Number,y1:Number,x2:Number,y2:Number )
{
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
var dX:Number = x2 - x1;
var dY:Number = y2 - y1;
length = Math.sqrt(dX * dX + dY * dY);
}
public function getPos(t:Number):Point
{
var tX:Number = x1 + t * (x2 - x1);
var tY:Number = y1 + t * (y2 - y1);
return new Point(tX, tY);
}
}