Python龟:180弧的两端不重合?

2024-06-17 10:00:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试一个练习,要求我用Python中的turtle绘制字母表的字母。到目前为止,我认为我已经很好地理解了如何使用前/后距离和转角绘制直线、曲线和形状

我试图画字母“B”,这是我的设计:

图1:
Figure 1

请注意,所有黑线的距离相等,弧的直径也等于1条黑线。以下是我拥有的不完整函数:

def arc(t, r, angle, n):
    arc_length = 2*math.pi*r*(angle/360)
    def polyline(t, length, n):
        for i in range(n):
            t.fd(length/n)
            t.lt(angle/n)
    polyline(t, arc_length, n)

def draw_b(t):
    t.fd(30)
    arc(t, 30, 180, 10)
    t.fd(30)
    t.lt(90)
    t.fd(30)
    t.bk(60)

它应该给我两条完全平行的线,由底部弧连接,但我得到的是:

图2:
Figure 2

忽略不完整的顶部,如果弧的两端明显不重合,从而留下一个短“尾巴”,我如何解决这个问题?我做错什么了吗?


Tags: lt距离def字母绘制length字母表直线
1条回答
网友
1楼 · 发布于 2024-06-17 10:00:00

您可以使用range(n+1)在结尾处绘制额外的fd(),但随后必须返回t.lt(-angle/n)。或者保持range(n)并在循环后不使用lt()绘制额外的fd()

def polyline(t, length, n):
    for i in range(n):
        t.fd(length/n)
        t.lt(angle/n)
    t.fd(length/n)   # < - extra `fd()` without `lt()`

import turtle
import math

def arc(t, r, angle, n):
    length = 2*math.pi*r*(angle/360)
    for i in range(n):
        t.fd(length/n)
        t.lt(angle/n)
    t.fd(length/n)

def draw_b(t):
    for _ in range(2):
        t.fd(30)
        arc(t, 30, 180, 10)
        t.fd(30)
        t.lt(90)
        t.fd(60)
        t.bk(60)
        t.lt(90)

draw_b(turtle.Turtle())

编辑:在以前的版本中,我使用了fd()N+1次和lf()N次,但如果有lf()angle/2,下一个{}和lf()N次,最后是-angle/2,效果会更好。如果你只画3段的arc,你会看到它看起来更好

import turtle
import math

def arc(t, r, angle, n):
    length = 2*math.pi*r*(angle/360)

    t.lt((angle/n)/2)

    for i in range(n):
        t.fd(length/n)
        t.lt(angle/(n))

    t.lt((-angle/n)/2)

def draw_b(t):
    for _ in range(2):
        t.fd(30)
        arc(t, 30, 180, 10)
        t.fd(30)
        t.lt(90)
        t.fd(60)
        t.bk(60)
        t.lt(90)

t = turtle.Turtle()
arc(t, 30, 180, 3)
#draw_b(t)

对于n=3

第一个版本绘制了4段

enter image description here

第二个版本绘制了3段

enter image description here


顺便说一句:gallery with other images created with turtle

图像代码在其他页面上,但页面尚未翻译成英语

相关问题 更多 >