2006年11月30日

[計圖]3D Gasket老師版

3D Gasket作業老師自己寫的版本是針對四個平面碎型,但我們照輸本寫的是將一個四面體分成很多很多小的四面體...

3D Gasket divide triangle (Photo from 冰浩)

這是老師版本的,我寫出來哩~

繼續閱讀後有噁心的程式碼


這個程式碼是C,但是不完整,我只是把該宣告的變數跟函式寫出來,實際要怎麼拉界面怎麼調整請自行摸索ˊˇˋ~

GLfloat v[4][3]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333},
 {-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405, -0.333333}}; //四個頂點位置
GLfloat colors[4][3] = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0},
 {0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}}; //四面的顏色
int n = 10;
void triangle( GLfloat *a, GLfloat *b, GLfloat *c )
{
 glVertex3fv( a );
 glVertex3fv( b );
 glVertex3fv( c );
}
void divide_triangle( GLfloat *a, GLfloat *b, GLfloat *c, int m )
{
 GLfloat mid[3][3];
 int j;
 if( m>0 )
 {
  for(j=0; j<3; j++)
   mid[0][j]=(a[j]+b[j])/2;
  for(j=0; j<3; j++)
   mid[1][j]=(a[j]+c[j])/2;
  for(j=0; j<3; j++)
   mid[2][j]=(b[j]+c[j])/2;
 divide_triangle( a, mid[0], mid[1], m-1 );
 divide_triangle( mid[0], b, mid[2], m-1 );
 divide_triangle( mid[1], mid[2], c, m-1 );
 }
 else( triangle(a,b,c) );
}
void axle()
{
 glBegin(GL_LINES); //顯示六個坐標軸正負向
 glColor3f( 1.0, 0.0, 0.0);
 glVertex3f( -50.0, 0.0, 0.0 );
 glVertex3f( 50.0, 0.0, 0.0 );
 glColor3f( 0.0, 1.0, 0.0);
 glVertex3f( 0.0, -50.0, 0.0 );
 glVertex3f( 0.0, 50.0, 0.0 );
 glColor3f( 0.0, 0.0, 1.0);
 glVertex3f( 0.0, 0.0, -50.0 );
 glVertex3f( 0.0, 0.0, 50.0 );
 glEnd();
}
void init( )
{
 glClearColor(0.1,0.1,0.1,1.0);
 gluLookAt( 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
 glEnable( GL_DEPTH_TEST );
 glEnable( GL_COLOR_MATERIAL );
 glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR);
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 glOrtho(-1.0, 1.0, -1.0, 1.0, -10.0, 10.0);
 glMatrixMode(GL_MODELVIEW);
}
void display( )
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glMatrixMode(GL_MODELVIEW);
 axle();
 glPushMatrix();
 
 glBegin(GL_TRIANGLES);
 glColor3fv(colors[0]);
 divide_triangle( v[0], v[1], v[2], n );
 glColor3fv(colors[1]);
 divide_triangle( v[0], v[2], v[3], n );
 glColor3fv(colors[2]);
 divide_triangle( v[0], v[1], v[3], n );
 glColor3fv(colors[3]);
 divide_triangle( v[1], v[2], v[3], n );
 glEnd();
 
 glPopMatrix();
 
 glFlush();
}

結束ˊˇˋ~


Posted by kevingao814 at 樂多Roodo! │17:00 │回應(0)引用(0)├學知識
樂多分類:日記/一般 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/2533731