Я не могу найти способ создать правильный шаблон "черепаха", так как мой код рисует только квадрат - PullRequest
0 голосов
/ 11 апреля 2019

Задача состоит в том, чтобы сделать то, что сделала бы библиотека черепах, но без библиотеки.

Это рисунок, который я получаю This is the drawing that I obtain Он должен проследить путь с помощью цикла for, но он не должен прибыть в то же место, с которого начинался, потому что угол поворота должен заставлять черепаху приземляться в разных местах каждый раз. Кстати, Дереча (справа), Изкиерда (слева), Арриба (вверх), Абахо (вниз)

from graphics import*
import math
ancho = 500
alto = 500
a=alto/2
b=ancho/2
win = GraphWin ("Estrella",ancho,alto)
origen=Point(ancho/2, alto/2)
dirTort="derecha"

def T(dir,dist,ang):
    global dirTort,a,b
    ang=ang*math.pi/180
    for i in range (40):
        if dir == "derecha":
            if dirTort == "derecha":
                dirTort = "abajo"
                valx = math.cos(ang)
                valy = math.sin(ang)
            elif dirTort == "izquierda":
                dirTort = "arriba"
                valx = -math.cos(ang)
                valy = -math.sin(ang)
            elif dirTort == "arriba":
                dirTort = "derecha"
                valx = math.sin(ang)
                valy = -math.cos(ang)
            elif dirTort == "abajo":
                dirTort = "izquierda"
                valx = -math.sin(ang)
                valy = math.cos(ang)
        elif dir == "izquierda":
            if dirTort == "derecha":
                dirTort = "abajo"
                valx = -math.cos(ang)
                valy = -math.sin(ang)
            elif dirTort == "izquierda":
                dirTort = "arriba"
                valx = -math.cos(ang)
                valy = math.sin(ang)
            elif dirTort == "arriba":
                dirTort = "derecha"
                valx = -math.sin(ang)
                valy = -math.cos(ang)
            elif dirTort == "abajo":
                dirTort = "derecha"
                valx = math.sin(ang)
                valy = math.cos(ang)
        p1 = Point(a, b)
        coordx=a+dist*valx
        coordy=b+dist*valy
        p2=Point(coordx, coordy)
        linea=Line(p1,p2)
        linea.setFill("red")
        linea.draw(win)
        a=coordx
        b=coordy

    print(coordx,coordy)

T("derecha",200,10)
print(dirTort)

message = Text(Point(win.getWidth()/2,win.getHeight()/15),"Click para salir")
message.draw(win)
win.getMouse()

1 Ответ

0 голосов
/ 11 апреля 2019

Я верю, что вы неправильно управляете своим углом.Поскольку вы в основном рисуете квадрат снова и снова, каждый раз немного поворачиваясь, ваш угол составляет 90 или -90 градусов.Это немного наклонено между квадратами на небольшой угол поворота, переданный в функцию.Вот очень упрощенная версия вашего кода, которая рисует желаемую цель:

from graphics import *
from math import pi, sin as sine, cos as cosine, radians

WIDTH, HEIGHT = 500, 500
win = GraphWin("Star", WIDTH, HEIGHT)
origin = Point(WIDTH/2, HEIGHT/2)

def star(distance, angle):

    theta = 0
    angle_in_radians = radians(angle)
    p1 = origin.clone()

    for _ in range(360 // angle):

        for _ in range(4):  # draw a square
            theta += pi / 2

            p2 = p1.clone()
            p2.move(distance * cosine(theta), distance * sine(theta))

            line = Line(p1, p2)
            line.setFill("red")
            line.draw(win)

            p1 = p2

        theta += angle_in_radians  # tilt our starting point slightly

star(175, 9)

message = Text(Point(WIDTH/2, HEIGHT/15), "Click to exit")
message.draw(win)
win.getMouse()

Надеюсь, это поможет вам вернуть ваш код в нужное русло.

enter image description here

...