烧饼的技术乱讲
这篇文章来源于Standford Univ.的CS148课程的第一周Assignment,作业内容是要求用基本的OpenGL的图元绘制知识来创作一些有趣的图形。 一、Knoch Snowflake介绍 我选择的是绘制鼎鼎有名的Koch Snowflake,它是最早有描述的分形图像之一,因为形状类似雪花且每一边都是基于Koch Curve而得名。从本质上来说,Koch Curve的构建可以用优美的递归形式来描述: 一条线段平均分成三段, 基于中间那条线段的位置绘制一个等边三角形,并且指向线段的外侧, 移除该条线段 而Koch Curve正是通过有限次地不断重复以上三步所得到的曲线,下图展示了递归0-4次时的曲线: Iteration 0: Iteration 1: Iteration 2: Iteration 3: Iteration 4: …… 二、绘制Koch Snowflake 那么应该如何利用OpenGL的基本图元(Primitives)来绘制呢?一开始的时候我设想的是根据预期的迭代次数,找到一个通用公式,从而计算出对应的顶点坐标,然后再用GL_LINE将它们连接起来即可,但是找到这么一个公式比较困难。突然我想到了小时候玩的logo语言,利用代码控制屏幕中小乌龟的位移,它走过的地方就画出一条线,基于Koch曲线如此优美的递归定义,用这种一笔画的方式来绘制,就会非常方便。为了采用这种方法,我们需要定义下列两个绘制函数: draw_line用于从当前位置绘制一条长度为length的线段 turn将改变当前画笔的方向angle_in_degrees个角度,根据图形学的惯例,逆时针(counterclockwise)方向为正 这两个方法的实现将会在下文简述 C++语言: 绘制函数 // drawing functions void draw_line(double length); void turn(int angle_in_degrees); 有了绘制函数和Koch曲线的递归定义,要画出它来就非常简单了: C++语言: 绘制Koch Snowflake void koch_curve(unsigned order, double length) { [...]
I'm now a graduate student of Computer Applied Technology in Tongji University. I like Computer Graphics, Web 2.0, Magic, Music and am partially a geek. This blog is about C++, algorithm, cg, comments and other things I may get in touch with in the near future. Hope everyone enjoy this little site. Contact me: 4everlove.xu AT gmail.com