仿射变换生成玫瑰花结

这几天学了仿射变换, 我们之前的乌龟程序是共形变换, 就是有点相似三角形一样。而仿射变换 是一种新的变换, 他有四种变换组成的 :

平移(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);
            }
        }


生成的图片如下:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值