使用 SetWorldTransform() 以任意角度旋转基本形状






4.59/5 (24投票s)
2002 年 2 月 25 日
1分钟阅读

194736

5581
如何使用 SetWorldTransform() 以任意角度旋转基本形状
引言
MFC 提供了许多函数来绘制基本形状,例如矩形、椭圆、多边形等。这很简单。 此外,在进行一些数学计算后,很容易绘制一个旋转 45 度的矩形。 但是,如果我们想将这些形状旋转到一个奇怪的角度,比如 11 度呢? 或者我们想将一个椭圆旋转 37 度呢?
使用 SetWorldTransform()
可以让你摆脱所有的数学计算。
详细说明
首先,让我们回顾一下旋转的定义:旋转执行几何变换,它将输入图像中一个像素的位置 (x1, y1) 映射到输出图像中的位置 (x2, y2),绕着原点 (x0, y0) 旋转用户指定的角度 q。
公式如下
x2 = cos(q)*(x1-x0) – sin(q)*(y1-y0) + x0;
y2 = sin(q)*(x1-x0) + cos(q)*(y1-y0) + y0; // ------ (1)
其中 (x0, y0) 是旋转中心的坐标(在输入图像中),q 是旋转角度,顺时针旋转具有正角度。
请注意,我们正在处理图像坐标,因此 y 轴向下。 牢记上述公式,让我们检查一下 SetWorldTransform()
能够为我们做什么。
根据 MSDN 的说法,使用 SetWorldTransform()
,对于世界空间中的任何坐标 (x, y),变换后的页面空间坐标 (x', y') 可以通过以下算法确定
x’ = x * eM11 + y * eM12 + eDx;
y’ = x * eM12 + y * eM22 + eDy; // ------ (2)
比较这两组公式,我们可以得到参数 xform
的正确值
xform.eM11 = cos(q);
xform.eM12 = sin(q);
xform.eM21 = -sin(q);
xform.eM22 = cos(q);
xform.eDx = x0 – cos(q)*x0 + sin(q)*y0;
xform.eDy = y0 – cos(q)*y0 - sin(q)*x0;
这就是所有的奥秘。 包含一个简单的项目来演示它。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。