《海龟画图学习.pptx》由会员分享,可在线阅读,更多相关《海龟画图学习.pptx(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、海龟画图海龟画图1建立海龟画图项目2基本命令3循环与基本图形第1页/共58页一、建立海龟画图项目一、建立海龟画图项目文件-新建-项目第2页/共58页一、建立海龟画图项目一、建立海龟画图项目选择“C语言程序设计”选项卡中的“C语言-海龟作图”注意填写项目名称第3页/共58页一、建立海龟画图项目一、建立海龟画图项目选择项目文件(.dev文件)的保存位置最好将每个项目的文件放在单独的目录中可使用该按钮创建新目录第4页/共58页一、建立海龟画图项目一、建立海龟画图项目项目向导会自动为项目生成一个可以运行的demo程序。直接在该程序基础上进行修改即可。第5页/共58页一、建立海龟画图项目一、建立海龟画图
2、项目注意:打开已有项目时,要打开项目文件(.dev文件)第6页/共58页二、基本命令二、基本命令海龟作图(TurtleGraphics)的基本思想是这样的:屏幕上有一只小海龟,我们可以给它下命令在屏幕上爬行海龟爬行的时候,会在屏幕上留下痕迹,从而产生图形。第7页/共58页二、基本命令二、基本命令程序初始化和控制相关:initWorld(width,height);设置绘图窗口大小为width*heightsetSpeed(x);设置海龟的爬行速度,1为最慢,1000为最快setImmediate(x);设置是否显示动画。0为显示,1为不显示。缺省为显示动画pause();程序等待用户按任意键s
3、etRewind(x);设置海龟爬到屏幕边缘时是否自动回绕。0为自动回绕,1为不自动回绕。缺省为自动回绕第8页/共58页二、基本命令二、基本命令海龟运动相关:fd(x);forward(x);向前爬行x个像素(x可以为小数)bk(x);backward(x);向后爬行x个像素lt(degree);leftTurn(degree);海龟向左转degree度(degree可以为小数)rt(double);rightTurn(degree);海龟向右转degree度home();海龟返回起始点(屏幕正中央)void cs();void clear();void clearScreen();海龟返回起
4、始点,同时清除屏幕上的所有痕迹第9页/共58页二、基本命令二、基本命令画笔相关:void penUp();void pu();抬笔,此时海龟爬行不留痕迹void pd();void penDown();落笔,此时海龟爬行留痕迹void setPenColor(color_t color);设置画笔的颜色常用颜色常量:BLACK黑色BLUE蓝色GREEN绿色CYAN青色RED红色MAGENTA紫色BROWN棕色LIGHTGRAY浅灰色DARKGRAY深灰色LIGHTBLUE浅蓝色LIGHTGREEN浅绿色LIGHTCYAN浅青色LIGHTRED浅红色LIGHTMAGENTA浅紫色YELLOW黄色
5、WHITE白色第10页/共58页2.1 简单示例简单示例forward(100);rightTurn(90);forward(100);rightTurn(90);forward(100);rightTurn(90);forward(100);rightTurn(90);绘制正方形第11页/共58页正方形绘制正方形绘制for(i=1;i=4;i+)forward(100);rightTurn(90);绘制正方形(使用循环)第12页/共58页三角形绘制三角形绘制绘制三角形,思考:每次绘制完一条边后,海龟应该转多少度?应循环多少次?for(i=1;i=3;i+)forward(100);right
6、Turn(120);第13页/共58页三角形绘制三角形绘制思考(见下图):如果想绘制一个底边和窗口下沿平行的三角形,该怎么办?希望画完图后,海龟的头部还是指向正上方,该怎么办?rightTurn(30);for(i=1;i=3;i+)forward(100);rightTurn(120);leftTurn(30);第14页/共58页复合图形复合图形思考:想绘制如下的图形,该怎么办?第15页/共58页三、循环绘图三、循环绘图使用循环和多重循环,可以绘制出更多美丽的图案第16页/共58页3.1 美丽花样美丽花样forward(100);rightTurn(90);forward(100);righ
7、tTurn(90);forward(50);rightTurn(90);forward(50);rightTurn(90);forward(100);rightTurn(90);forward(25);rightTurn(90);forward(25);rightTurn(90);forward(50);第17页/共58页3.1 美丽花样美丽花样for(i=1;i=4;i+)forward(100);rightTurn(90);forward(100);rightTurn(90);forward(50);rightTurn(90);forward(50);rightTurn(90);forwa
8、rd(100);rightTurn(90);forward(25);rightTurn(90);forward(25);rightTurn(90);forward(50);循环4次第18页/共58页3.1 美丽花样美丽花样错开一点距离和角度,不断重复for(;)forward(100);rightTurn(90);forward(100);rightTurn(90);forward(50);rightTurn(90);forward(50);rightTurn(90);forward(100);rightTurn(90);forward(25);rightTurn(90);forward(25
9、);rightTurn(90);forward(50);rightTurn(10);forward(50);第19页/共58页3.2 多边形多边形我们知道,任意多边形都可以由一系列连续下面两条语句的组合来绘出:forwar(side);rightTurn(angle);因此,我们可以准备下面这段程序,只要改变参数变量n,side和angle的值,就能绘制出多种不同多变形来for(i=1;i=n;i+)forward(side);rightTurn(angle);第20页/共58页for(i=1;i=n;i+)forward(side);rightTurn(angle);side=100;ang
10、le=72;n=5;side=100;angle=144;n=5;side=100;angle=60;n=6;side=100;angle=108;n=10;第21页/共58页3.3 圆与正多边形圆与正多边形我们知道,任意凸多边形的内角和等于(边数-2)*180所以可以这样来画任意的n正多边形(边长为x):计算每个角的度数angle=(n-2)*180/n循环n次,每次:海龟前进x海龟右转180-angle度angle=(n-2)*180.0/n;for(i=1;i=n;i+)forward(x);rightTurn(180-angle);第22页/共58页3.3 圆与多边形圆与多边形正五边形
11、,边长为100正六边形,边长为100正八边形,边长为100第23页/共58页3.3 圆与多边形圆与多边形当n越来越大时,我们会发现多边形越来越接近圆形我们可以用正360边型来模拟圆形,也可以用同样的方法来绘制圆弧side=3;for(i=1;i=360;i+)forward(side);rightTurn(1);第24页/共58页3.3 圆与多边形圆与多边形用两个60度的圆弧组成一片叶子:for(i=1;i=60;i+)forward(2);rightTurn(1);rightTurn(120);for(i=1;i=60;i+)forward(2);rightTurn(1);/让海龟转回起始方
12、向rightTurn(120);第25页/共58页3.4 多重循环绘图多重循环绘图利用多重循环,我们可以在圆和多边形的基础上绘制出更复杂的图案for(j=1;j=6;j+)for(i=1;i=360;i+)forward(2);rightTurn(1);rightTurn(60);第26页/共58页3.4 多重循环绘图多重循环绘图for(j=1;j=6;j+)for(i=1;i=6;i+)forward(100);rightTurn(60);rightTurn(60);第27页/共58页3.4 多重循环绘图多重循环绘图for(j=1;j=8;j+)for(i=1;i=6;i+)forward(
13、100);rightTurn(60);rightTurn(45);第28页/共58页3.4 多重循环绘图多重循环绘图for(j=1;j=6;j+)for(i=1;i=60;i+)forward(3);rightTurn(1);rightTurn(120);for(i=1;i=60;i+)forward(3);rightTurn(1);rightTurn(120);rightTurn(60);第29页/共58页四、函数四、函数在上一章绘制的过程中,我们可以发现,复杂图形的绘制可以分解为若干个的简单图形的绘制。很多简单图形是类似的如果能够将简单图形的绘制步骤用一条语句代替,我们的绘制过程将更简洁在
14、C语言里,我们可以用函数来实现这一点第30页/共58页4.1 自定义函数自定义函数void arcl(double side,double degree)int i;for(i=1;i=degree;i+)forward(side);leftTurn(1);void arcr(double side,double degree)int i;for(i=1;i=degree;i+)forward(side);rightTurn(1);int main().我们在主程序前面定义两个绘制弧线的函数arcr和arcl第31页/共58页4.1 自定义函数自定义函数有了这两个自定义函数,我们就可以在主函数
15、中调用它们:arcr(2,90);arcl(2,90);第32页/共58页4.1 自定义函数自定义函数利用这些函数,我们可以绘制出更复杂的图形:void arcl(double side,double degree)void arcr(double side,double degree)int main()for(i=1;i=9;i+)arcr(1,360);rightTurn(40);第33页/共58页4.1 自定义函数自定义函数void arcl(double side,double degree)void arcr(double side,double degree)int main()
16、for(i=1;i=9;i+)for(j=1;j=2;j+)arcl(1,90);arcr(1,90);rightTurn(160);第34页/共58页4.2 重复曲线重复曲线void polyspi(int side,int angle,int inc)int s=side;while(1)forward(side);rightTurn(angle);side+=inc;int main().使用函数,我们可以使主函数更简洁,也便于调整程序的参数:第35页/共58页4.2 重复曲线重复曲线void polyspi(int side,int angle,int inc)int main()po
17、lyspi(0,95,5);第36页/共58页4.2 重复曲线重复曲线void polyspi(int side,int angle,int inc)int main()polyspi(0,90,5);第37页/共58页4.2 重复曲线重复曲线void polyspi(int side,int angle,int inc)int main()polyspi(0,120,5);第38页/共58页4.2 重复曲线重复曲线void polyspi(int side,int angle,int inc)int main()polyspi(0,117,5);第39页/共58页4.3 重复曲线重复曲线2v
18、oid inspi(int side,int angle,int inc)int s=side;while(1)forward(side);rightTurn(angle);angle+=inc;int main().我们来看看另外一种重复曲线:第40页/共58页4.3 重复重复曲线曲线2void inspi(int side,int angle,int inc)int main()inspi(15,0,7);第41页/共58页4.3 重复曲线重复曲线2void inspi(int side,int angle,int inc)int main()inspi(50,40,30);第42页/共5
19、8页4.3 重复曲线重复曲线2void inspi(int side,int angle,int inc)int main()inspi(50,2,20);第43页/共58页4.4 函数嵌套函数嵌套void subspiro(int side,int angle,int n)int i;for(i=1;i=n;i+)forward(side*i);rightTurn(angle);void spiro(int side,int angle,int n)while(1)subspiro(side,angle,n);int main()在自定义函数中也可以调用已经定义的其他函数,例:第44页/共5
20、8页4.4 函数嵌套函数嵌套void subspiro(int side,int angle,int n)void spiro(int side,int angle,int n)int main()spiro(30,90,10);第45页/共58页4.4 函数嵌套函数嵌套void subspiro(int side,int angle,int n)void spiro(int side,int angle,int n)int main()spiro(20,144,8);第46页/共58页4.4 函数嵌套函数嵌套void subspiro(int side,int angle,int n)voi
21、d spiro(int side,int angle,int n)int main()spiro(20,60,10);第47页/共58页五、递归作图五、递归作图既然在函数内能调用其他函数,那么当然也可以调用自己。这就形成了递归。第48页/共58页5.1 斯宾斯基三角形斯宾斯基三角形void nest_tri(double size)int i;if(size5)return;for(i=1;i=3;i+)nest_tri(size/2);forward(size);rightTurn(120);int main()nest_tri(200);第49页/共58页5.2 hilbert曲线曲线vo
22、id hilbert(double size,int level,int parity)if(level=0)return;leftTurn(parity*90);hilbert(size,level-1,-parity);forward(size);rightTurn(parity*90);hilbert(size,level-1,parity);forward(size);hilbert(size,level-1,parity);rightTurn(parity*90);forward(size);hilbert(size,level-1,-parity);leftTurn(parity*
23、90);int main()hilbert(5,5,1);第50页/共58页5.3 间接递间接递归归除了直接自己调用自己形成递归外,也可以通过多个函数的相互调用形成间接的递归。在编写间接递归函数时要注意,需要提供函数的前置声明。例如:void cor_poly_step(double size,double angle);void cor_poly(double size,int angle)int totalturn=0;if(size10)return;do cor_poly_step(size,angle);totalturn+=angle;while(totalturn%360!=0)
24、;void cor_poly_step(double size,double angle)forward(size);cor_poly(size/2,-angle);rightTurn(angle);int main()第51页/共58页5.3 间接递归间接递归void cor_poly_step(double size,double angle);void cor_poly(double size,int angle)void cor_poly_step(double size,double angle)int main()cor_poly(100,90);第52页/共58页5.3 间接递归
25、间接递归void cor_poly_step(double size,double angle);void cor_poly(double size,int angle)void cor_poly_step(double size,double angle)int main()cor_poly(100,120);第53页/共58页5.3 间接递归间接递归void cor_poly_step(double size,double angle);void cor_poly(double size,int angle)void cor_poly_step(double size,double ang
26、le)int main()cor_poly(50,60);第54页/共58页5.3 间接递归间接递归void cor_poly_step(double size,double angle);void cor_poly(double size,int angle)void cor_poly_step(double size,double angle)int main()cor_poly(50,144);第55页/共58页课后练习(不强制要求)课后练习(不强制要求)二、使用arcl和arcr函数,绘制下面的图形一、使用海龟函数,绘制一个带门、窗和烟囱的小房子第56页/共58页参考书目参考书目Turtle Geometry.Harold Abelson,Andrea A.diSessa.The MIT Press.1980第57页/共58页感谢您的观看。感谢您的观看。第58页/共58页