附加实验1 Sierpinski三角形

1.实验目的:
理解掌握一个OpenGL绘制图形的完整程序结构。

2.实验内容:

(1) 运行示范实验代码,掌握程序结构与每一个语句含义;

(2) 了解分形图形的生成特点,并能将其扩展、举一反三。

3.实验原理:

    Sierpinski三角形是一种分形图形,它是递归地构造的。最常见的构造方法如下图所示:把一个三角形分成四等份,挖掉中间那一份,然后继续对另外三个三角形进行这样的操作,并且无限地递归下去。每一次迭代后整个图形的面积都会减小到原来的3/4,因此最终得到的图形面积显然为0。这也就是说,Sierpinski三角形其实是一条曲线。

图1

大概在下图上标注了一下一个三角形迭代过程:

图2

生成Sierpinski 三角形算法描述,如图1所示:

(1)从一个三角形开始;

(2)连接三边的中点并去掉中间的三角形;

(3)重复上述过程;

4.示范代码:

#include <GL/glut.h> // a point data type typedef GLfloat point2d[2]; //initial triangle point2d v[3] = {{-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15}}; int n; // number of recursive steps

// display one triangle void triangle( point2d a, point2d b, point2d c) {     glBegin(GL_TRIANGLES);     glVertex2fv(a);     glVertex2fv(b);        glVertex2fv(c);     glEnd(); }

// triangle subdivision using vertex numbers void divide_triangle(point2d a, point2d b, point2d c, int m) {     point2d v0, v1, v2;     int j;     if(m>0) {         for(j=0; j<2; j++) v0[j]=(a[j]+b[j])/2;         for(j=0; j<2; j++) v1[j]=(a[j]+c[j])/2;         for(j=0; j<2; j++) v2[j]=(b[j]+c[j])/2;         divide_triangle(a, v0, v1, m-1);         divide_triangle(c, v1, v2, m-1);         divide_triangle(b, v2, v0, m-1);     }     else(triangle(a,b,c));// draw triangle at end of recursion }

void mydisplay(void) {     glClear(GL_COLOR_BUFFER_BIT);     divide_triangle(v[0], v[1], v[2], n);     glFlush(); }

void init() {     glClearColor(1.0, 1.0, 1.0,1.0);     glColor3f(0.0,0.0,0.0);     glMatrixMode(GL_PROJECTION);     glLoadIdentity();     glOrtho(-2.0, 2.0, -2.0, 2.0, -1.0, 1.0); }

void main(int argc, char **argv) {     n=1;     glutInit(&argc, argv);     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);     glutInitWindowSize(500, 500);     glutInitWindowPosition(50,50);     glutCreateWindow("2D Sierpinski");     glutDisplayFunc(mydisplay);     init();     glutMainLoop(); }

4. 实验作业:

请参考上述代码实现Koch曲线或Koch雪花的生成。

Koch曲线:

Koch雪花:

可参考如下资料:

(1).http://hi.baidu.com/zotin/item/f67aaadb9411934edcf9be6e;

(2).http://blog.csdn.net/fyzhao/article/details/1487639;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

02:奇数单增序列 个人博客doubleq.win

 个人博客doubleq.win 02:奇数单增序列 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个长度为N(不...

3288
来自专栏达摩兵的技术空间

js实现万级数字转汉字显示

完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五。

1532
来自专栏bboysoul

1167: C语言实验题――分数序列

描述:有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。 输入:输入只有一个正整数n,1≤n≤10。 ...

923
来自专栏上善若水

002计算机图形学之直线画线算法

主要思想是,由于我们在缓存区上画点,全部是整数。那么在画线的时候,当斜率k小于1的时候,下一个点是取(x+1,y+1)还是(x+1,y)取决于点(x+1,y+0...

2242
来自专栏null的专栏

TensorFlow入门——Softmax Regression

下面的代码是利用TensorFlow实现的Softmax Regression的基本过程: ''' @author:zhaozhiyong @date:2017...

2775
来自专栏chenjx85的技术专栏

leetcode-54-螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

1164
来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触 第三章:聚类

前一章节中介绍的线性回归是一种监督学习算法,我们使用数据与输出值(标签)来建立模型拟合它们。但是我们并不总是有已经打标签的数据,却仍然想去分析它们。这种情况下,...

4196
来自专栏WeaponZhi

使用Octave来学习Machine Learning(二)

前言 上一篇我们介绍了 Octave 的一些基本情况,大家对 Octave 应该已经有了一个基本的了解,我相信看这篇文章的朋友已经在自己的电脑中安装好 Ocat...

3506
来自专栏数据结构与算法

洛谷P2503 [HAOI2006]均分数据(模拟退火)

1850
来自专栏小鹏的专栏

02 The TensorFlow Way(1)

The TensorFlow Way Introduction:          现在我们介绍了TensorFlow如何创建张量,使用变量和占位符,我们将介...

20910

扫码关注云+社区