猫史档案馆


用turtle库绘制弦图(递归型)

用户:开源盛世开源盛世查看:0 回复:0 评论:0 创建时间:2022-08-08T15:28:42


0  引言

在初中数学课上学习勾股定理时,我们会使用一种特殊图形——弦图,以证明该定理。(这些全部省略!)因为今天的重点是用Python实现它。

1  数学基础

在直角三角形ABC中,∠C=90°,∠A,∠B,∠C所对的边分别是a,b,c,∠A=α,则有:a=c*sinα,b=c*cosα。

2  实现思路

(1)导入turtle库,并做好相应的初始化操作。

import turtle as t
import math as m

p = t.Pen()
p.setheading(90)
p.pencolor("#ffffff")
p.speed(0)

(2)为方便,定义一个函数triangle(c,alpha,color),以绘制一个斜边是c,其中一个内角是alpha,填充色是color的直角三角形。

def triangle(c,alpha,color):
    p.fillcolor(color)
    p.begin_fill()
    p.forward(c)
    p.right(180-alpha)
    p.forward(c*m.cos(m.radians(alpha)))
    p.right(90)
    p.forward(c*m.sin(m.radians(alpha)))
    p.right(90+alpha)
    p.end_fill()

(3)定义正式的绘制函数rect(c,alpha,delta)(注:delta表示最小的弦图的边长,若小于delta则停止递归;其余两个参数请参照(2)):

def rect(c,alpha,delta):
    for i in ("#0000ff",'#ffaa00','#33cc00','#cc0000'):
        triangle(c,alpha,i)
        p.forward(c)
        p.right(90)
    p.right(90-alpha)
    p.forward(c*m.cos(m.radians(alpha)))
    if c*m.sin(m.radians(alpha)) - c*m.cos(m.radians(alpha)) > delta:
        rect(c*m.sin(m.radians(alpha)) - c*m.cos(m.radians(alpha)),alpha,delta)
    p.backward(c*m.cos(m.radians(alpha)))
    p.left(90-alpha)

(4)调用rect函数,开始绘图,并在完成之后暂停(当然,rect的三个参数可以变化,这样会有不同效果):

rect(400,75,5)
t.done()

3  效果图(仅供参考)

center_image

4  完整源代码(附)

import turtle as t
import math as m

p = t.Pen()
p.setheading(90)
p.pencolor("#ffffff")
p.speed(0)

def triangle(c,alpha,color):
    p.fillcolor(color)
    p.begin_fill()
    p.forward(c)
    p.right(180-alpha)
    p.forward(c*m.cos(m.radians(alpha)))
    p.right(90)
    p.forward(c*m.sin(m.radians(alpha)))
    p.right(90+alpha)
    p.end_fill()
def rect(c,alpha,delta):
    for i in ("#0000ff",'#ffaa00','#33cc00','#cc0000'):
        triangle(c,alpha,i)
        p.forward(c)
        p.right(90)
    p.right(90-alpha)
    p.forward(c*m.cos(m.radians(alpha)))
    if c*m.sin(m.radians(alpha)) - c*m.cos(m.radians(alpha)) > delta:
        rect(c*m.sin(m.radians(alpha)) - c*m.cos(m.radians(alpha)),alpha,delta)
    p.backward(c*m.cos(m.radians(alpha)))
    p.left(90-alpha)
rect(400,75,5)
t.done()


回复

上一页1 页 / 共 0下一页