引自免费微信小程序:皆我百晓生
为了实现这个星空的绘制,我们需要对给定的代码进行一些调整。以下是详细的步骤和完整的代码。
首先,我们需要导入所需的模块并设置窗口大小。在代码中已经包含了turtle和random模块,但是我们还需要导入cmath模块来计算正弦和余弦,这将有助于我们在二维空间中更平滑地分布星星。
接下来,我们将设置窗口大小为1000x1000像素,并且设置背景颜色为白色。然后,我们可以定义月亮的半径(r)和星星的边长(o),以及月亮的位置。这里我们从用户那里获取这些值。
接着,我们创建一个Turtle对象并将其可见性设置为False,这样就不会显示画笔。同时禁用tracer,以提高绘制效率。
我们先绘制月亮,然后使用循环来绘制星星。在每次循环中,我们生成随机的x和y坐标,确保它们在-500到500的范围内。之后,我们将画笔移动到新位置并开始填充一个小五角星。
下面是完整的代码:
import turtle
import random
import cmath
# 设置窗口大小为1000x1000像素,背景颜色为白色
turtle.setup(1000, 1000)
turtle.bgcolor("white")
# 获取用户输入:月亮半径、星星边长和月亮位置
r, o, moon_x, moon_y = map(float, input("请输入月亮半径、星星边长和月亮位置(x y): ").split())
# 创建一个不可见的Turtle对象,并禁用tracer以提高性能
t = turtle.Turtle(visible=False)
turtle.tracer(False)
# 绘制月亮
t.penup()
t.goto(moon_x, moon_y)
t.pendown()
t.dot(2 * r)
# 绘制星星
random.seed(1)
for _ in range(20):
# 随机生成x和y坐标
x = random.uniform(-500, 500)
y = random.uniform(-500, 500)
# 将随机坐标转换为极坐标,以便于平滑分布
radius = cmath.sqrt(x**2 + y**2)
angle = cmath.phase(complex(x, y))
# 转换回笛卡尔坐标系
x = radius * cmath.cos(angle)
y = radius * cmath.sin(angle)
# 移动画笔到新的位置并绘制五角星
t.penup()
t.goto(x, y)
t.pendown()
t.begin_fill()
for _ in range(5):
t.forward(o)
t.right(144)
t.end_fill()
# 启用tracer并更新屏幕
turtle.tracer(True)
turtle.done()
这段代码将会根据用户的输入绘制一个带有月亮和20颗随机分布星星的星空。请注意,由于我们使用了随机数生成器,所以每次运行程序时,星星的位置都会有所不同。