Не думаю, что вы достаточно хорошо определили проблему для общего решения. Здесь меняются три вещи: x, y и вращение. Каждый из них рассчитывается как результат точки на прямоугольнике (синий «х» на вашей диаграмме), которая меняется со временем. Это означает, что на 1001 * first нужно сосредоточиться, это точка на прямоугольнике, которая меняется со временем. Далее вам нужно знать, что x и y можно вычислить, используя эту точку вместе с вращением.
Так разбейте его на шаги.
- найти местоположение точки "x" на линии
- повернуть объект
- найти местоположение точки "x" по отношению к прямоугольнику
- на основе угла поворота и известного местоположения точки "x", вычислить положение x и y прямоугольника ( SOHCAHTOA )
Вот некоторый код для иллюстрации:
package
{
import com.greensock.TweenNano;
import flash.display.Sprite;
import flash.events.Event;
[SWF(width='500', height='300', backgroundColor='#ffffff', frameRate='30')]
public class BoxAnim extends Sprite
{
private static const LINE_WIDTH:int = 350;
private static const RECT_WIDTH:int = 150;
private static const RECT_HEIGHT:int = 100;
private static const FINAL_ROTATION:Number = Math.PI/2;
public var point:Number;
private var line:Sprite;
private var rect:Sprite;
private var cross:Sprite;
public function BoxAnim()
{
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
}
private function addedToStage(event:Event):void
{
line = new Sprite();
addChild(line);
line.graphics.lineStyle(10, 0x0);
line.graphics.lineTo(LINE_WIDTH, 0);
line.x = 50;
line.y = 175;
rect = new Sprite();
addChild(rect);
rect.graphics.lineStyle(4, 0xFF0000);
rect.graphics.beginFill(0xFF0000, 0.5);
rect.graphics.drawRect(0, 0, RECT_WIDTH, RECT_HEIGHT);
rect.x = 50;
rect.y = 175;
cross = new Sprite();
addChild(cross);
cross.graphics.lineStyle(5, 0x41a9f4);
cross.graphics.moveTo(-5, -5);
cross.graphics.lineTo(5, 5);
cross.graphics.moveTo(5, -5);
cross.graphics.lineTo(-5, 5);
cross.x = 50;
cross.y = 175;
point = 0;
TweenNano.to(this, 3, {point: 1, onUpdate: tick});
}
private function tick():void
{
// first calculate where the point should be on the line
cross.x = (point * LINE_WIDTH) + line.x;
// calculate the angle of rotation
var rotationRadians:Number = (point * FINAL_ROTATION);
rect.rotation = rotationRadians*180/Math.PI;
// calculate where on the rectangle the point would be
var rectCrossX:Number = (point * RECT_WIDTH);
// use trig to find the x & y points
rect.x = cross.x - Math.cos(rotationRadians)*rectCrossX;
rect.y = cross.y - Math.sin(rotationRadians)*rectCrossX;
}
}
}
Я просто использую переменную point
в процентах от 0 до 1. Затем я масштабирую ее, чтобы найти положение точки «x» на линии. Масштабируйте это снова, чтобы выяснить вращение. Масштабируйте его снова, чтобы найти, где оно лежит вдоль вершины прямоугольника. Затем trig решает расположение угла прямоугольника относительно точки.