wykres funkcji 3 zmiennych

0

Witam,
mam problem z wykreslaniem plaszczyzny opisanej funkcja 3 zmiennych.
Generalnie plaszczyzna jest generowana w ten sposob, ze tworzona jest siatka z trojkatow w osiach x i z, a y jest wyliczane ze wzoru

Plaszczyzna jest wyswietlana prawidlowo np dla funkcji sin(x) tzn
#define F(z,x) sin(z)-sin(x)

jednak nie rozumiem dlaczego w przypadku
#define F(z,x) log(1/cos(z))-log(1/cos(x))
jest wyswietlane niepoprawnie
wzorcowy wykres tej plaszczyzny powinien wygladac mniej wiecej tak:
http://linuxpl.com/~shh/ww/wykres1-jpg.jpg
W gruncie rzeczy to on jest podobny ale dlaczego jest to takie miejsce gdzie zbiegaja sie wszystkie linie?

rowniez w tym przykladzie nie dziala poprawnie obracanie kamery (obraca sie jakby wzgledem tego skupienia linii a nie wzgledem punktu w ktorym akurat znajduje sie kamera).

prosze o pomoc

nie wiem czy to ma jakies znaczenie ale uzywam kompilatora MS Visual C++ 6.0

tutaj wszystkie pliki i biblioteki:
http://linuxpl.com/~shh/ww/glut32.dll
http://linuxpl.com/~shh/ww/OpenGLSB.h
http://linuxpl.com/~shh/ww/WGLEXT.H
http://linuxpl.com/~shh/ww/GLEXT.H
http://linuxpl.com/~shh/ww/glut.h
http://linuxpl.com/~shh/ww/glut32.lib
http://linuxpl.com/~shh/ww/wykres.c
http://linuxpl.com/~shh/ww/wykres.exe

ponizej kod programu

#include "OpenGLSB.h"
//#include <windows.h>
//#include <gl/gl.h>
//#include <gl/glu.h>
#include <math.h>

#define GL_PI   3.14159265358979323846
#define GL_AREA 20   // rozmiar siatki
#define D 0.2f      // gestosc siatki
#define F(z,x) log(1/cos(z))-log(1/cos(x)) // oblicza 3 parametr y

static GLfloat x_pos = 0.0f, y_pos = 30.0f, z_pos = 10.0f;
static GLfloat rotate_x = 120.0f, rotate_y = -1.0f;
 
/**
 * Inicjalizacja kontekstu renderowania
 */
void SetupRC() {
    // Niebieskie tlo
   glClearColor(0.0f, 0.0f, .50f, 1.0f );

}


/**
 * Rysowanie siatki
 */
void DrawGround(void) {
   GLfloat x,z;
   for(x = 0.1f; x<GL_AREA - 1; x+=D)
      for(z = 0.1f; z<GL_AREA - 1; z+=D) {

         glBegin(GL_TRIANGLES);

            glVertex3f(x,F(z,x),z);
            
            glVertex3f(x,F(z+D,x),z+D);

            glVertex3f(x+D,F(z+D,x+D),z+D);

            glVertex3f(x+D,F(z,x+D),z);
   
         glEnd();
      }


}

       
/**
 * Procedura przerysowujaca scene
 */
void RenderScene(void) {

   // Wyswietla tylko siatki wielokatow
   glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);       
   
   // Czyszczenie okna aktualnym kolorem czyszczacym
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();   
    glPushMatrix();
   // Wykonanie obrotow, przesuniec
   glRotatef(rotate_x, -1.0f, 0.0f, 0.0f);
   glRotatef(rotate_y, 0.0f, 1.0f, 0.0f);
   glTranslatef(x_pos, y_pos, z_pos);     
    // Rysowanie siatki
    DrawGround();



    glPopMatrix();
       
    // Zamiana buforow
    glutSwapBuffers();
}



// Reakcje na klawisze
void SpecialKeys(int key, int x, int y) {
    if(key == GLUT_KEY_DOWN) {
        z_pos-=cos(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
        x_pos+=sin(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
        y_pos-=sin(-rotate_x*GL_PI/180);
   }

    if(key == GLUT_KEY_UP) {
        z_pos+=cos(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
        x_pos-=sin(rotate_y*GL_PI/180)*cos(-rotate_x*GL_PI/180);
        y_pos+=sin(-rotate_x*GL_PI/180);
   }

    if(key == GLUT_KEY_LEFT) {
        z_pos+=sin(rotate_y*GL_PI/180);
        x_pos+=cos(rotate_y*GL_PI/180);
   }

    if(key == GLUT_KEY_RIGHT) {
        z_pos-=sin(rotate_y*GL_PI/180);
        x_pos-=cos(rotate_y*GL_PI/180);
   }

    if(key == GLUT_KEY_HOME)
      rotate_x += 1.0f;

    if(key == GLUT_KEY_END)
      rotate_x -= 1.0f;

    if(key == GLUT_KEY_INSERT)
      rotate_y += 1.0f;

    if(key == GLUT_KEY_PAGE_UP)
      rotate_y -= 1.0f;

                             
    // Odswiezenie zawartosci okna
   RenderScene();
    glutPostRedisplay();
}




/**
 * Funkcja zachowujaca odpowiednie proporcje
 * sceny na skutek zmiany rozmiaru okna lub
 * przesuniecia okna
 */
void ChangeSize(int w, int h) {
    GLfloat fAspect;
    // Zabezpieczenie przed dzieleniem przez zero
    if(h == 0)
        h = 1;

    glViewport(0, 0, w, h);
       
    fAspect = (GLfloat)w / (GLfloat)h;

    // Ustalenie ukladu wspolrzednych
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   
    // Ustalenie przestrzeni ograniczajacej
    gluPerspective(35.0f, fAspect, 1.0f, 5000.0f);
       
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800,600);
    glutCreateWindow("wykres");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    glutSpecialFunc(SpecialKeys);

    SetupRC();
   
    glutMainLoop();

    return 0;
} 

0

#dyrektywa #define nie jest najlepszym miejscem na definiowanie wlasnych dzialan, zrob to lepiej w funkcjach i wykorzystaj biblioteke math.h jesli jest w vc

0

no ok, zrobilem w funkcji
inline double fun(float z, float x) { return log(cos(x)/cos(z)); }

jednak nie zmienia to nic
wciaz wszystkie linie wychodza z jednego punktu, jak temu zaradzic?

juz niewazne, poradzilem sobie
po prostu zapomnialem o dziedzine tej funkcji (logarytm liczy sie tylko z liczb dodatnich)

1 użytkowników online, w tym zalogowanych: 0, gości: 1