我正在研究Python,特别是具有乌龟图形的功能
我从一些形状不错的菱形多边形开始。然后,我尝试创建一个10面多边形,每个点都与钻石的外部点相连。这是没有10面多边形的钻石:
我试图找到钻石的每个外部点之间的距离以及它们旋转的程度,因为这将是正确的程度
(pen.right()
)和长度(pen.forward()
)来创建10面多边形。我试图猜测长度和度值(如下所示,在“#make the polygon”下),但我无法使其看起来正确。
有没有一种方法可以数学计算乌龟笔应绘制的长度和度数以创建多边形?
如果有人对我如何改善我的绘画提出建议,我一定也很乐意听到!
from tkinter.ttk import *
from tkinter import *
import turtle
import random
# draw flower
pen = turtle.Turtle()
pen.speed(10)
turtle.Screen().bgcolor("grey")
colours = ["cyan", "purple", "white", "blue"]
pen.color("cyan")
for i in range(10):
for i in range(2):
pen.forward(100)
pen.right(60)
pen.forward(100)
pen.right(120)
pen.right(36)
pen.color(random.choice(colours))
# end flower
# direct pen to point to make polygon
pen.up()
pen.right(36)
pen.forward(100)
pen.right(60)
pen.forward(100)
pen.right(60)
pen.down()
# make the polygon
pen.right(21)
pen.forward(106)
for i in range(9):
pen.right(37)
pen.forward(100)
答案 0 :(得分:1)
我将为您的问题提出非数学解决方案。由于您在绘制花瓣的某个时候在每个点上都有笔,因此您所要做的就是保存乌龟的位置,然后再取消所有这些位置。即使数学不是这样,该解决方案也应该是准确的:
from turtle import Screen, Turtle
from random import choice
COLOURS = ["cyan", "purple", "white", "blue"]
screen = Screen()
screen.bgcolor("grey")
pen = Turtle()
pen.speed('fast')
# draw flower
points = []
for _ in range(10):
pen.color(choice(COLOURS))
for flag in range(2):
pen.forward(100)
pen.right(60)
pen.forward(100)
pen.right(120)
if not flag:
points.append(pen.pos())
pen.right(36)
# end flower
# direct pen to point to make polygon
pen.up()
pen.color(choice(COLOURS))
for point in points:
pen.goto(point)
pen.down()
pen.goto(points[0])
pen.hideturtle()
screen.mainloop()
答案 1 :(得分:0)
我可以解释找到您问题的答案所涉及的几何和三角函数,但是此站点未设置为使用MathJax,这将使方程的输入和显示更加容易。相反,我将仅以代码形式显示答案。这些距离没有给出精确的点,因为尽管角度是精确的,但是距离的实际数学值是不合理的。但是这些似乎足以满足您的目的。我将10面多边形的颜色保持为随机:您可以根据需要轻松更改该颜色。
将代码结尾替换为:
# direct pen to point to make polygon
pen.up()
pen.right(30)
pen.forward(173.21)
pen.right(108)
pen.down()
for i in range(10):
pen.forward(107.05)
pen.right(36)
结合您的代码开头,我一次运行就获得了此图形:
一个改进的建议:图形的外部多边形的顶部和底部几乎是水平的,但不太平坦。如果将图形6°
顺时针旋转或30°
逆时针旋转,这些边将变为水平,看起来更好。在您的第一个pen.right(6)
循环之前添加行pen.left(30)
(或for
),您会得到: