OpenGL中的Lorenz Attractor

时间:2012-09-20 06:22:31

标签: c opengl

我正在尝试使用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();
}

然而,我无法得到合适的吸引力。我相信xyz的公式是正确的。我只是不确定如何以正确的方式显示它以获得正确的吸引力。谢谢你的帮助。以下是我的计划目前推出的内容:

enter image description here您好

1 个答案:

答案 0 :(得分:1)

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

第二次修复后,您会发现这些值超出了您的视觉范围,因此您需要将其缩小。我会在你绘制积分时这样做,所以在你的情况下我会使用glVertex3f(x*.05,y*.05,z*.05)。如果.05太大或太小,请根据您的需要进行调整。

最后确保你的dt值是.001,你的起点应该是x,y和z的1左右。

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