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

求助:修复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个顶点),需满足:

  1. k和点数n互质(最大公约数为1)
  2. 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()

关键点说明

  1. 步长k的选择:通过循环找到第一个和点数n互质且不等于n/2的整数,确保能绘制出星形而非多边形。
  2. 多形状处理:当n和k的最大公约数大于1时,会拆分出多个独立的多边形(比如6角星由两个三角形组成),需要分多次绘制。
  3. 角度计算:基于步长k计算转向角度,确保画笔每次转向后能指向正确的下一个顶点。

测试示例:

  • 输入点数5:和原代码效果一致,绘制标准5角星
  • 输入点数4:绘制交叉的4角星
  • 输入点数6:绘制由两个三角形组成的6角星

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:50:17