@PythonStudent

Не отрабатывает метод рисования отрезка, что не так?

Здравствуйте, решаю задачу рисования фрактала,а именно кривой Госпера, есть следующие методы:
class turtle:
    def __init__(self):
        self._direction = np.array([1, 0]) # 2D direction vector
        self._position = np.array([0, 0]) # 2D position vector
    def forward(self):
        pos = self._position
        dirn = self._direction
        self._position = np.add(pos, dirn)
    def rotate(self, theta):
        (x, y) = self._direction
        current_angle = atan2(y, x)
        new_angle = current_angle + radians(theta)
        self._direction = [cos(new_angle), sin(new_angle)]

forward() - движение вперед, rotate() - поворот на угол в 60 градусов, соотвестенно.
Сам алгоритм построения фрактала -
commands = {
    'A': 't.forward()',
    'B': 't.forward()',
    '+': 't.rotate(-theta)',
    '-': 't.rotate(theta)',
    }

axiom = 'A'
production_rules = {
    'A': 'A-B--B+A++AA+B-',
    'B': '+A-BB--B-A++A+B'
    }
theta = 60
theta_second = 0

style = {'description_width': 'initial'}
n_iterations = widgets.IntSlider(style=style, min=1, max=7, step=1, description='Number of iterations:', value=1)
display(n_iterations)


Так вот заметил следующую проблему, что в правиле A -
production_rules = {
    'A': 'A-B--B+A++AA+B-',
, в первом случае, когда нет знака + или -, то есть поворота на угол, не отрисовывается отрезок (рисунок 1), если перед этим ставить + или -, то нужный отрезок рисуется (рисунок 2), но по условиям фрактала, нужен именно прямой отрезок, а не под углом.
5e7cf18d364b4912448462.png
5e7cf19bc7081412189816.png
Думаю, что дело в forward() но не понимаю, что именно не так.
def forward(self):
        pos = self._position
        dirn = self._direction
        self._position = np.add(pos, dirn)
  • Вопрос задан
  • 55 просмотров
Решения вопроса 1
Vast-Nectarine
@Vast-Nectarine
Пишу очень плохой код
Я тут накидал пример, но с использованием turtule, и у меня всё работает.
Сравните аксиому после подстановки. Может вы не так подставляете.
Код:

import turtle

rules = {
    "A": "A-B--B+A++AA+B-",
    "B": "+A-BB--B-A++A+B",
    '+': '+',
    '-': '-'
}

axiom = ['A']

level = 5

for i in range(level):
    p = []
    for j in range(len(axiom)):
        s = list(rules[axiom[j]])
        p.extend(s)
    axiom = p

print(axiom)
t = turtle.Turtle()

for l in axiom:
    if l in ['A', 'B']:
        t.forward(10)
    elif l == '+':
        t.left(60)
    elif l == '-':
        t.right(60)

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы