如何在Matrix类中使用转换表?

时间:2011-08-02 20:47:31

标签: actionscript-3

如果可能,我怎么能使用我的问题在Flash中的Actionscript 3中接受的答案here中提供的转换表?我知道它可能与Matrix有关,但我真的不知道答案中提供的转换是否可以在那里实现。是吗?如果是这样的话?

1 个答案:

答案 0 :(得分:0)

好的,让我们从你的变换开始Matrix(我稍微调整一下看起来更好 - 这就是最后两个值的作用)。

private var gridTransform:Matrix = new Matrix(28, -14, 28, 14, 0, 14);

现在,如果您创建一个UIComponent,则可以使用此矩阵绘制网格:

var grid:UIComponent = new UIComponent();

grid.graphics.beginFill(0xff0000, 0);
grid.graphics.lineStyle(2, 0x888888);

for (var u:int = 0; u < 20; u++)
{
    for (var v:int = 0; v < 20; v++)
    {
        grid.graphics.moveTo(getX(u,v), getY(u,v));
        grid.graphics.lineTo(getX(u+1,v), getY(u+1,v));
        grid.graphics.lineTo(getX(u+1,v+1), getY(u+1,v+1));
        grid.graphics.lineTo(getX(u,v+1), getY(u,v+1));
    }
}
grid.graphics.endFill();

使用辅助函数:

private function getX(u:Number, v:Number):Number
{
  return gridTransform.transformPoint(new Point(u,v)).x;
}

private function getY(u:Number, v:Number):Number
{
  return gridTransform.transformPoint(new Point(u,v)).y;
}

注意: 我知道绘图方法是多余的,但我也是这样做的,因此填充允许网格之间的区域注册点击事件。有更好的方法可以做到这一点,但这不是重点。

在UIComponent上绘制网格后,您可以将其添加到显示列表中:

addChild(grid);

(我正在使用Flex4,所以我使用addElement(grid);

为了说明如何将鼠标事件映射回(u,v)坐标,请向grid添加事件监听器:

grid.addEventListener(MouseEvent.CLICK, grid_clickHandler);

我们有:

private function grid_clickHandler(event:MouseEvent):void
{
    trace("Local coordinates: (" + event.localX + "," + event.localY + ")");
    var inverted:Matrix = gridTransform.clone();
    inverted.invert();
    trace("U-V Coordinates: " + inverted.transformPoint(new Point(event.localX,event.localY)));

}

如果您只想让U-V坐标包含整数,可以使用Math.ceil()Math.floor()或类似的东西。