Python基础图形绘图教学1
- 绘画正三角形、四边形、五边形、六边形、七边形、八边形、九边形...
- 绘画正多边形内邻点连线图形
- 注
绘画正三角形、四边形、五边形、六边形、七边形、八边形、九边形…
常见的正多边形是要会绘制的,毕竟也不复杂,都是同一个函数画出来的。
import turtle
turtle.setup(800, 200)
for i in range(3, 10):
turtle.penup()
turtle.goto(x=i * 110 - 660, y=-50)
turtle.pendown()
print(f'执行语句:turtle.circle(radius=50, extent=360, steps={i})')
turtle.circle(radius=50, extent=360, steps=i)
turtle.exitonclick()
你没看错,turtle.circle(radius=50, extent=360, steps={i})
,就是这个,加上 steps 就是画正多边形(此时的 radius 是外接圆半径),不加就是画圆或圆弧;当 extent 小于 360 时,画出的就是圆弧。
绘画正多边形内邻点连线图形
光会画正多边形还不够,还要会画其内邻点连线图形,比如说五角星:
import turtle
turtle.setup(200, 200)
for i in range(5):
turtle.forward(80)
turtle.right(144)
turtle.exitonclick()
这个起点不是最上方点,显得不在我们掌控之内,所以我们再旋转一下:
import turtle
turtle.setup(200, 200)
turtle.right(72)
for i in range(5):
turtle.forward(80)
turtle.right(144)
turtle.exitonclick()
好,这上面的初始旋转角72和旋转角144都是怎么计算的呢,这里就要画个图,来做一道数学题了,这里以正七边形内邻点连线图形为例:
这是正七边形,接下来连接其所有邻点:
可以看到上面博主列出的数学算式,计算出旋转角是 4 * 180 / 边数 ,这就能轻易得出,正七边形内邻点连线图形的每个突出的角,应该是 180 - (4 * 180 / 边数) ,那么初始旋转角应该是 90 减去它的一半,就是 2 * 180 / 边数 ,现在我们用这个公式来计算一下正七边形:
初始旋转角 = 4 * 180 / 7 = 720 / 7
旋转角 = 2 * 180 / 7 = 360 / 7
然后我们用这个数据来画一个:
import turtle
turtle.setup(200, 200)
turtle.right(360 / 7)
for i in range(7):
turtle.forward(60)
turtle.right(720 / 7)
turtle.exitonclick()
发现画的真完美,给我们自己点个赞吧!
接下来我们用这个规则多画几个(偶数边形的会发现连出来是两个一半的正多边形,所以等会再看,这里只看奇数的图形):
import turtle
turtle.setup(680, 200)
for s in range(5, 12, 2):
turtle.penup()
turtle.goto(x=s * 80 - 660, y=60)
turtle.pendown()
turtle.setheading(-2 * 180 / s)
for i in range(s):
turtle.forward(70)
turtle.right(4 * 180 / s)
turtle.exitonclick()
这里由于要画不同图形的旋转角,所以使用 turtle.setheading(-2 * 180 / s)
来调整初始角会更加方便。
接下来可以将这个发现组成一个简单的函数,这样就能绘制任意奇数正多边形内邻点连线图形:
import turtle
def draw_odd_polygon(location, radius, side):
turtle.penup()
turtle.goto(*location)
turtle.pendown()
turtle.setheading(-2 * 180 / side)
for i in range(side):
turtle.forward(radius)
turtle.right(4 * 180 / side)
turtle.setup(680, 200)
for s in range(5, 12, 2):
draw_odd_polygon((s * 80 - 660, 60), 70, s)
turtle.exitonclick()
注
当中有点小事情耽搁了写博文,但是我又想在此时此刻发出博文,所以只写了一半,剩余的见下一篇哦~