如何用乌龟制作一个六边形的星星,三角形的大小不同?这就是我得到的,不确定,有人可以帮助我吗?

问题描述

import turtle

wn = turtle.Screen()
tess = turtle.Turtle()
tess.speed(30)


def triangle(sz):
    for i in range(3):
        tess.fd(sz)
        tess.lt(120)

def sixPtdStar(sz):
    triangle(sz)
    tess.lt(90)
    tess.pu()
    tess.fd(80)
    tess.rt(90)
    tess.fd(120)
    tess.pd()
    tess.rt(180)
    triangle(sz)

按照标题中的要求,问题是:如何使用乌龟制作六边形的星星,三角形的大小不同?

解决方法

我看到的问题是您正在用龟在一个顶点绘制第一个三角形。绘制这个三角形很简单,但是您不知该从哪里开始绘制下一个三角形。在这种情况下,我将更改设计以绘制以乌龟为中心的三角形。然后,绘制第二个三角形只是在稍微旋转乌龟之后重新开始的问题:

from turtle import Screen,Turtle

def triangle(side):
    tess.pendown()

    for _ in range(3):
        tess.forward(side)
        tess.left(120)

    tess.penup()

def sixPtdStar(side):
    height = side * 3**0.5 / 2  # equilateral triangle

    for _ in range(2):
        tess.right(30)
        tess.forward(2 * height / 3)
        tess.left(90 + 60)
        triangle(side)
        tess.right(90 + 60)
        tess.backward(2 * height / 3)
        tess.right(30)

tess = Turtle()
tess.penup()
tess.dot()  # mark the center of our star

sixPtdStar(100)

screen = Screen()
screen.exitonclick()

每当我尝试绘制居中图形时,我都使用tess.dot()作为调试辅助工具来知道该中心在哪里,这样我就可以直观地检查自己是否做对了:

enter image description here

仍然使乌龟处于图形中心的另一种方法是将对中工作推入triangle()并保持sixPtdStar()简单。一种方法是使用乌龟自己的circle()函数绘制三角形:

def triangle(side):
    height = side * 3**0.5 / 2  # equilateral triangle
    radius = 2 * height / 3

    # center the circle on tess' position
    tess.right(90)
    tess.forward(radius)
    tess.left(90)

    tess.pendown()
    tess.circle(radius,steps=3)
    tess.penup()

    # return tess to where she started
    tess.left(90)
    tess.forward(radius)
    tess.right(90)

def sixPtdStar(side):
     triangle(side)
     tess.right(60)
     triangle(side)

如果我们专注于使用circle()绘制三角形,而又不在乎将其居中放置在乌龟的当前位置上,那么我们可以简单地做到:

def triangle(radius):
    tess.pendown()
    tess.circle(radius,steps=3)
    tess.penup()

def sixPtdStar(side):
    radius = side * 3**0.5 / 3  # equilateral triangle
    triangle(radius)
    tess.circle(radius,extent=60)
    triangle(radius)

保持triangle()与上面相同,我们将更改sixPtdStar()从绘制两个重叠三角形改为改为在一个圆中绘制六个三角形:

def sixPtdStar(side):
    radius = side * 3**0.5 / 3  # equilateral triangle

    for _ in range(6):
        triangle(radius / 3)
        tess.circle(radius,extent=60)

或者,如果我们想要一颗特别优雅的星星,请将radius / 3更改为radius / 2可得到:

enter image description here