Python 绘制后使用glOrtho功能,无需重新绘制整个屏幕

Python 绘制后使用glOrtho功能,无需重新绘制整个屏幕,python,opengl,Python,Opengl,我正在使用OpenGL在python中创建一个分形引擎。我基本上创建了一个表示分形的字符串,然后对该字符串进行迭代,并将其解析为一系列点,这些点之间画有直线。由于分形的性质,直到我绘制了分形并获得了最小和最大X和Y值之后,我才知道分形的大小。但是,为了做到这一点,需要增加运行时间。我试图重构我的代码以减少这一步,但在尝试使用glOrtho方法刷新分形的窗口和比例时遇到了障碍。代码基本上是这样运行的: def setup(): glClear(GL_COLOR_BUFFER_BIT | G

我正在使用OpenGL在python中创建一个分形引擎。我基本上创建了一个表示分形的字符串,然后对该字符串进行迭代,并将其解析为一系列点,这些点之间画有直线。由于分形的性质,直到我绘制了分形并获得了最小和最大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调用移动到for循环和硬编码最小值和最大值的上方,它会工作,但当调用位于底部时,它不会调整大小,直到我以某种方式更改窗口,例如最大化它。如果我所问的是可能的,并且任何人都有任何建议,那就太好了

如果我所要求的是可能的话

不,不是。至少在这个水平上没有。OpenGL只是一个渲染API。它不管理场景或对象。它被设计为一个状态机,您可以在其中设置/更改一些状态变量,并绘制受您之前设置的状态影响的调用

格洛托所做的只是修改一个矩阵。通过将该矩阵应用于所有顶点位置,可以在绘制调用期间使用该矩阵,但更改该矩阵不会以任何方式修改帧缓冲区中的内容。它只会影响后面的draw调用

但是,您不必完全重新解析分形。您也可以只将实际顶点数据存储在一个矩阵中,然后使用不同的矩阵重新绘制该数据


请注意,您正在使用的总账已经完全过时,并且已经弃用了十多年。现代岩心剖面GL中没有内置矩阵堆栈,也没有固定的功能管道。您必须编写自己的着色器,并为变换添加自己的参数,还必须获得有关所有这些步骤的完全自由。因此,如果您真的想在2019年编写新的GL代码,我只能建议您学习已经有十年历史的使用核心配置文件的现代方法…

感谢您的回复,在这种情况下,您是否会推荐其他图形库,我唯一现实的要求是能够在二维空间中绘制大量线条,并以某种方式在postWell中缩放图像,我不知道存在哪些图形库可以更好地满足您的需要。然而,绘制一组二维线是OpenGL可以很好地完成的事情,使用现代GL也不难。但是,通过某种方式在post中缩放图像,您实际上是想缩放图像,还是想重新渲染图像的不同部分?这两种方法都可以用GL来实现,我在回答中提到的基本上是第二种方法中最直接的方法。好的,我遇到的限制是,直到画完所有的线,我才知道尺寸。这意味着我不能提前定义矩阵。我的目标是最小化运行时间。我的电脑目前在收集程序当前迭代的数据时被劫持。我将在等待时研究VBO,谢谢。