如何将二维数组旋转到任意程度?

cor*_*ory 0 c# arrays math

假设我有一个bool [] [],我想将它旋转37度.我知道转型并不总是完美的,那没关系.我已经准备好了很多类似于我的问题的答案,但我发现的唯一解决方案只能解决90度增量的问题.

650*_*502 7

最好的方法是遍历目标位置,并为每个位置读取正确的源位置.如果你尝试相反的方式(即在源上循环并在目的地上书写),你最终会有差距.

旋转公式很简单......

source_x = dest_x * c + dest_y * s + x0
source_y = dest_x * -s + dest_y * c + y0
Run Code Online (Sandbox Code Playgroud)

c角度的余弦在哪里,是角度s的正弦,x0, y0用于正确平移旋转的图像.在psedudocode

for y = 0, 1, ... dest_height
    for x = 0, 1, ... dest_width
        src_x = c*x + s*y + x0
        src_y = -s*x + c*y + y0
        copy from source[src_y][src_x] to dest[y][x]
Run Code Online (Sandbox Code Playgroud)

x0, y0 可以计算,以便源中心最终在目的地中心

 x0 = src_width/2 - c*dest_width/2 - s*dest_height/2
 y0 = src_height/2 - c*dest_height/2 + s*dest_width/2
Run Code Online (Sandbox Code Playgroud)

如果不是仅仅使用c = cos(angle)并使用s = sin(angle)因子缩放它们,k则生成的图像将围绕中心旋转和缩放.

还要注意的是,公式双线性在xy; 这意味着你可以使用完整的公式为完整的价值为行的第一个像素,然后就做src_x += c,并src_y -= s在同一行中的每个元素,因为这是由移动时会发生什么xx+1.

另请注意,根据源和目标大小,计算的源元素可能不可用,因为图像外.在这种情况下,有几种常用选项

  1. 写一个固定值(例如false)
  2. 不要写那个目标单元格
  3. 进行"夹紧",将坐标限制在读数前允许的最大值
  4. 通过使用模运算符对坐标进行标准化来进行"平铺"