作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试一项练习,要求我在Python中使用turtle绘制字母表中的字母。到目前为止,我认为我对如何使用前/后距离和旋转角度绘制直线、曲线和形状有了很好的理解。
我正在尝试绘制字母“B”,这是我的设计:
请注意,所有黑线的距离相等,并且圆弧的直径也等于 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)
它应该给我两条由底部弧线连接的完全平行的线,但我得到的是:
忽略不完整的顶部,如何解决这个问题,即圆弧的两端明显不重合,从而留下短“尾部”?我做错了什么吗?
最佳答案
您可以使用 range(n+1)
在末尾绘制额外的 fd()
但随后您必须返回 t.lt( -角度/n)
。或者保留 range(n)
并在循环后绘制额外的 fd()
而无需 lt()
。
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
时,接下来的 fd()
和 lf()
N 次,最后是 lf()
和 -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 段
第二个版本绘制 3 段
<小时/>顺便说一句: gallery with other images created with turtle 。
图像代码位于其他页面,但页面尚未翻译成英文。
关于 python 海龟 : Two ends of a 180 arc do not coincide?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60540599/
我是一名优秀的程序员,十分优秀!