再次陷入困境......我正在尝试调整底部的rotate()
代码,以便旋转是绝对的,即rotate(33)
将旋转到,而不是 那个度数。
我失败了。我的尝试如下。我想我可以在矩阵翻译后设置旋转,但什么都不做。试着阅读Matrices正在让我的头脑爆炸。我在这里缺少一件简单的事情吗?
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 :(得分: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。
如果我不得不猜测,我会说这是一个舍入/精度问题。
对不断增加的问题表示抱歉。