Python绘制七巧板

    七巧板实物如图1所示,七块板组成一个正方形。设正方形的边长为L,则两大直角等腰三角形的底边为L,中直角等腰三角形的边长为L/2,两小直角等腰三角形的底边为L/2。45°菱形和长为L/2高为L/4。正方形的对角线长为L/2。

1 七巧板实物 

    如何用尽量少的语句完成七巧板的绘制,本篇中用到一些技巧。

    本篇使用Python的Turtle来绘制七巧板,关于Turtle绘图本“公众号”已多篇文章介绍,本篇只介绍与绘制七巧板有关技巧相关的内容。

    color()函数可同时设置画笔颜色和填充颜色,只有一个颜色时画笔颜色和填充颜色相同,语法如下:

Turtle对象.color(<画笔颜色>[,<填充颜色>])

    填充时区域可不封闭,此时起点与终点间用无色直线连接。

    填充区域的起点为begin_fill()函数后当前坐标,终点为end_fill()前的当前坐标。

    区域填充抬笔也可填色,只不过不绘制边界。

    Turtle的goto()函数按最短路径移动画笔,也就是说,如是落笔状态,从当前坐标goto到指定坐标将绘制出两坐标的连接直线。

一、转角+直线绘制多边形

    先用传统和转角(lt()、rt())画直线(fd())绘制七巧板。颜色用赤橙黄绿青蓝紫绘制。

    由于画线需要转一定角度再画线,所以画一条直线需要二条语句,大部分多边形可以用“边数-1”条直线绘制。同时抬笔画填充色块,避免抬笔落笔,某多边形的终点即下个多边形的起点,减少无效的直线绘制。源代码如下:

import turtle as tl

tl.speed(9)
clr = ['#FF0000','#FF8000','#FFFF00','#00FF00','#00FFFF','#0000FF','#8000FF']
len,sqr2 = 300,2**0.5 # clr为颜色列表,len为七巧板最大边长,sqr2为sqrt(2)
tl.pu()
tl.ht()

tl.color(clr[0]) # 红,大三角形
tl.begin_fill()  # 画二条边,第三条边填色时直线封闭
tl.lt(-45)
tl.fd(len*sqr2/2)
tl.rt(135)
tl.fd(len)
tl.end_fill()

tl.color(clr[1]) # 橙,大三角形
tl.begin_fill()  # 画二条边,第三条边填色时直线封闭
tl.rt(90)
tl.fd(len)
tl.rt(135)
tl.fd(len*sqr2/2)
tl.end_fill()

tl.color(clr[2]) # 黄,小三角形
tl.begin_fill()  # 画二条边,第三条边填色时直线封闭
tl.lt(90)
tl.fd(len*sqr2/4)
tl.rt(135)
tl.fd(len/2)
tl.end_fill()

tl.color(clr[3]) # 绿,菱形
tl.begin_fill()  # 画三条边,第四条边填色时直线封闭
tl.lt(45)
tl.fd(len*sqr2/4)
tl.lt(135)
tl.fd(len/2)
tl.lt(45)
tl.fd(len*sqr2/4)
tl.end_fill()

tl.color(clr[4]) # 青,正方形
tl.begin_fill()  # 画三条边,第四条边填色时直线封闭
tl.lt(90)
for i in range(3):
    tl.fd(len*sqr2/4)
    tl.rt(90)
tl.end_fill()

tl.color(clr[5]) # 蓝,中三角形
tl.begin_fill()  # 唯一画三条边,第三条边是到达最后一个三角形起点
tl.fd(len*sqr2/2)
tl.lt(135)
tl.fd(len/2)
tl.lt(90)
tl.fd(len/2)
tl.end_fill()

tl.color(clr[6]) # 紫,小三角形
tl.begin_fill()  # 画二条边,第三条边填色时直线封闭
tl.fd(len/2)
tl.lt(135)
tl.fd(len*sqr2/4)
tl.end_fill()

    执行结果如图2所示。

转角+直线绘制的七巧板

二、goto(<坐标>)绘制多边形

    由于画线需要转一定角度再画线,所以画一条需要二条语句,利用goto()函数直线移动的特性,所以画一条直线只需一条语句。同时抬笔画填充色块,避免抬笔落笔,某多边形的终点即下个多边形的起点,减少无效的坐标移动。源代码如下:

import turtle as tl

tl.speed(9)
clr = ['#FF0000','#FF8000','#FFFF00','#00FF00','#00FFFF','#0000FF','#8000FF']
len = 150       # len为七巧板最大边长的一半
tl.pu()
tl.ht()

tl.color(clr[0]) # 红,大三角形
tl.begin_fill()
tl.goto(len,-len)
tl.goto(-len,-len)
tl.end_fill()

tl.color(clr[1]) # 橙,大三角形
tl.begin_fill()
tl.goto(-len,len)
tl.goto(0,0)
tl.end_fill()

tl.color(clr[2]) # 黄,小三角形
tl.begin_fill()
tl.goto(len/2,len/2)
tl.goto(len/2,-len/2)
tl.end_fill()

tl.color(clr[3]) # 绿,菱形
tl.begin_fill()
tl.goto(len,-len)
tl.goto(len,0)
tl.goto(len/2,len/2)
tl.end_fill()

tl.color(clr[4]) # 青,正方形
tl.begin_fill()
tl.goto(0,0)
tl.goto(-len/2,len/2)
tl.goto(0,len)
tl.end_fill()

tl.color(clr[5]) # 蓝,中三角形
tl.begin_fill()
tl.goto(len,0)
tl.goto(len,len)
tl.end_fill()

tl.color(clr[6]) # 紫,小三角形
tl.begin_fill()
tl.goto(-len,len)
tl.goto(-len/2,len/2)
tl.goto(0,len)
tl.end_fill()

    执行结果如图2所示。

图3 goto(<坐标>)绘制的七巧板

    结果与图2完全相同,而且少了13行语句,运行速度也快了不少。所以如果直线的端点坐标容易计算时,用goto(<坐标>)绘制直线的方法更优。

猜你喜欢

转载自blog.csdn.net/hz_zhangrl/article/details/130765060