二维数组到任意的程度?
假设我有一个bool [] [],我想旋转它37度。 我知道转型并不总是完美的,没关系。 我已经在这里准备了很多类似于我的问题的答案,但我发现的唯一解决方案只能解决90度增量问题。
最好的方法是遍历目标位置,并为他们每个人阅读正确的源位置。 如果你尝试另一种方式(例如在源代码上循环并在目标文件上写),最终会产生差距。
旋转公式很简单...
source_x = dest_x * c + dest_y * s + x0
source_y = dest_x * -s + dest_y * c + y0
其中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]
可以计算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
如果不是仅使用c = cos(angle)
和s = sin(angle)
而是用因子k
缩放它们两个,所得图像将围绕中心旋转和缩放。
还要注意,公式在x
和y
是双线性的; 这意味着您可以使用完整公式计算行的第一个像素的完整值,然后对同一行的每个元素执行src_x += c
和src_y -= s
,因为这是从x
移动到x+1
。
还要注意,取决于源和目标大小,可能是因为在图像之外,计算出的源元素不可用。 在这种情况下,有几个常用的选项
false
) 其中x,y是您的笛卡尔坐标,R是您的旋转角度:
newx = x * cos(R) - y * sin(R)
newy = x * sin(R) + y * cos(R)
假设你正在旋转一个位图,我首先看看使用一个成像框架(例如System.Drawing)来实现你想要的。 说,拿你的布尔,把它变成一个1位的位图,绘制它旋转,并读出它。
如果这不是你想要的,你可以使用由wberry提供的旋转并应用到每个布尔,或者如果性能很贵,编写自己的纹理化矩形光栅化器。 要做后者,请查看一些关于如何纹理映射任意2D多边形的旧图形编程教科书。
链接地址: http://www.djcxy.com/p/50043.html