求助:修复Python Turtle自定义点数星形绘制的偶数点异常问题
解决Python Turtle绘制偶数点数星形的问题
你的代码能正常绘制奇数点星形,是因为对于奇数点数n,步长2(每次转向2*(360/n)度)和n互质,能形成闭合的星形路径;但偶数点数时,步长2和n往往不互质(比如n=4,gcd(4,2)=2;n=6,gcd(6,2)=2),导致画笔重复走路径,画不出预期的星形。
修正思路
要绘制任意点数的星形,核心是找到合适的步长k(每次跳过k个顶点),需满足:
k和点数n互质(最大公约数为1)k不能等于n/2(避免画成对称的多边形)
如果n和k不互质,会拆分出gcd(n,k)个独立的多边形(比如6角星是两个三角形组成),需要分多次绘制。
修正后的代码
import turtle from math import gcd def draw_Star(): X = int(input("Star;Select X-Coordinate here: ")) Y = int(input("Star;Select Y-Coordinate here: ")) turtle_color3 = input("Star;Color of Turtle: ") points = int(input("Star;Enter num of points: ")) size = int(input("Star;Enter size of star: ")) star = turtle.Turtle() star.speed(1) star.color(turtle_color3) star.penup() star.goto(X, Y) star.pendown() n = points # 找到合适的步长k k = 2 valid_k = False while k < n: if gcd(n, k) == 1 and k != n / 2: valid_k = True break k += 1 if not valid_k: print("无法绘制该点数的星形(如n=2这类点数无有效星形)") return # 计算拆分的形状数量和每个形状的点数 g = gcd(n, k) num_shapes = g points_per_shape = n // g # 计算转向角度 angle = (360 * k) / n for _ in range(num_shapes): for _ in range(points_per_shape): star.right(angle) star.forward(size) # 移动到下一个形状的起始位置 star.right((360 / n) * (points_per_shape + 1)) draw_Star() turtle.done()
关键点说明
- 步长k的选择:通过循环找到第一个和点数
n互质且不等于n/2的整数,确保能绘制出星形而非多边形。 - 多形状处理:当
n和k的最大公约数大于1时,会拆分出多个独立的多边形(比如6角星由两个三角形组成),需要分多次绘制。 - 角度计算:基于步长
k计算转向角度,确保画笔每次转向后能指向正确的下一个顶点。
测试示例:
- 输入点数5:和原代码效果一致,绘制标准5角星
- 输入点数4:绘制交叉的4角星
- 输入点数6:绘制由两个三角形组成的6角星
内容的提问来源于stack exchange,提问作者LazyByDesign
相关产品推荐
相关产品推荐

