Python用乌龟图形绘制n-pointed星

时间:2014-10-19 20:54:10

标签: python turtle-graphics

我的教授要求我们的班级编写一个Python函数,其功能如下:

在名为star(turtle,n,d)的函数中绘制一个带有d - 的常规n角星

这是我到目前为止的代码:

def star(turtle, n, d):
    angle = (180-((180*(n-2))/n))*2
    for i in range(n):
        t.forward(d)
        t.left(angle)
    return angle

我遇到的问题是我的功能只能绘制奇数角(5,7,9边星)的星星。当我要求它绘制一个具有偶数边的星形时,它输出边长为n / 2的多边形。所以要求绘制一个8边形的星形输出一个正方形,6边形给出一个三角形,等等。

我已尝试多次改变角度公式,但它从不适用于任何给定的n。

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

通过使用GCD例程查找互质并将失败视为例外,您可以使用相同的代码绘制大多数奇数和偶数明星:

import sys
import turtle
from time import sleep

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def normal_star(size, color, points):
    if points <= 4:
        raise ValueError('Not enough points')

    turtle.color(color)

    for coprime in range(points // 2, 1, -1):
        if gcd(points, coprime) == 1:

            print("({},{})".format(points, coprime), file=sys.stderr)

            start = turtle.position()

            for _ in range(points):
                turtle.forward(size)
                turtle.left(360.0 / points * coprime)

            turtle.setposition(start)

            return

    abnormal_star(size, color, points)

def abnormal_star(size, color, points):
    # deal with special cases here
    print("Exception:", points, file=sys.stderr)

for points in range(5, 20):
    turtle.reset()
    normal_star(200, 'red', points)
    sleep(5)

turtle.exitonclick()

对于从5到20的点,这只能找到6的解决方案,你需要将其视为异常,即专门的代码或只是让用户知道它是你无法处理的异常:

> python3 test.py
(5,2)
Exception: 6
(7,3)
(8,3)
(9,4)
(10,3)
(11,5)
(12,5)
(13,6)
(14,5)
(15,7)
(16,7)
(17,8)
(18,7)
(19,9)
(20,9)
>

参数200的输出示例,'red',10

enter image description here

答案 1 :(得分:0)

此代码将绘制点数大于5的星形。

def star(size, points):
    t.speed(-1)
    t.setheading(0)
    ext = 360 / points

    if points % 2 == 0:
        coords = []
        for a in range(0, points):
            t.penup()
            coords.append(t.pos())
            t.circle(size, ext)
        for b in range(0, len(coords)):
            if b % 2 == 0:
                t.pendown()
                t.goto(coords[b][0], coords[b][1])
            else:
                continue
        t.goto(coords[0][0], coords[0][1])
        t.penup()
        for c in range(0, (len(coords) + 1)):
            if c % 2 != 0:
                t.goto(coords[c][0], coords[c][1])
                t.pendown()
            else:
                continue
        t.goto(coords[1][0], coords[1][1])
    else:
        angle = 180 - (180 / points)
        t.forward(size)
        t.right(angle) 

答案 2 :(得分:0)

jaroelfsema。 您的代码适用于具有偶数边的星星。如果您记得在else异常中添加for循环,则代码的工作面也可能是奇数个。 def应该像这样结束:

else:
    angle = 180 - (180 / points)
    for a in range(points):
        t.forward(size)
        t.right(angle) 

做得很好。我已经寻找了一段时间了。将s = turtle.Screen()和s.exitonclick()添加到代码中,让turtlewindow等待,而不仅仅是在Windows中使用turtle对我们关闭,也将很不错。但总的来说:老兄,对您表示敬意。

答案 3 :(得分:-1)

你的公式有点不对:

def star(turtle, n, d):
    for i in range(n):
        angle = 180.0 - 180.0 / n
        turtle.forward(d)
        turtle.right(angle)
        turtle.forward(d)`