Использование рекурсии для рисования вложенных треугольников - PullRequest
2 голосов
/ 09 апреля 2020

Я хотел бы нарисовать серию вложенных треугольников, используя рекурсию.

Мой ошибочный код ниже:

def recursiveTri(x, y, shrink):

    tt.penup()
    tt.setx(x)
    tt.sety(y)

    if x > -10:
        return

    for element in range(3):
        tt.pendown()
        tt.forward(x)
        tt.right(120)

    recursiveTri(x + shrink, y - shrink, shrink)

def main():
    recursiveTri(-300,300,30)

main()

Текущий код выдает следующее:

Actual output

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

Nested squares

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

А теперь, просто для удовольствия, решение "лучше пережить штамповка ":

import turtle

CURSOR_SIZE = 20

def recursiveTri(side, shrink):
    if side > 10:
        turtle.shapesize(side / CURSOR_SIZE)

        turtle.stamp()

        recursiveTri(side - shrink, shrink)

turtle.hideturtle()
turtle.shape('triangle')
turtle.fillcolor('white')

recursiveTri(300, 30)

turtle.dot()
turtle.exitonclick()

enter image description here

Это это ориентация по умолчанию, вы можете повернуть ее как угодно, прежде чем звонить recursiveTri(). Штамп является альтернативой рисунку , который лучше всего работает с простыми геометрическими c рисунками, подобными этому.

2 голосов
/ 09 апреля 2020

Проблема с

tt.forward(x)

Помните, что ваш x всегда отрицателен, а длина стороны не x, а скорее -2 * x, если вы хотите быть симметричным около нуля. Поскольку ваши треугольники являются вложенными, вы также можете вычислить начальный y из x, учитывая, что он составляет 1/3 пути вверх по главному биссектрисе. -sqrt(3) / 3 * x поэтому помещает центр окружностей, описанных и вписанных в ваш треугольник, в 0, 0.

На самом деле, возможно, проще просто зафиксировать длину стороны и вычислить x и y от этого:

import turtle as tt
from math import sqrt

def recursiveTri(side, shrink):
    if side < 10: return

    tt.penup()
    tt.goto(-side / 2, sqrt(3) / 6 * side)

    tt.pendown()

    for _ in range(3):
        tt.forward(side)
        tt.right(120)

    recursiveTri(side - shrink, shrink)

tt.penup()
tt.home()
tt.dot()
recursiveTri(300, 30)

В этом случае shrink - это общая сумма, удаленная с каждой стороны. Если вы хотите, чтобы сумма была на шаг вперед, измените рекурсивный вызов на recursiveTri(side - 2 * shrink, shrink).

Результат (без умножения shrink на 2) будет

Nested triangles

...