2014-12-15 3 views
2

Застрял снова ... Я пытаюсь адаптировать rotate() код в нижней части так, что вращение является абсолютным, т.е. rotate(33) вращается к этот угол не на, что число степеней.Абсолютное вращение с использованием матрицы?

И я терплю неудачу. Моя попытка ниже. Я думал, что смогу просто установить поворот после перевода матрицы, но ничего не делает. Попытка прочитать о Матрицах заставит мою голову взорваться. Простая вещь, которую я здесь отсутствует?

 public function myRotate(angle:Number):void 
     { 
      trace("angle", angle); 

      var m:Matrix = this.transform.matrix; 
      var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2); 
      var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y); 
      m.concat(cm); 

      // I thought I could apply the matrix to shift the reg point, 
      // set the absolute rotation 
      // then use that matrix for when it gets shifted back 
      // but it doesn't work. 

      this.transform.matrix = m; 
      this.rotation = angle; 
      m = this.transform.matrix; 

      //m.rotate(Math.PI * angle/180); 

      var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y); 
      m.concat(rcm); 
      this.transform.matrix = m; 
     } 

Этот код работает, но повороты относительны (т.е. нарастающим итогом).

 public function rotate(angle:Number):void 
     { 
      var m:Matrix = this.transform.matrix; 
      var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2); 
      var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y); 
      m.concat(cm); 

      m.rotate(Math.PI * angle/180); 

      var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y); 
      m.concat(rcm); 
      this.transform.matrix = m; 
     } 

     private function resetCenterPoint(obj:DisplayObject, orgX:Number, orgY:Number):Point 
     { 
      var m:Matrix = obj.transform.matrix; 
      var orgXY:Point = m.deltaTransformPoint(new Point(orgX, orgY)); 
      orgXY.x += m.tx; 
      orgXY.y += m.ty; 
      return orgXY; 
     } 
+0

Что делать, если вы превращаете относительную функцию в абсолютную, передавая ей значение «целевого угла» - «значение текущего угла»? Таким образом, функция абсолютного вращения является лишь оберткой для относительной. Я не уверен, что это должен быть комментарий или ответ. – null

+0

@null ... Да, я идиот (или предположительно математически-фобический или просто усталый). 'var newAngle: Number = angle - this.rotation;', кажется, вычисляет правильный относительный угол, основанный на указанном угле. Опубликуйте в качестве ответа, если вы хотите получить очки. –

ответ

0

Возможно изменение относительной функции в абсолютную, путем изменения аргумента.

вместо rotate(relativeAngle), можно назвать rotate(absoluteAngle - currentAngle)

Однако, есть проблемы в вашем коде. Я попробовал, и это не работает «отлично» для меня. У меня нет компилятора, и мне пришлось использовать wonderfl. Когда я запускаю код, я вижу, что форма «дрейфует» из положения. Кроме того, он вращается вокруг некоторой точки, но не средней/точки регистрации фигуры.

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    public class FlashTest extends Sprite { 
     public function FlashTest() { 
      // write as3 code here.. 

      var r:Rotator = new Rotator(); 
      addChild(r); 

      r.x = r.y = 200; 

      addEventListener(Event.ENTER_FRAME, function(e:Event):void{r.rotate(1)}); 
     } 
    } 
} 
import flash.display.Shape; 
import flash.display.DisplayObject; 

import flash.geom.Matrix; 
import flash.geom.Point; 

internal class Rotator extends Shape 
{ 
    public function Rotator() 
    { 
     graphics.beginFill(0xff00); 
     graphics.drawRect(-50, -100, 100, 200); 
     graphics.endFill(); 
    } 

    public function rotate(angle:Number):void 
     { 
      var m:Matrix = this.transform.matrix; 
      var aroundPoint:Point = resetCenterPoint(this, this.width/2, this.height/2); 
      var cm:Matrix = new Matrix(1, 0, 0, 1, -aroundPoint.x, -aroundPoint.y); 
      m.concat(cm); 

      m.rotate(Math.PI * angle/180); 

      var rcm:Matrix = new Matrix(1, 0, 0, 1, aroundPoint.x, aroundPoint.y); 
      m.concat(rcm); 
      this.transform.matrix = m; 
     } 

     private function resetCenterPoint(obj:DisplayObject, orgX:Number, orgY:Number):Point 
     { 
      var m:Matrix = obj.transform.matrix; 
      var orgXY:Point = m.deltaTransformPoint(new Point(orgX, orgY)); 
      orgXY.x += m.tx; 
      orgXY.y += m.ty; 
      return orgXY; 
     } 
} 

Так что что-то не так со всей перепозиционирующей частью кода. Это не имеет значения для данной проблемы, поскольку вращение по-прежнему правильное, и идея использования относительного/абсолютного позиционирования в качестве замены друг друга также должна оставаться верной.

Но я бы исследовал далее код и посмотрел, что происходит. Набрав здесь мой ответ, код примера был запущен, и теперь форма почти не отображается на экране. Он дрейфовал до 0/0.

Если бы я должен был догадаться, я бы сказал, что это проблема округления/точности.

Извините за распространенные проблемы.

+0

gee buddy ... большое спасибо, больше вопросов ;-) Да, я думаю, что там есть ошибки округления. Я спасу их на завтра! –

Смежные вопросы