Граница расположения черепахи - PullRequest
0 голосов
/ 03 ноября 2018

Я изучаю Python, в частности, функции с графикой черепахи

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

enter image description here

Я пытаюсь найти расстояние между каждой внешней точкой алмазов и степень, в которой они поворачиваются, поскольку они будут правильной степенью (pen.right()) и длина (pen.forward()), чтобы использовать для создания 10-стороннего многоугольника. Я попытался угадать значения длины и градуса (как показано ниже под "# сделать многоугольник"), но я не могу заставить его выглядеть правильно.

Есть ли способ математически рассчитать длину и степень, которую перо черепахи должно нарисовать, чтобы создать многоугольник?

Кроме того, если у кого-то есть предложения о том, как я могу улучшить свой рисунок, я бы с удовольствием его услышал!

from tkinter.ttk import *
from tkinter import *
import turtle
import random

# draw flower
pen = turtle.Turtle()
pen.speed(10)
turtle.Screen().bgcolor("grey")
colours = ["cyan", "purple", "white", "blue"]
pen.color("cyan")

for i in range(10):
    for i in range(2):
        pen.forward(100)
        pen.right(60)
        pen.forward(100)
        pen.right(120)
    pen.right(36)
    pen.color(random.choice(colours))
# end flower

# direct pen to point to make polygon

pen.up()
pen.right(36)
pen.forward(100)
pen.right(60)
pen.forward(100)
pen.right(60)
pen.down()

# make the polygon
pen.right(21)
pen.forward(106)

for i in range(9):
   pen.right(37)
   pen.forward(100)

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

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

from turtle import Screen, Turtle
from random import choice

COLOURS = ["cyan", "purple", "white", "blue"]

screen = Screen()
screen.bgcolor("grey")

pen = Turtle()
pen.speed('fast')

# draw flower
points = []

for _ in range(10):
    pen.color(choice(COLOURS))

    for flag in range(2):
        pen.forward(100)
        pen.right(60)
        pen.forward(100)
        pen.right(120)

        if not flag:
            points.append(pen.pos())

    pen.right(36)
# end flower

# direct pen to point to make polygon

pen.up()
pen.color(choice(COLOURS))

for point in points:
    pen.goto(point)
    pen.down()

pen.goto(points[0])
pen.hideturtle()

screen.mainloop()

enter image description here

0 голосов
/ 03 ноября 2018

Я мог бы объяснить геометрию и тригонометрию, чтобы найти ответ на ваши вопросы, но этот сайт не настроен на использование MathJax, что облегчит ввод и отображение уравнений. Вместо этого я просто покажу ответ в коде. Эти расстояния не дают точных точек, поскольку фактические математические значения для расстояний иррациональны, хотя углы являются точными. Но они кажутся достаточно хорошими для вашей цели. Я сохранил цвет случайным образом для 10-стороннего многоугольника: вы можете легко изменить этот цвет, если хотите.

Заменить конец вашего кода на:

# direct pen to point to make polygon
pen.up()
pen.right(30)
pen.forward(173.21)
pen.right(108)
pen.down()
for i in range(10):
    pen.forward(107.05)
    pen.right(36)

В сочетании с запуском вашего кода я получил этот рисунок за один прогон:

enter image description here

Одно предложение для улучшения: внешний многоугольник для вашей фигуры имеет верхнюю и нижнюю стороны, которые почти горизонтальны, но не совсем. Если повернуть цифру по часовой стрелке или 30° против часовой стрелки, эти стороны станут горизонтальными, что выглядит лучше. Добавьте строку pen.right(6) (или pen.left(30)) перед первым циклом for, и вы получите следующее:

enter image description here

...