1

我正在尝试使用 OpenGL 在 3D 空间中对 Lorenz 吸引子进行建模。我在显示函数中编写了以下代码:

void display()
{
    //  Clear the image
    glClear(GL_COLOR_BUFFER_BIT);
    //  Reset previous transforms
    glLoadIdentity();
    //  Set view angle
    glRotated(ph,1,0,0);
    glRotated(th,0,1,0);

    glColor3f(1,1,0);
    glPointSize(1);

    float x = 0.1, y = 0.1, z = 0.1;
    glBegin(GL_POINTS);

    int i;    
    for (i = 0; i < initialIterations; i++) {    
        // compute a new point using the strange attractor equations
        float xnew = sigma*(y-x);
        float ynew = x*(r-z) - y;
        float znew = x*y - b*z;
    
        // save the new point
        x = x+xnew*dt;
        y = y+ynew*dt;
        z = z+znew*dt;        
    
        glVertex4f(x,y,z,i);
    }


    glEnd();

    //  Draw axes in white
    glColor3f(1,1,1);
    glBegin(GL_LINES);
    glVertex3d(0,0,0);
    glVertex3d(1,0,0);
    glVertex3d(0,0,0);
    glVertex3d(0,1,0);
    glVertex3d(0,0,0);
    glVertex3d(0,0,1);
    glEnd();
    //  Label axes
    glRasterPos3d(1,0,0);
    Print("X");
    glRasterPos3d(0,1,0);
    Print("Y");
    glRasterPos3d(0,0,1);
    Print("Z");
    //  Display parameters
    glWindowPos2i(5,5);
    Print("View Angle=%d,%d  %s",th,ph,text[mode]);
    //  Flush and swap
    glFlush();
    glutSwapBuffers();
}

但是,我无法获得正确的吸引子。我相信我的x, y,等式z是正确的。我只是不确定如何以正确的方式显示它以获得正确的吸引子。谢谢你的帮助。以下是我的程序目前正在推出的内容:

在此处输入图像描述你好

4

1 回答 1

1

好的,所以我遇到了这个问题,您想做一些事情,首先,当您去绘制点时,glVertex4f()您想要将其更改为glVertex3f或将您的 w 值更改为 1。使用glVertex3f它会将 w 设置为默认为 1。w 值改变了点的缩放比例,所以你最终会得到一些疯狂的数字,i 大约为 50000。

其次,在修复该问题后,您会发现这些值超出了您的可视范围,因此您需要将其按比例缩小。我会在你画点的时候这样做,所以在你的情况下我会使用glVertex3f(x*.05,y*.05,z*.05). 如果 .05 太大或太小,请调整它以满足您的需要。

最后确保您的 dt 值是 0.001,并且 x、y 和 z 的起点应该在 1 左右。

然后理想情况下,您希望将所有这些点放在一个数组中,然后读取该数组以绘制您的点,而不是每次调用 display.xml 时都进行计算。所以在别处进行计算,然后将点发送到显示。希望这有帮助。

于 2012-09-21T02:07:56.320 回答