65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (24投票s)

2002 年 2 月 25 日

1分钟阅读

viewsIcon

194736

downloadIcon

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;

这就是所有的奥秘。 包含一个简单的项目来演示它。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.