Python中turtle的填充问题

您所在的位置:网站首页 封闭图形与不封闭图形 Python中turtle的填充问题

Python中turtle的填充问题

2023-08-11 06:26| 来源: 网络整理| 查看: 265

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