如何旋转二维字节数组?

时间:2016-02-19 16:42:31

标签: math matrix rotation

我需要以任意角度(0~359)在二维方格字节矩阵中旋转数据

我的矩阵由16x16字节的正方形组成,如下所示:

[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00]
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00]
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00]
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00]
[00][00][00][00][00][00][7F][7F][7F][7F][7F][7F][7F][7F][00][00]
[00][00][00][00][00][00][00][00][7F][7F][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]
[00][00][00][00][00][00][00][00][00][00][00][00][00][00][00][00]

此矩阵表示游戏中项目的碰撞图。矩阵中的数字表示游戏世界中每个位置的高度,用于确定与游戏中其他对象的碰撞。

我需要能够旋转这个碰撞图(矩阵数据),因为游戏中的对象可以旋转。

有谁知道我怎么能做到这一点?

非常感谢!

1 个答案:

答案 0 :(得分:2)

您需要一个函数f(x,y),可以将碰撞图中的坐标x,y旋转一个角度theta。 有了它,你可以

  1. 计算在theta旋转时碰撞图的元素移动的位置(例如(0,0)在顺时针旋转90度后移动到(15,0),或
  2. 您可以通过旋转θ度来计算哪个元素已移动到某个位置。在这种情况下,您将翻转theta的符号以反转方向。
  3. 要创建旋转地图,您将执行#2。创建一个相同大小的第二个地图,然后遍历其所有元素,并用未旋转的地图中的相应元素替换每个元素。通过将元素的坐标输入函数f(x,y)来获得相应元素的坐标。

    现在适用于f(x,y):此功能可以通过组合3 affine transformations matrices来构建,它将围绕碰撞图的中心旋转坐标。
    我应该稍后解释一下: - )

    这些等式为您提供与坐标(x',y')对应的元素的坐标(x,y)

    x' =  c * x + s * y - a * (1 - c - s)
    y' = -s * x + c * y - a * (1 - c + s)
    

    ,其中

    c = cos(-theta)
    s = sin(-theta)
    a = +0.5 - 0.5 * N
    N = side length of your square collision map (i.e. 16)
    theta = angle of clockwise rotation
            (but effectively counter-clockwise for the way that you
             usually visualize arrays, i.e. y-axis pointing downwards)
    

    所以f(x,y)是返回x'y'的函数。

    在进行这些浮点计算之后,您需要将结果坐标(x',y')正确舍入到最接近的整数值。当那些圆角坐标位于数组之外时,则不存在相应的元素,您应该使用0作为该元素的值(或者表示水平地形或无碰撞的任何值)。

    将坐标舍入为整数会给出 nearest-neighbor interpolation 另一个选项是bilinear interpolation,您可以平均最接近小数坐标的4个元素的值。 (示例:对于2.4, 5.7,您要对2,52,63,53,6处的元素值进行平均。)