几个简单分形图形的C语言实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
F
D
G ( 图 2.3 )
C (x , y ) 2 2
设 F0 的两个对角点 A 和 C 的坐标分别为 ( x1 , y1 ) 和 ( x2 , y2 ) , 可求得正方形中心点 K 的坐标 ( x3 , y3 ) 是 x3
x1 x2 y y , y3 1 2 。 2 2
则图 2.3 中其余各点的坐标用 A、C、K 三点的坐标表示出来就是:
关键词:分形;生成元;迭代
一、
相关概念
生成元: 分形图形的构造方式都有一个共同的特点,即最终的图形F都是按照 一定的规则R,通过对初始图形F0不断修改得到的.例如下面分形(一)中的Koch 曲线的修改规则R是将每一条直线段F0(如图1.1)用一条折线F1(如图1.2)替代, 我们称F1为该分形的生成元.再例如下面分形(二)中图2.2是Sierpinski三角形 的生成元,分形(三)中图3.2是桧树分形小枝的生成元。
} else { /*如果迭代次数等于 1,停止迭代,画出迭代生成的图形*/ /*用直线联结两点 E ( x3 , y1 ) 和 G( x3 , y2 ) */ /*用直线联结两点 H ( x1 , y3 ) 和 F ( x2 , y3 ) */ /*用直线联结两点 B( x2 , y1 ) 和 C ( x2 , y2 ) */ /*用直线联结两点 C ( x2 , y2 ) 和 D( x1 , y2 ) */ /*用直线联结两点 D( x1 , y2 ) 和 H ( x1 , y3 ) */ /*用直线联结两点 E ( x3 , y1 ) 和 B( x2 , y1 ) */
几个简单分形图形的 C 语言实现
Implementing Several Simple Fractal Images Using C Language
摘要
分形几何是研究无限复杂但具有一定意义的自相似图形和结构的几
何学。分形在自然科学的诸多领域如数学、物理、化学、材料科学、生命科学、 地质、地理、天文、计算机乃至经济、社会、艺术等极其广泛的领域有着重大的 应用。可以毫不夸张地说“分形是大自然的几何学”,“分形处处可见”。本文 详细介绍了三个简单分形图形的具体生成过程,并给出了详细的 C 语言程序, 通过阅读程序可以从中总结出一般的规律性的东西, 即此类分形图形的一般的生 成过程。 从文中我们也可以看出, 即使十分简单的图形, 在通过多次的迭代以后, 也可以生成非常复杂而漂亮的图形,而这也正是分形的魅力所在。
sin 600 cos 600 0
x4
y4 1 x3
y3
0 1 0 0 0 0 1 0 1 x y2 1 2
1.3. 程序设计过程 (一) 迭代过程函数
void
koch(double x0, double y0, double x1, double y1, int k) /* 给出直线 F0 的两个端点坐标(x0,y0)和(x1,y1),并且定义迭代次数为 k 次*/
位正方形左上角顶点坐标 ( x1 , y1 ) 和右下角顶 点坐标 ( x2 , y2 ) ,并且定义迭代次数为 k 次*/
{
double x3, y3; x3=(x1+x2)/2.0; y3=(y1+y2)/2.0; if( k>1) {
/*定义图 2.3 中点 K 的坐标(x3,y3)*/ /*点 K(x3,y3)的坐标的计算式*/
{ int n, gdriver=DETECT, gmode; initgraph(&gdriver, &gmode,””);
/*定义迭代次数 n*/ /*图形系统初始化*/
printf(”Please input the value of the positive integer n (n<9):”); scanf(“%d”, &n); setcolor(GREEN); koch(50, 120, 450, 120, n); getch(); closegraph(); } 1.4. 生成图形显示 /*关闭图形系统*/ /*输入迭代次数 n*/ /*设置 koch 曲线的颜色为绿色*/ /*画 koch 曲线*/
koch(x0, y0, x2, y2, k-1); /*对以(x0, y0)和(x2, y2)为端点的线段作为 初始线段进行迭代运算,以下类同*/ koch(x2, y2, x4, y4, k-1); koch(x4, y4, x3, y3, k-1); koch(x3, y3, x1, y1, k-1); }
图 1.4 迭代三次后生成的 Koch 曲线
图 1.5 迭代五次后生成的 Koch 曲线
ຫໍສະໝຸດ Baidu
分形(二)
Sierpinski 三角形
2.1. 绘制 Sierpinski 三角形的生成元 Sierpinski 三角形有许多种生成方式, 当然也就有不止一种生成元, 在这里我 们只介绍其中的一种非常简单的生成元。 首先绘制单位正方形 F0, 然后分别用直线联结正方形两组对边中点得到四个
桧树分形小枝
同 Koch 曲线生成元的构造类似,桧树分形小枝生成元的构造也是通过一定 的规则对单位长线段 F0 进行修改变换而得到。具体变换规则如下: 如下图 3.2 所示,桧树分形小枝的生成元由五条长度相等的线段组成,设每 条线段长度为 r,第一条线段 AC 和最后一条线段 EB 与水平线的夹角相等,都 是 100 ,且 AC 左端点 A 与 F0 左端点重合,EB 右端点 B 与 F0 右端点重合,CD 与 CE 成 600 角,EF 与 EB 成 600 角。
{
double x2, y2, x3, y3, x4, y4; x2=2.0/3*x0+1.0/3*x1;
/*定义图 1.3 中其余三点的坐标*/ /*由上面的运算可以得到其余三点 坐标的计算式*/
y2=2.0/3*y0+1.0/3*y1; x3=1.0/3*x0+2.0/3*x1; y3=1.0/3*y0+2.0/3*y1; x4=1.0/2*(x0+x1)-sqrt(3.0)/6*(y1-y0); y4=1.0/2*(y0+y1)+sqrt(3.0)/6*(x1-x0); if( k>1) { /*如果迭代次数大于 1,就继续迭代下去,即执行以下程序*/
line(x3, y1, x3, y2); line(x1, y3, x2, y3); line(x2, y1, x2, y2); line(x2, y2, x1, y2); line(x1, y2, x1, y3); line(x3, y1, x2, y1);
} } (二) 主函数及头文件 #include”graphics.h” #include”stdio.h” main() { int n, gdriver=DETECT, gmode; initgraph(&gdriver, &gmode,””); /*定义迭代次数 n*/ /*图形系统初始化*/ /*添加绘图函数头文件*/
printf(”Please input the value of the positive integer n (n<9):”);
scanf(“%d”, &n); setcolor(GREEN); sierpinski(20, 20, 470, 470, n); getch(); closegraph(); } 2.4. 生成图形显示
/*如果迭代次数大于 1,就继续迭代下去,即执行以下程序*/
sierpinski(x3, y1, x2, y3, k-1); /*对以 E ( x3 , y1 ) 和 F ( x2 , y3 ) 为对角顶点 的正方形作为初始图形进行迭代运算*/ sierpinski(x1, y3, x3, y2, k-1); /*对以 H ( x1 , y3 ) 和 G( x3 , y2 ) 为对角顶点 的正方形作为初始图形进行迭代运算*/ sierpinski(x3, y3, x2, y2, k-1); /*对以 K ( x3 , y3 ) 和 C ( x2 , y2 ) 为对角顶点 的正方形作为初始图形进行迭代运算*/
x2
y2 1 x1
y1
1 0 0 0 0 1 3 1 0 0 0 1 0 1 0 1 0 1 0 0 3 x y 1 0 1 x y 1 0 0 0 0 0
x3
y3 1 x1
完全一样的小正方形,再去掉左上部分的小正方形,则其余的三个小正方形就构 成了 Sierpinski 三角形的生成元 F1。 具体生成过程如下图 2.1 和图 2.2 所示:
F0 F1
( 图 2.1 )
( 图 2.2 )
2.2. 确定生成元上关键点的坐标
( x1 , y1 )
A
E
B
H
K
( x3 , y3 )
else {
/*如果迭代次数等于 1,停止迭代,画出迭代生成的图形*/ /*用直线联结两点(x0, y0)和(x2, y2)*/ /*用直线联结两点(x2, y2)和(x4, y4)*/ /*用直线联结两点(x4, y4)和(x3, y3)*/ /*用直线联结两点(x3, y3)和(x1, y1)*/
B( x2 , y1 ) , D( x1 , y2 ) , E ( x3 , y1 ) , F ( x2 , y3 ) , G( x3 , y2 ) , H ( x1 , y3 )
2.3. 程序设计过程 (一) 迭代过程函数 void sierpinski(double x1, double y1, double x2, double y2, int k) /*给出单
如图 3.1 和图 3.2 所示:
F1 F0
F
A C D
E
B
( 图 3.1 )
( 图 3.2 )
3.2. 确定生成元上关键点的坐标
BAC EBA 100 DCE FEB 600
/*输入迭代次数 n*/ /*设置 sierpinski 三角形颜色为绿色*/ /*画 sierpinski 三角形*/
/*关闭图形系统*/
图 2.4 迭代四次后生成的 Sierpinski 三角形
图 2.5 迭代六次后生成的 Sierpinski 三角形
分形(三)
3.1. 绘制桧树分形小枝的生成元
line(x0, y0, x2, y2); line(x2, y2, x4, y4); line(x4, y4, x3, y3); line(x3, y3, x1, y1); }
} (二) 主函数及头文件 #include”graphics.h” #include”math.h” #include”stdio.h” main() /*添加绘图函数头文件*/ /*添加数学函数头文件*/
二、
图形的绘制及程序的实现
分形(一)
1.1. 绘制 Koch 曲线的生成元
Koch 曲线
Koch 曲线的生成元的构造:首先将单位长度的直线段 F0 三等分,然后再以 中间的一段为一条边作一个等边三角形,再去掉等边三角形与 F0 重合的部分,
最后等边三角形剩余的部分与 F0 剩余的部分共同构成了 Koch 曲线的生成元 F1。 具体构造过程如图 1.1 和图 1.2 所示:
F1 F0
( 图 1.1 )
( 图 1.2 )
1.2. 确定生成元上关键点的坐标
( x4 , y4 )
( x0 , y0 )
( x2 , y2 )
( 图 1.3 )
( x3 , y3 )
( x1 , y1 )
设 F0 的两端点坐标分别为 ( x0 , y0 ) 和 ( x1 , y1 ) ,则利用坐标的平移与旋转变换关系 可以求得图 1.3 中其余各点的坐标:
y1
2 0 0 0 0 1 3 1 0 0 2 1 0 1 0 0 0 0 1 0 3 1 x0 y0 1 0 x0 y0 1 0
0 0 0 cos 60 1 sin 600 1 0 1 0 x2 y2 1 0