这几天学了仿射变换, 我们之前的乌龟程序是共形变换, 就是有点相似三角形一样。而仿射变换 是一种新的变换, 他有四种变换组成的 :
平移(Translation), 旋转(Rotation), 伸缩(Scale), 扭曲(Skew)。 大家可以在这里看一下: http://msdn.microsoft.com/en-us/library/windows/desktop/dd756655(v=vs.85).aspx . 当然我是参考《计算机图形学和几何造型导论》的 第四章 仿射变换 , 里面有相应的数学,大家可以看看,有高中的数学基本上就可以看懂的。
然后我参考http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd370994(v=vs.85).aspx 创建了一个工程。 然后在有关绘制图形的函数里面,实现了一个玫瑰花结的绘制:
代码如下:
D2D1_SIZE_F size = m_pRenderTarget->GetSize();
//中心点
D2D1_POINT_2F Center = D2D1::Point2F(size.width/2, size.height/2);
//以中心点为支点的一条边的另一头端点。
D2D1_POINT_2F Peak = D2D1::Point2F(size.width / 2 + 200, size.height / 2);
const int num = 20;
D2D1_POINT_2F Peaks[num];
//生成一个以中心点为圆心, 均匀分布在圆上的20个点。
for (int i = 0; i != num; ++i)
{
//得到一个以中心点旋转变换的矩阵
D2D1::Matrix3x2F Temp = D2D1::Matrix3x2F::Rotation(i * 360/num, Center);
//对顶点利用矩阵进行变换,得到另一个点。
Peaks[i] = Temp.TransformPoint(Peak);
}
//把每一个点和其他的点用直线连接。
for (int i = 0; i != num-1; ++i)
{
for (int j = i + 1; j != num; ++j)
{
m_pRenderTarget->DrawLine(Peaks[i], Peaks[j], m_pCornflowerBlueBrush);
}
}
生成的图片如下: