2015-04-30 3 views
-1

Нижеприведенная программа преобразует тетраэдр в полусферу с использованием функции нормализации. Но никакие функции OpenGL не вызываются при нормализации функции. Только значения нескольких переменных изменяются и даже не передаются другой функции. Как эта функция работает для нормализации?Тайна определяемой пользователем функции нормализации в программе аппроксимации сферы

#include<stdio.h> 
    #include<GL/glut.h> 
    #include<math.h> 
    GLfloat v[4][3]={{0.0,0.0,1.0},{0.0,1.0,0.0},{-1.0,-0.5,0.0},{1.0,-0.5,0.0}}; 
    int n; 
    GLfloat theta[3]={0,0,0}; 
    int axis=2; 

    void normalize(GLfloat *pt) 
    { 
     double d=0; 
     int i; 
     for(i=0;i<3;i++) 
      d+=pt[i]*pt[i]; 
     d=sqrt(d); 
     if(d>0) 
      for(i=0;i<3;i++) 
       pt[i]/=d; 
    } 
    void triangle(GLfloat* a,GLfloat* b,GLfloat* c) 
    { 
    // glBegin(GL_POLYGON); 
     glBegin(GL_LINE_LOOP); 
     glVertex3fv(a); 
     glVertex3fv(b); 
     glVertex3fv(c); 
     glEnd(); 
    } 

    void divide_triangle(GLfloat* a,GLfloat* b,GLfloat* c,int m) 
    { 
     GLfloat v1[3],v2[3],v3[3]; 
     int j; 

     if(m>0) 
     { 
      for(j=0;j<3;j++) 
      { 
       v1[j]=(a[j]+b[j])/2; 
       v2[j]=(a[j]+c[j])/2; 
       v3[j]=(c[j]+b[j])/2; 
      } 

      normalize(v1);   // normalize function called from here 
      normalize(v2); 
      normalize(v3); 

      divide_triangle(a,v1,v2,m-1); 
      divide_triangle(c,v2,v3,m-1); 
      divide_triangle(b,v3,v1,m-1); 
      divide_triangle(v1,v2,v3,m-1); 
     } 
     else 
      triangle(a,b,c); 
    } 

    void tetrahedron(int m) 
    { 
    // glColor3f(0,1,0);      // green 
    // divide_triangle(v[3],v[2],v[1],m);      // bottom face of semi-sphere 
     glColor3f(1,0,0);      // red 
     divide_triangle(v[0],v[1],v[2],m); 
     glColor3f(0,0,1);      // blue 
     divide_triangle(v[0],v[3],v[1],m); 
     glColor3f(0,0,0);      // black 
     divide_triangle(v[0],v[2],v[3],m); 
    } 
    void spin() 
    { 
     theta[axis]=theta[axis]+0.05; 
     if(theta[axis]>0.06) 
      theta[axis]=0; 
     glutPostRedisplay(); 
    } 
    void mouse(int btn,int state, int x,int y) 
    { 
     if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) 
      axis=0; 
     if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN) 
      axis=1; 
     if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN) 
      axis=2; 
    } 

    void display() 
    { 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
     glEnable(GL_DEPTH_TEST); 
     glRotatef(theta[0],1,0,0); // x-axis spin 
     glRotatef(theta[1],0,1,0); // y-axis spin 
     glRotatef(theta[2],0,0,1); // z-axis spin 

     tetrahedron(n); 
     glFlush(); 
    } 

    void myinit() 
    { 
     glClearColor(1,1,1,1); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-2,2,-2,2,-2,2); 
     glMatrixMode(GL_MODELVIEW); 
    } 

    void main() 
    { 
     printf("No of divisions : "); 
     scanf("%d",&n); 
     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); 
     glutInitWindowSize(500,500); 
     glutCreateWindow("3D SEMI SPHERE APPROXIMATION BY SIERPINSKI GASKET "); 
     glutDisplayFunc(display); 
     glutIdleFunc(spin); 
     glutMouseFunc(mouse); 
     myinit(); 
     glutMainLoop(); 
    } 

ответ

1

Программа имеет свою нормализованную функцию. Каждая треугольная грань рекурсивно делится на четыре меньших треугольника равного размера, находя среднюю точку каждого края. Эти середины находятся в неправильном положении, чтобы сидеть на поверхности сферы, поэтому функция нормализации используется для выравнивания радиуса каждой интерполированной точки от центра сферы с радиусом существующих точек. Чем глубже рекурсия, тем ближе к сфере, которую она получает.

Я не знаю, почему вы находите функцию normalize загадкой. Это совершенно нормальный (извините каламбур) способ масштабирования трех компонентов, так что их величина равна 1 (если все не равны 0).

Рекурсивная функция divide_triangle передает каждый под-треугольник в openGL в последней строке triangle(a,b,c);, когда достигается предел глубины рекурсии. Ниже этой глубины треугольники разделены. На этой глубине они передаются графическому движку.

+0

Мой вопрос был не то, почему была использована функция нормализации. Вопрос, который я задавал, - это как работает функция? Поскольку в вышеуказанной нормированной функции нет функций OpenGL, как она может управлять треугольниками? –

+0

OpenGL не имеет монополии. Функция работает путем вычисления величины, а именно квадратного корня из суммы квадратов каждой из трех компонент вектора, а затем масштабирует каждый из этих компонентов, чтобы сделать величину 1. Вот как работает нормализация. –

+0

@VarunSharma Я добавил больше объяснений в ответ. –

Смежные вопросы