You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python代码实现随机分布且随机半径的圆形绘制?

修改代码实现随机分布且随机半径的圆形绘制

原问题

现有代码可绘制随机分布但半径大小一致的圆形,需要修改为能绘制随机分布且随机半径大小的圆形。原代码如下:

from random import randint
from svg_turtle import SvgTurtle
import turtle
from turtle import Turtle
import xml.etree.ElementTree as ET
import json


def x_circle(x, width, height):
    x_r=30
    x_num = 100
    cursor_size = 20
    x.hideturtle()
    x.screen.bgcolor("black")
    x.color("white")
    x.shape("circle")
    x.shapesize(x_r / cursor_size)
    x.speed("fastest")
    x.penup()
    xs = [] 
    
    for _ in range(x_num):
        xx = x.clone()
        xx.setposition(
            randint(-width / 2, width / 2),
            randint(-height / 2, height / 2),
        )

        while any((a.distance(xx) < x_r for a in xs)):
            xx.setposition(
                xx(- width / 2, width / 2 ),  # 此处存在语法错误,应为randint调用
                randint(- height / 2, height / 2),
            )
        
        x.stamp()  # 错误:应使用克隆的xx对象盖章,否则位置不对应
        
        xs.append(xx) 

修改方案

要实现随机半径,需从固定半径变量、个体半径设置、碰撞检测逻辑三个核心部分调整,同时修复原代码的语法错误:

  1. 生成随机半径:移除固定的x_r,在每个圆的循环中生成自定义范围的随机半径
  2. 为每个克隆乌龟设置对应半径:每个xx对象需根据自身随机半径调整shapesize参数
  3. 修正碰撞检测逻辑:两圆不重叠的条件是中心距离≥两半径之和,因此碰撞判断需比较距离与两半径之和的大小
  4. 修复原代码错误:修正setposition的语法错误、调整stamp的调用对象

修改后的完整代码

from random import randint
from svg_turtle import SvgTurtle
import turtle
from turtle import Turtle
import xml.etree.ElementTree as ET
import json


def x_circle(x, width, height):
    x_num = 100
    cursor_size = 20
    x.hideturtle()
    x.screen.bgcolor("black")
    x.color("white")
    x.shape("circle")
    x.speed("fastest")
    x.penup()
    xs = [] 
    radii = []  # 存储每个圆的半径,与xs中的乌龟对象一一对应
    
    for _ in range(x_num):
        # 生成随机半径,范围可自行调整(示例为5到50)
        r = randint(5, 50)
        xx = x.clone()
        # 根据当前半径设置乌龟显示大小
        xx.shapesize(r / cursor_size)
        # 设置随机初始位置
        xx.setposition(
            randint(-width / 2, width / 2),
            randint(-height / 2, height / 2),
        )

        # 碰撞检测:确保当前圆与已存在的圆不重叠
        while any(xx.distance(a) < r + radii[i] for i, a in enumerate(xs)):
            xx.setposition(
                randint(-width / 2, width / 2),
                randint(-height / 2, height / 2),
            )
        
        # 使用当前克隆的乌龟对象盖章
        xx.stamp()
        
        xs.append(xx)
        radii.append(r)

关键说明

  • 新增radii列表存储每个圆的半径,与xs列表中的乌龟对象一一对应,方便碰撞检测时获取对应半径值
  • 碰撞检测条件xx.distance(a) < r + radii[i]确保两圆中心距离大于等于半径之和,避免重叠
  • 每个克隆乌龟单独设置shapesize,保证显示的圆形大小与随机半径匹配
  • 修复了原代码中setposition的语法错误和stamp对象错误,确保每个圆的位置正确

内容的提问来源于stack exchange,提问作者user20442423

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:56:55