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

如何使用Python 3 Turtle绘制无间隙方形点替代圆形点

替换Turtle圆点为无间隙方形的解决方案

你说得对,turtle的dot()方法确实只能生成圆形标记,要实现无间隙的方形印章效果,我们可以自己实现绘制填充正方形的逻辑,或者利用turtle的形状注册+印章功能。下面是两种可行的解决方案,以及关键修改的说明:

方案一:自定义绘制填充正方形

这种方式通过逐边绘制并填充正方形,精准控制每个方块的位置和大小,确保无间隙贴合:

import turtle
from math import sqrt

def isPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    k = 3
    while k <= sqrt(n):  # 修正原代码小问题:漏掉平方根为整数的质数判断
        if n % k == 0:
            return False
        k += 2
    return True

def draw_square(size):
    # 以当前海龟位置为中心绘制填充正方形
    turtle.pu()
    # 移动到正方形左下角起点
    turtle.goto(turtle.xcor() - size/2, turtle.ycor() - size/2)
    turtle.pd()
    turtle.begin_fill()
    # 绘制四条边
    for _ in range(4):
        turtle.forward(size)
        turtle.left(90)
    turtle.end_fill()
    turtle.pu()
    # 回到中心点,不影响后续坐标移动
    turtle.goto(turtle.xcor() + size/2, turtle.ycor() + size/2)

def plot(k):
    numPrimes = 0
    turtle.pu()
    turtle.speed(0)
    square_size = 7  # 与移动步长保持一致,确保方块无间隙
    # 初始化第一个点
    turtle.fillcolor("green")
    draw_square(square_size)
    n= 1
    dir = 1
    for i in range(80):
        for j in range(n):
            turtle.setx(turtle.xcor() + square_size*dir)
            if isPrime(k):
                numPrimes += 1
                turtle.fillcolor("red")
            else:
                turtle.fillcolor("black")
            draw_square(square_size)
            k += 1
        for j in range(n):
            turtle.sety(turtle.ycor() + square_size*dir)
            if isPrime(k):
                turtle.fillcolor("red")
                numPrimes += 1
            else:
                turtle.fillcolor("black")
            draw_square(square_size)
            k += 1
        n += 1
        dir = -dir
    print(k-1, numPrimes)
    turtle.hideturtle()
    turtle.done()  # 保持窗口不自动关闭

plot(1)

方案二:使用Turtle印章功能(更高效)

如果要绘制大量方块,推荐使用turtle.stamp(),通过注册自定义正方形形状,快速生成印章标记,性能更优:

import turtle
from math import sqrt

def isPrime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    k = 3
    while k <= sqrt(n):
        if n % k == 0:
            return False
        k += 2
    return True

def plot(k):
    numPrimes = 0
    turtle.pu()
    turtle.speed(0)
    square_size = 7
    # 注册自定义正方形形状
    turtle.register_shape("square_stamp", ((-square_size/2, -square_size/2),
                                          (square_size/2, -square_size/2),
                                          (square_size/2, square_size/2),
                                          (-square_size/2, square_size/2)))
    turtle.shape("square_stamp")
    # 初始化第一个点
    turtle.color("green")
    turtle.stamp()
    n= 1
    dir = 1
    for i in range(80):
        for j in range(n):
            turtle.setx(turtle.xcor() + square_size*dir)
            if isPrime(k):
                numPrimes += 1
                turtle.color("red")
            else:
                turtle.color("black")
            turtle.stamp()
            k += 1
        for j in range(n):
            turtle.sety(turtle.ycor() + square_size*dir)
            if isPrime(k):
                turtle.color("red")
                numPrimes += 1
            else:
                turtle.color("black")
            turtle.stamp()
            k += 1
        n += 1
        dir = -dir
    print(k-1, numPrimes)
    turtle.hideturtle()
    turtle.done()

plot(1)

关键修改说明

  1. 替换dot()为方块绘制逻辑:两种方案都抛弃了dot(),改用填充正方形或印章实现方形标记
  2. 大小与步长匹配:将方块边长设为7,和你原代码中的移动步长7*dir一致,确保相邻方块完全贴合无间隙
  3. 颜色控制调整:把原代码的pencolor()改为fillcolor()(方案一)或直接用color()(方案二),控制方块内部填充色
  4. 修正质数判断漏洞:原代码while k < sqrt(n)会漏掉类似9这种平方根为质数的情况,改为<=更准确
  5. 添加窗口保持逻辑:用turtle.done()让绘图窗口绘制完成后保持打开状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:52:45