Здравствуйте, решаю задачу рисования фрактала,а именно кривой Госпера, есть следующие методы:
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), но по условиям фрактала, нужен именно прямой отрезок, а не под углом.
Думаю, что дело в forward() но не понимаю, что именно не так.
def forward(self):
pos = self._position
dirn = self._direction
self._position = np.add(pos, dirn)