任务描述:
在图形界面内,每个圆的圆心和半径随机生成,而且不能重叠,需要把每个圆的数据放入列表,新生成的圆要与已有的圆进行比对,即两个圆的圆心的举例必须大于两个圆的半径之和,而又不能超过图形边界。请编写程序,实现随机分布的圆的绘制。
输出:
20个随机分布,半径为2~20的圆。
分析:
利用turtle库中的图形绘制函数来完成圆的绘制。并且利用random库和math库中的函数,实现圆的圆心和半径的随机生成。每次新生成的圆的圆心坐标和半径都放入列表中
首先设定图形窗口为800*600,位于屏幕中心,如stup(800,600)。
假定生成20个圆
定义函数Addc(c),控制新生成的圆不与原有圆发生重叠,且不超出图形边界。
通过循环,在图形边界内,随机生成20个圆的圆心坐标,产生20个半径为2~20的随机圆,放置在列表c
最后通过turtle库中的up(), down(), goto(), crcl()函 数实现圆的绘制。
重要知识点:
(1) turtle 绘图基本操作相关函数的用法: up), down(), goto(), forward(), pencolor(), pensze), hideturtl(),done()等。
(2) 随机函数的用法。
(3) 循环结构在绘图中的运用。
望采纳
下面的示例代码实现了随机生成 20 个圆的圆心和半径,并使用 turtle 库绘制这些圆。
import turtle
import random
import math
# 设定图形窗口大小为 800x600,位于屏幕中心
turtle.setup(800, 600)
# 定义函数 Addc,用于生成新的圆,并检查它是否与已有圆重叠或超出图形边界
def Addc(circles):
# 随机生成圆的圆心坐标和半径
x = random.uniform(-300, 300)
y = random.uniform(-200, 200)
r = random.uniform(2, 20)
# 检查新圆是否与已有圆重叠
for circle in circles:
# 计算两圆圆心之间的距离
distance = math.sqrt((x - circle[0])**2 + (y - circle[1])**2)
# 如果两圆圆心距离小于等于两圆半径之和,则两圆重叠
if distance <= r + circle[2]:
return False
# 检查新圆是否超出图形边界
if x + r > 300 or x - r < -300 or y + r > 200 or y - r < -200:
return False
# 将新圆加入列表
circles.append((x, y, r))
return True
# 用于存储圆的列表
circles = []
# 生成 20 个圆
for i in range(20):
# 循环直到生成一个合法的圆为止
while not Addc(circles):
pass
# 使用 turtle 绘制圆
turtle.up()
for circle in circles:
turtle.goto(circle[0], circle[1])
turtle.down()
turtle.circle(circle[2])
下面是一个使用 Python 实现随机分布圆的绘制的示例代码:
import turtle
import random
import math
# 设定图形窗口的大小和位置
turtle.setup(800, 600, 0, 0)
# 设置画笔颜色和线宽
turtle.pencolor("red")
turtle.pensize(3)
# 设置画笔的绘制状态(是否下笔)
turtle.penup()
# 设置要绘制的圆的数量
num_circles = 20
# 定义一个列表,用于存储已经绘制的圆的信息
circles = []
# 定义一个函数,用于检查新生成的圆是否与已有圆重叠
def check_overlap(x, y, r):
# 计算新生成的圆的圆心和图形边界的距离
dist_x = abs(x)
dist_y = abs(y)
dist_border = math.sqrt(dist_x**2 + dist_y**2)
# 检查新生成的圆是否超出图形边界
if dist_border + r > 400:
return False
# 遍历已有圆的列表,检查是否与新生成的圆重叠
for circle in circles:
cx, cy, cr = circle
dist = math.sqrt((cx - x)**2 + (cy - y)**2)
if dist < cr + r:
return False
return True
# 循环生成并绘制圆
for i in range(num_circles):
# 随机生成圆心坐标和半径
x = random.randint(-400, 400)
y = random.randint(-300, 300)
r = random.randint(2, 20)
# 检查新生成的圆是否与已有圆重叠
if check_overlap(x, y, r):
# 移动画笔到圆心
turtle.goto(x, y)
# 下笔
turtle.pendown()
# 绘制圆
turtle.circle(r)
# 将新生成的圆的信息添加到圆的列表中
circles.append((x, y, r))
# 提笔
turtle.penup()
# 等待用户点击图形窗口关闭按钮
turtle.exitonclick()
上述代码中,我们定义了一个函数 check_overlap,用于检查新生成的圆是否与已有圆重叠。该函数的参数包括新生成的圆的圆心坐标和半径,返回一个布尔值,表示新生成的圆是否可以绘制。
在循环中,我们调用 check_overlap 函数,如果返回的值为 True,则绘制圆,并将新生成的圆的信息添加到圆的列表中;如果返回的值为 False,则跳过本次循环,继续生成下一个圆。
最后,我们调用 turtle.exitonclick() 函数等待用户点击图形窗口关闭按钮,结束程序的运行。
请注意,上述代码仅提供了一个示例,并未考虑处理异常情况和错误处理等问题。应根据具体情况进行修改。
专门写的:
import math
import os
import turtle
import random
X = []
Y = []
R = []
turtle.setup(800, 600, 400, 220)
i = 0
while i < 20:
turtle.width(1)
turtle.color('red')
x = random.randint(-350, 350)
y = random.randint(-280, 200)
X.append(x)
Y.append(y)
turtle.color('white')
turtle.goto(x, y)
r = random.randint(2, 20)
R.append(r)
yes = 1
j = 0
while j < len(R):
distance = math.sqrt((x - X[j]) ** 2 + (y - Y[j]) ** 2)
if distance <= (r + R[j]):
yes = 0
j = j+1
if yes == 1:
turtle.color('red')
turtle.circle(r)
i = i+1
print(i)
break
os.system("pause")