如何使用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)
关键修改说明
- 替换
dot()为方块绘制逻辑:两种方案都抛弃了dot(),改用填充正方形或印章实现方形标记 - 大小与步长匹配:将方块边长设为7,和你原代码中的移动步长
7*dir一致,确保相邻方块完全贴合无间隙 - 颜色控制调整:把原代码的
pencolor()改为fillcolor()(方案一)或直接用color()(方案二),控制方块内部填充色 - 修正质数判断漏洞:原代码
while k < sqrt(n)会漏掉类似9这种平方根为质数的情况,改为<=更准确 - 添加窗口保持逻辑:用
turtle.done()让绘图窗口绘制完成后保持打开状态
内容的提问来源于stack exchange,提问作者user3934058
相关产品推荐
相关产品推荐

