假设我有一个bool [] [],我想将它旋转37度.我知道转型并不总是完美的,那没关系.我已经准备好了很多类似于我的问题的答案,但我发现的唯一解决方案只能解决90度增量的问题.
最好的方法是遍历目标位置,并为每个位置读取正确的源位置.如果你尝试相反的方式(即在源上循环并在目的地上书写),你最终会有差距.
旋转公式很简单......
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则生成的图像将围绕中心旋转和缩放.
还要注意的是,公式双线性在x和y; 这意味着你可以使用完整的公式为完整的价值为行的第一个像素,然后就做src_x += c,并src_y -= s在同一行中的每个元素,因为这是由移动时会发生什么x来x+1.
另请注意,根据源和目标大小,计算的源元素可能不可用,因为图像外.在这种情况下,有几种常用选项
false)