2011-06-01 46 views
0

全部,如何重现对象的平移,旋转,缩放? (可能语言不可知)

我有一个相当令人沮丧的问题,我认为很简单,但我的大脑不工作。总之,问题是:给出一个sprite/image/thingy,你知道有人已经旋转/翻译/缩放了精灵,但是你不知道这些发生的顺序,你怎么能够重现确切的图像?

为了便于说明 - 由于图像是这样的: Given an image like this

有人具有旋转/平移/缩放它,使它看起来像这样(它看起来像什么操作之后的能力---有两家他们在这种情况下...) What it looks like after manipulation

的我知道order of operations matter,那就是如果有人先旋转,然后缩放,然后转换,你会得到不同的图像比,如果你是做相反。问题是,由于事先不知道订单,所以我很难再现这个形象。以下是我得到:

enter image description here

这里是什么样子重叠,给你的,那我就走多远的想法:

http://infinitetaco.com/pics/merged.png

我设置的anchorPoints精灵在中心,所以这不是问题。我也考虑了缩放更改的宽度/高度,但由于某些原因,它总是有点偏离。看起来旋转量越剧烈,我的结果越差。在正确的图像中,你可以看到结果是完美的,但是左边的结果是很好的,因为它有很大的旋转,所以它是离开的。

我知道这可能是一个容易的,但我会感谢一些帮助。

回答

1

如果你仅限于affine transformations(旋转,平移,缩放),那么一些线性代数可以给你变换矩阵。您需要精灵(x,y)的原始边界框和精灵(u,v)的转换边界框。首先通过将已转换坐标的中心移动到原始坐标的中心来删除任何平移。现在求解下面的公式 - 你有4个未知数和4个方程,所以只需要做一些代数来找到a,b,c和d。

[x1 x2 x3 x4; y1 y2 y3 y4] = [a b; c d] * [u1 u2 u3 u4; V1 V2 V3 V4]

对于仿射变换,A,B,C,D按照此结构:

[SX * COS(THETA)SY * SIN(THETA); -sx * sin(theta)sy * cos(theta)]

因此,您可以将其缩小为缩放(sx,sy),旋转(theta),并且您已经计算了转换。

有可能更快的方法来做到这一点,但这种方法遵循第一原则。

0

解决!有很多愚蠢的小事我做错了,但主要的错误是,我计算旋转中心的方式是基于左上角而不是中心!

相关问题