PDA

Просмотр полной версии : Вращение прямой вокруг своей оси с изменением длинны


bayar
20.01.2016, 05:07
Здравствуйте, друзья подскажите как можно реализовать такое вращение?

ALeXVoz
20.01.2016, 13:00
Невидимая точка (мувик) движется по нижним точкам с нужной скоростью твинером. между верхней и невидимой точкой по энтерфрейму рисуется линия. каждый последующий шаг - удалить старую линию (очистить graphics) и нарисовать новую линию уже в новое положение невидимой точки. самый простой алгоритм. а круговое движение делается изменением свойства rotation.
поищите примеры стрелочных часов, как там сделаны движения стрелок

silin
20.01.2016, 15:51
pointTween.swf
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);

}

}

bayar
20.01.2016, 18:10
Спасибо, silin. То что нужно. Еще один вопрос, если вместо спрайта будет использоваться мувик, то алгоритм не меняется?

silin
20.01.2016, 20:31
Нет конечно, алгоритму это никак не навредит :)