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

如何在Turtle中绘制不重叠随机颜色圆圈?代码报错求助

问题修正:随机颜色不重叠圆圈绘制代码

错误原因说明

  1. 颜色报错:你先调用了fiber.color(r,g,b)设置RGB颜色,但此时turtle的颜色模式还是默认的1.0(0-1浮点数范围),未切换到255模式,导致无法识别0-255的RGB数值序列。
  2. 圆圈重叠:原代码没有位置校验逻辑,随机生成的位置可能和已有圆圈重叠。

修正后的完整代码

from random import randint
from svg_turtle import SvgTurtle
import turtle
from turtle import Turtle
import math


def fiber_circle(fiber, width, height):
    fiber_r = 25
    fiber_num = 100
    cursor_size = 20
    fiber.hideturtle()
    fiber.screen.bgcolor("white")
    # 先设置颜色模式为255,再使用RGB数值
    fiber.screen.colormode(255)
    fiber.shape("circle")
    fiber.shapesize(fiber_r / cursor_size)
    fiber.speed("fastest")
    fiber.penup()
    fibers = [] 

    for _ in range(fiber_num):
        fiberr = fiber.clone()
        # 生成独立的随机颜色
        r = randint(0, 255)
        g = randint(0, 255)
        b = randint(0, 255)
        fiberr.color(r, g, b)
        
        # 循环生成合法位置:确保不与已有圆圈重叠
        while True:
            x = randint(-width//2 + fiber_r, width//2 - fiber_r)
            y = randint(-height//2 + fiber_r, height//2 - fiber_r)
            # 检查与所有已有圆圈的距离
            overlap = False
            for existing in fibers:
                dx = x - existing.xcor()
                dy = y - existing.ycor()
                distance = math.hypot(dx, dy)
                # 距离大于两倍半径则不重叠
                if distance < 2 * fiber_r:
                    overlap = True
                    break
            if not overlap:
                break
        
        fiberr.setposition(x, y)
        fiberr.showturtle()  # 显示克隆的圆圈
        fibers.append(fiberr)

# 示例调用(可选择生成SVG或窗口显示)
if __name__ == "__main__":
    width, height = 800, 600
    # 生成SVG文件
    svg_turtle = SvgTurtle(width, height)
    fiber_circle(svg_turtle, width, height)
    svg_turtle.save("random_circles.svg")
    # 若要在窗口显示,注释上面三行,打开下面四行
    # win = turtle.Screen()
    # win.setup(width, height)
    # t = Turtle()
    # fiber_circle(t, width, height)
    # turtle.done()

关键修改点

  • 颜色模式调整:把fiber.screen.colormode(255)移到color()调用之前,确保RGB数值被正确解析。
  • 独立随机颜色:将颜色生成逻辑移到循环内部,每个克隆的圆圈都有独立的随机颜色。
  • 位置校验逻辑:通过while循环反复生成位置,使用欧氏距离判断是否与已有圆圈重叠,只有当距离大于两倍半径时才确认位置。
  • 边界限制:生成位置时限制在画布内(减去半径,避免圆圈超出画布)。
  • 显示克隆图形:添加fiberr.showturtle()确保圆圈可见。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:19