我需要以任意角度(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]
此矩阵表示游戏中项目的碰撞图。矩阵中的数字表示游戏世界中每个位置的高度,用于确定与游戏中其他对象的碰撞。
我需要能够旋转这个碰撞图(矩阵数据),因为游戏中的对象可以旋转。
有谁知道我怎么能做到这一点?
非常感谢!
答案 0 :(得分:2)
您需要一个函数f(x,y)
,可以将碰撞图中的坐标x,y
旋转一个角度theta
。
有了它,你可以
theta
旋转时碰撞图的元素移动的位置(例如(0,0)
在顺时针旋转90度后移动到(15,0)
,或theta
的符号以反转方向。要创建旋转地图,您将执行#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,5
,2,6
,3,5
和3,6
处的元素值进行平均。)