绘制随机分布的圆Python

任务描述:
在图形界面内,每个圆的圆心和半径随机生成,而且不能重叠,需要把每个圆的数据放入列表,新生成的圆要与已有的圆进行比对,即两个圆的圆心的举例必须大于两个圆的半径之和,而又不能超过图形边界。请编写程序,实现随机分布的圆的绘制。

输出:

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")

提供参考实例:https://blog.csdn.net/sinat_27421407/article/details/78964707?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-78964707-blog-110029741.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-78964707-blog-110029741.pc_relevant_recovery_v2&utm_relevant_index=12