分形之美: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)了解更多内容。
我是顺亿,我们下期再见!
