Я создаю фрактальный движок в Python, используя OpenGL.По сути, я создаю строку, представляющую фрактал, затем перебираю эту строку и разбираю ее на серию точек, между которыми нарисованы линии.Из-за природы фракталов, я не знаю, какой размер фрактал принимает до тех пор, пока я не нарисовал фрактал и не получил минимальное и максимальное значения X и Y.Однако для этого необходимо увеличить время запуска.Я пытался провести рефакторинг своего кода, чтобы исключить этот шаг, но наткнулся на препятствие при попытке обновить окно и масштаб для фрактала, используя метод glOrtho.Код по существу работает так:
def setup():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
Declared current state variables, curr_x, curr_y, etc
for i in range(len(current_state)): #current_state is the fractal string
term = current_state[i]
old_x = curr_x
old_y = curr_y
if term == 'f' or term == '!':
curr_x, curr_y = f_const(curr_x, curr_y, curr_angle, curr_gen)
drawLine([old_x, old_y, curr_x, curr_y])
if term == '+':
curr_angle = turn_right(curr_angle)
if term == '-':
curr_angle = turn_left(curr_angle)
etc...
if curr_x > x_max:
x_max = curr_x
if curr_x < x_min:
x_min = curr_x
if curr_y > y_max:
y_max = curr_y
if curr_y < y_min:
y_min = curr_y
refresh2d()
glutSwapBuffers()
def refresh2d():
global x_min, x_max, y_min, y_max
glViewport(0, 0, WIDTH, HEIGHT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(x_min, x_max, y_min, y_max, 0.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def drawLine(points):
glBegin(GL_LINES)
glVertex2f(points[0], points[1])
glVertex2f(points[2], points[3])
glEnd()
Как таковой, он не может правильно рисовать.Если я переместу вызов refresh2d () выше значений min и max для цикла for и hardcode, он будет работать, но когда вызов находится в нижней части, он не изменится, пока я каким-либо образом не изменю окно, например, не увеличу его.Если то, что я спрашиваю, возможно, и у кого-то есть какие-либо предложения, это было бы замечательно.