二维数组到任意的程度?

假设我有一个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缩放它们两个,所得图像将围绕中心旋转和缩放。

还要注意,公式在xy是双线性的; 这意味着您可以使用完整公式计算行的第一个像素的完整值,然后对同一行的每个元素执行src_x += csrc_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

    上一篇: dimensional array to an arbitrary degree?

    下一篇: Transform a triangle to another triangle