Поворот точки из заданного центра в Flex - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь повернуть точку на моем холсте из заданной точки (центра). В моем обработчике MouseDown я сохраняю точку, в которой пользователь щелкает (oldPos), а в моем обработчике MouseMove я делаю это:

private function onMouseMove(event:MouseEvent):void
{
   // Where the user pointer right now
   var endPoint:Point = new Point(event.localX,event.localY);

   // Calculate angle in radians from the user pointer
   var angle:Number = getLineAngleFromHorizontal(oldPos,endPoint);
   var rad:Number = Math.PI * (angle / 180);

   // Point which I want to rotate
   pTop = new Point(oldPos.x,oldPos.y - 30);
   var distance:Number = Point.distance(oldPos,pTop);

   // Calculate the translation point from previously distance and angle
   var translatePoint:Point = Point.polar(distance, rad);

   // New point coordinates (in theory)
   pTop.x += translatePoint.x;
   pTop.y += translatePoint.y;

   // Then, draw the line...
}

Где getLineAngleFromHorizontal - это функция, которая возвращает угол, образованный центром и заданной точкой:

private function getLineAngleFromHorizontal(p1:Point,p2:Point):Number
{
   var RotVecOrigen:Point = new Point((p2.x-p1.x),(p2.y-p1.y));
   var ModRot:Number = Math.sqrt((RotVecOrigen.x*RotVecOrigen.x)+(RotVecOrigen.y*RotVecOrigen.y));
   var ret:Number;
   if(((RotVecOrigen.x < 0) && (RotVecOrigen.y <= 0))||((RotVecOrigen.x >= 0) && (RotVecOrigen.y < 0)))
   {
    ret = Math.round((180.0*(Math.acos(RotVecOrigen.x/ModRot))/Math.PI));
   }else{
    ret = Math.round((180.0*(-Math.acos(RotVecOrigen.x/ModRot))/Math.PI));
   }
   return ret;
}

Чтобы увидеть пример, посмотрите изображение ниже:

example

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

Кто-нибудь может мне помочь? (может быть, кто-то со знанием математики)

1 Ответ

0 голосов
/ 31 января 2012

Я не совсем уверен, чего вы хотите достичь. Вы хотите, чтобы ваша новая точка была на 330 градусов смещена от вашей центральной точки?

Если вы хотите переместить свою точку на 330 градусов, используйте это:

    function directionalDistance($start:Point, $direction:Number, $distance:Number, $zeroDegreesUp:Boolean = false):Point{          

        if($zeroDegreesUp) $direction = ( $direction + 270)%360;

        var x:Number = Math.cos($direction * Math.PI / 180) * $distance;
        var y:Number = Math.sin($direction * Math.PI / 180) * $distance;

        return new Point($start.x +x, $start.y + y);
    }

      //
      var newPoint:Point = directionalDistance(new Point(event.localX,event.localY), 330, 50, true); 
...