已知矩形的长宽,用MFC将二维矩形图形在同一平面进行缩放、平移、旋转三种状态的图形的代码
时间: 2024-03-19 14:43:06 浏览: 109
以下是一个MFC二维矩形图形进行缩放、平移、旋转的示例代码:
首先,在你的MFC应用程序中创建一个矩形类,例如:
```cpp
class CRectangle
{
public:
CRectangle(CPoint ptTopLeft, CPoint ptBottomRight);
void Draw(CDC* pDC);
void Translate(int dx, int dy);
void Scale(float sx, float sy);
void Rotate(float angle);
private:
CPoint m_ptTopLeft;
CPoint m_ptBottomRight;
};
```
在这个类中,我们定义了一个构造函数来初始化矩形的左上角和右下角坐标。Draw函数用于在设备上下文中绘制矩形。Translate函数用于平移矩形,Scale函数用于缩放矩形,Rotate函数用于旋转矩形。
接下来,我们来实现这些函数:
```cpp
CRectangle::CRectangle(CPoint ptTopLeft, CPoint ptBottomRight)
: m_ptTopLeft(ptTopLeft), m_ptBottomRight(ptBottomRight)
{
}
void CRectangle::Draw(CDC* pDC)
{
pDC->Rectangle(m_ptTopLeft.x, m_ptTopLeft.y, m_ptBottomRight.x, m_ptBottomRight.y);
}
void CRectangle::Translate(int dx, int dy)
{
m_ptTopLeft.Offset(dx, dy);
m_ptBottomRight.Offset(dx, dy);
}
void CRectangle::Scale(float sx, float sy)
{
CPoint ptCenter((m_ptTopLeft.x + m_ptBottomRight.x) / 2,
(m_ptTopLeft.y + m_ptBottomRight.y) / 2);
m_ptTopLeft.x = (int)(sx * (m_ptTopLeft.x - ptCenter.x) + ptCenter.x + 0.5);
m_ptTopLeft.y = (int)(sy * (m_ptTopLeft.y - ptCenter.y) + ptCenter.y + 0.5);
m_ptBottomRight.x = (int)(sx * (m_ptBottomRight.x - ptCenter.x) + ptCenter.x + 0.5);
m_ptBottomRight.y = (int)(sy * (m_ptBottomRight.y - ptCenter.y) + ptCenter.y + 0.5);
}
void CRectangle::Rotate(float angle)
{
CPoint ptCenter((m_ptTopLeft.x + m_ptBottomRight.x) / 2,
(m_ptTopLeft.y + m_ptBottomRight.y) / 2);
float sina = sin(angle);
float cosa = cos(angle);
int x = m_ptTopLeft.x - ptCenter.x;
int y = m_ptTopLeft.y - ptCenter.y;
m_ptTopLeft.x = (int)(x * cosa - y * sina + ptCenter.x + 0.5);
m_ptTopLeft.y = (int)(x * sina + y * cosa + ptCenter.y + 0.5);
x = m_ptBottomRight.x - ptCenter.x;
y = m_ptBottomRight.y - ptCenter.y;
m_ptBottomRight.x = (int)(x * cosa - y * sina + ptCenter.x + 0.5);
m_ptBottomRight.y = (int)(x * sina + y * cosa + ptCenter.y + 0.5);
}
```
Translate函数使用Offset函数来平移矩形。Scale函数需要计算矩形的中心点,然后按比例缩放矩形。Rotate函数也需要计算矩形的中心点,并使用正弦和余弦函数来旋转矩形。
在你的MFC应用程序中,你可以使用以下代码来创建并操作矩形:
```cpp
CRectangle rect(CPoint(100, 100), CPoint(200, 200));
rect.Draw(pDC);
rect.Translate(50, 50);
rect.Draw(pDC);
rect.Scale(1.5, 1.5);
rect.Draw(pDC);
rect.Rotate(30 * 3.1415926 / 180);
rect.Draw(pDC);
```
这会创建一个位于(100, 100)和(200, 200)之间的矩形,并在设备上下文中绘制它。然后,它将矩形向右下平移50个单位,并重新绘制它。接下来,它将矩形按比例放大1.5倍,并重新绘制它。最后,它将矩形顺时针旋转30度,并重新绘制它。
阅读全文