旋转Koch雪花的绘制(MFC)

Koch雪花简介

  • Koch雪花的实际结构为三条Koch曲线的拼接,这三条Koch曲线分别构成正三角形的三条边即可。因此在绘制Koch曲线的设计思想为首先绘制一条线段,,假设线段长度为L,则在线段L//3处至2L/3处以L/3为边长做一个正三角形,并去掉底边。
  • 设计中的难点在于每条线段的端点坐标比较难确定,根据已知的初始线段两个端点坐标,通过几何三角计算出每次迭代的端点坐标并进行递归即可。

在这里插入图片描述

Koch雪花绘制

  • Koch曲线是一条没有切线的连续曲线,是著名的分形曲线具有自相似性。Koch曲线递归的次数越多周长越长,递归下去之后形状近似一朵雪花,雪花的周长是无穷的,但是面积是有限的,并且处处连续处处不可导。
  • 生成规则:取一段长度为𝐿_0的直线段,将其三等分,保留两端的线段,将中间一段改成夹角为60°的两段𝐿_0 /3等长直线;将长度为𝐿_0/3的四段直线分别3等分,并将他们中间的一段改成夹角为60°的两段𝐿_0/9等长直线。以此类推,便可以得到具有自相似性结构的折线,称为Koch曲线。

在这里插入图片描述

绘制Koch曲线:

  • 1、根据起点和终点的坐标确定线段长度
  • 2、根据线段长度得到递归N次后每段线段长度
  • 3、得到曲线的初始角度
  • 4、递归完成Koch曲线的绘制
    • (1)退出的条件是递归次数为0,此时绘制的为直线
    • (2)第二条直线的角度为α+θ,递归次数-1
    • (3)第三条直线的角度为α-2θ,递归次数-1
    • (4)第四条直线的角度为α+θ,递归次数-1

在这里插入图片描述

关键代码

双缓冲

  • 双缓冲机制是一种基本的动画机制,主要解决单缓冲擦除图像时所带来的屏幕闪烁问题,双缓冲是在一个屏幕设备上下文和一个内存设备上下文。首先创建一个与屏幕设备上下文兼容的内存设备上下文,使用绘图命令将一帧图像绘制到内存设备上下文中,然后在定时器的控制作用下,每隔一段时间调用BitBlt()函数将内存设备上下文中的图像一次性地复制到屏幕设备上下文中实现平滑、无闪烁动画的效果。

在这里插入图片描述

绘制Koch曲线

  • 这个就是绘制Koch曲线的函数,通过初始点和终止点的坐标来计算线段的长度,并且得到曲线的角度,通过参数angle和递归次数n递归地完成曲线的绘制。由一条线段产生的四条线段,有n条线段迭代一次后将产生4n条线段。算法针对每一条线段逐步进行,将进行计算三个新的点,第一个点位于位于线段的三分之一处,第三点位于线段的三分之二处,第二点位于线段以第一个点为轴心,将第一和第三点形成的向量正向旋转60度而得。
    在这里插入图片描述

确定位置

  • 因为绘制Koch曲线的函数使用初始点和终止点的X,Y位置来进行控制的,所以我可以为初始点和终止点添加一些变量来实现雪花的移动,在这里我添加了变量RotateAngle和DownY,在OnTimer()中对变量进行改变来实现雪花旋转并且向下移动达到模拟雪花下落的过程。同时对雪花的中心进行绘制并且跟随雪花的运动而进行同步的运动,使其可以进行边旋转边下降。
    在这里插入图片描述

最终效果

绘制的雪花可以旋转着从屏幕的顶端落下,运动到屏幕可见范围之后会再次从屏幕顶端出现,以此来模拟雪花的下落过程。作者仅仅实现了雪花旋转着落下,读者们可以发挥自己的才能使其在旋转的基础上添加左右飘动的效果来进一步完善此功能。
在这里插入图片描述

致谢总结

如果以上内容有什么问题,欢迎大家批评指教,感谢大家提出宝贵的意见。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值