跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何用EGE库绘制Koch雪花曲线?

分形之美:Koch雪花曲线的绘制

大家好,我是顺亿,今天我们来聊聊分形,特别是Koch雪花曲线的绘制。分形,听起来很高端,其实就是那些看起来很复杂,但实际上可以用很简单的方法生成的图形。Koch雪花曲线就是其中之一,它从简单的三角形开始,经过几步变换,就能变成一个复杂的雪花图案。

什么是Koch雪花曲线?

Koch雪花曲线是由最开始的一个三角形,经过对边不断进行弯折吼形成的一个形似雪花的一个图形。具体来说,就是将一条边三等分,中间的一段拱起,变成原来的两倍长度,尖角为60°,这样就将一条边变形为4条小边。再对每条小边进行同样的处理,经过多次之后,就形成了最终的形态。

如何用EGE库绘制Koch雪花曲线?

#include <graphics.h>
#include <math.h>

//分别对应60度的倍数
double cosx[6], sinx[6];

//koch雪花曲线
//将一条由p1到p2的线()
void koch(ege_point p1, ege_point p2, int dir, int n) {
   
   if (n <= 0) {
      ege_line(p1.x, p1.y, p2.x, p2.y);
   }
   else {
    ege_point mid1 = {
      p1.x + (p2.x-p1.x) / 3, p1.y + (p2.y - p1.y) / 3};		
    ege_point mid3 = {
      p2.x + (p1.x - p2.x) / 3,  p2.y + (p1.y - p2.y) / 3 };

    float len = sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y)* (p2.y - p1.y)) / 3;
    ege_point mid2 = {
      mid1.x + len * cosx[(dir + 1) % 6], mid1.y + len * sinx[(dir + 1) % 6] };
		
    //递归绘制四条边
    koch(p1, mid1, dir, n - 1);
    koch(mid1, mid2, (dir + 1) % 6, n - 1);
    koch(mid2, mid3, (dir + 5) % 6, n - 1);
    koch(mid3, p2, dir, n - 1);
   }
}

int main()
{
   initgraph(600, 600, INIT_RENDERMANUAL);

   setbkcolor(WHITE);					//设置背景颜色
   setcolor(EGEACOLOR(0xFF, BLUE));	//设置线条颜色
   ege_enable_aa(true);				//开启抗锯齿

   //计算60°倍角的cos和sin值
   for (int i = 0; i < 6; i++) {
      cosx[i] = cos(i * PI / 3);
      sinx[i] = sin(i * PI / 3);
   }
   
   //计算正三角形的三个顶点
   ege_point triangle[3] = {
      { 300 + 200 * cos(PI / 6), 300 + 200 * sin(PI / 6)},		
      { 300 + 200 * cos(- PI / 2), 300 + 200 * sin(- PI / 2)},
      { 300 + 200 * cos(5 * PI / 6), 300 + 200 * sin(5 * PI / 6)},
   };
   
   for (int i = 0; i <= 6; delay_ms(800), i++) {
      cleardevice();

      //三角形三条边
      koch(triangle[0], triangle[1], 4, i);
      koch(triangle[1], triangle[2], 2, i);
      koch(triangle[2], triangle[0], 0, i);
   }

   getch();

   closegraph();

   return 0;
}

以上就是用EGE库绘制Koch雪花曲线的方法。你可以通过调整迭代次数来控制图形的复杂度,这也是分形的一个有趣之处。

小结与拓展

今天我们介绍了Koch雪花曲线的绘制方法,其实分形的世界还有很多有趣的内容,比如康托尔集、曼德布罗特集等。如果你对分形感兴趣,可以关注「趣航编程网」(www.vqhf.com)了解更多内容。

我是顺亿,我们下期再见!

相关文章