如何在Turtle中绘制不重叠随机颜色圆圈?代码报错求助
问题修正:随机颜色不重叠圆圈绘制代码
错误原因说明
- 颜色报错:你先调用了
fiber.color(r,g,b)设置RGB颜色,但此时turtle的颜色模式还是默认的1.0(0-1浮点数范围),未切换到255模式,导致无法识别0-255的RGB数值序列。 - 圆圈重叠:原代码没有位置校验逻辑,随机生成的位置可能和已有圆圈重叠。
修正后的完整代码
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
相关产品推荐
相关产品推荐

