Python中turtle的填充问题 |
您所在的位置:网站首页 › 封闭图形与不封闭图形 › Python中turtle的填充问题 |
down() left(30) circle(115,120) end_fill() done() 运行后发现,虽然画出了封闭曲线,但没有按照我们的思路填充一个弯月,而是填充了整个半圆(图2)。 (2)实例二(图3) #代码2 from turtle import* bgcolor("black") color("red","yellow") hideturtle() begin_fill() circle(100,180) right(30) circle(115,-120) end_fill() done() 修改上述代码,我们先从下方起点画到上方顶点后,直接从上方顶点画回到下方起点,中间没有抬笔过程。这样画出的也是一个封闭曲线,填充正常(图4)! 其实上两例中,例子1的第11行和12行代码,例子2的第7行到第9行,旋转的角度和圆弧半径都是经过几次修改测试得到的。 这些角度和圆弧半径不影响后面的规律验证。 (3)实例三 实例三从同一点出发,画封闭图形,运行结果,大家可以看到,填充不正常(图5)。 #代码3 from turtle import* color("red","green") hideturtle() begin_fill() forward(100) left(90) forward(100) up() home() down() circle(100,90) end_fill() (4)实例四 实例四也是从同一点出发,画封闭图形,运行结果,大家可以看到,填充正常(图6)。 #代码4 from turtle import* color('red','green') hideturtle() begin_fill() forward(100) left(90) forward(100) up() home() down() left(90) circle(-100,90) end_fill() (5)结论一 那么问题来了,从同一点出发画的两个图形,填充效果怎么会不同? 通过试验和分析,我总结出一个结论:涉及到圆弧图形的填充时,默认为弧线内填充(圆心和弧线之间)。当需要外侧填充时,必须是用turtle顺次画出的封闭曲线才能正常填充。根据我们总结的规律,将实例三做修改,经过测试,证明了这结论正确(图7)。 #代码3-修改 from turtle import* color('red','green') hideturtle() begin_fill() circle(100,90) forward(-100) right(90) forward(-100) end_fill() 理解这个关键所在后,大家可以自己编程测试。下面我们就利用这个结论用来画出任意大小的月相,当然还是先从简单的开始。 1.月亮基本代码 月有阴晴圆缺,怎么画呢?使用circle(半径,弧度数如果不规定则画圆,步数如果给出步数就出多边形)命令(图8)。 from turtle import* from math import* bgcolor('black') color('white','white') setheading(0) begin_fill() circle(100,180) right(45) circle(141,-90) end_fill() done() 同样,代码第8行半径和角度,第9行的距离,也是我一点点修改、测试出来的。运行效果如图,发现月牙大了(图9)。 2.月相基本知识 月相,天文学术语(phase of the moon),是指天文学中对于地球上看到的月球被太阳照明部分的称呼。月球绕地球运动,使太阳、地球、月球三者的相对位置在一个月的时间中有规律地变动。因为月球本身不发光,且不透明,只有月球直接被太阳照射的部分才能反射太阳光。我们从不同的角度上看到月球被太阳直接照射的部分,这就是月相的来源。月相不是由于地球遮住太阳所造成的(这是月食),而是由于我们只能看到月球上被太阳照到发光的那一部分所造成的,其阴影部分是月球自己的阴暗面。 参考月相图,这里不做过多解释,有兴趣同学可以自己查找相关知识(图10)。 3.月相画法规律 那大家一定会想,各种月相都能画出来吗?有规律吗?咱们看图说话,假设两圆相交的上侧部分是要画的月亮(图11)。 外圆O、内圆O’的半径为r、r’,我们先画一个半径为r的半圆,turtle的方向正好转过180,要想画出下面的小弧,turtle必须旋转一个角度a,然后画个内圆圆弧,大小为a’,由图中可以看出,a’=1800-2* a,而半径r’=r/cos(a),因此,画内弧时,要转过的角度和半径知道了,我们就可以画月亮了。 4.月相代码程序 代码如图12。 #月相大小 from turtle import* from math import* a=eval(input("输入内圆弧度数(0-180):")) r=eval(input("输入外圆半径:")) bgcolor("black") color('white','white') hideturtle() begin_fill() circle(r,180) right(a) circle(r/cos(a*pi/180),-abs(180-2*a)) end_fill() done() 运行,输入内圆弧度数相应数值,即可(图13)。 其实这个月亮是在屏幕中心上方的,新月、残月、凸月等月相怎么得到呢(图14)? #月相大小、位置、方向 from turtle import* from math import* xy=input("输入显示位置坐标(用空格分开):") c=eval(input("输入方向角:")) a=eval(input("输入内圆弧度数(0-180):")) r=eval(input("输入外圆半径(与坐标之和小于屏幕大小):")) b=xy.split(" ") bgcolor("black") color('white','white') hideturtle() up() goto(eval(b[0]),eval(b[1])) down() setheading(c) begin_fill() circle(r,180) left(-a) circle(r/cos(a*pi/180),-abs(180-2*a)) end_fill() done() 运行程序,输入月亮位置坐标、月亮的朝向、内圆弧度数和外圆半径,即可画出任意方向和大小的月亮。注意外圆半径与西医综合横纵坐标之和不能大于屏幕尺寸(图15)。 如果想画凸月,内圆弧度数大于90即可。如果是满月,那就输入180,其它情况大家可以自行测试,其取值范围是0-180(图16)。 程序编写过程中,最好边输入代码,边测试,这样可以随时调整程序。 这个案例用到了列表、字符串、数据转换、绝对值等相关知识。math是数学模块,和turtle一样,使用前需要导入。 案例的讲解过程,即是我的实际操作过程,只是遇到了问题,都是经过多次修改、测试得到的结果。既需要耐心,又需要知识点扎实。在此更希望在学习中能真正做到独立思考,研究解决问题的方法和思路,其实这是提高编程能力的最好办法。如有不当之处,请诸位斧正!返回搜狐,查看更多 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |