Trabalho 3 – Clausius Reis (66812)

IA841 – Introdução à modelagem de sólidos

    

O objetivo deste trabalho era implementar as superfícies triangulares de bézier.

 

Para os calculos da superfície de bézier triangular, são utilizados três parâmetros, u, v e w que são chamados de coordenadas baricêntricas.

 

Enquanto a coordenada w não é independente de u e v, (Note que u+v+w=1 para qualquer ponto no domínio), ela é introduzida para enfatizar as propriedades simétricas das coordenadas baricêntrica.

 

 

Uma superfície de bézier triangular é definida por:

 

Abaixo segue um exemplo de como é definida uma malha de bézier triangular cúbica para n=4:

 

 

           

 

O algoritmo foi implementado da seguinte forma:

   void criaBezierTriangular(GL gl) {

 

                               int Index = 0;

 

                               for( int n = 0; n < numeroDivisoes; n++ )

                               {

                                               for( int i = 0; i < numeroDivisoes-n; i++ )

                                               {

                                                               //Calculo as coordenadas baricêntricas

                                                               float lamb_1 = (float)(i)/(numeroDivisoes-1);

                                                               float lamb_2 = (float)(n)/(numeroDivisoes-1);                                              

                                                               float lamb_0 = 1-lamb_1-lamb_2;

 

                                                               //     002

                                                               //   101 011

                                                               // 200 110 020

                                                               Ponto b1_200 = new Ponto(lamb_0*pontosControle[0].x + lamb_1*pontosControle[1].x + lamb_2*pontosControle[4].x,

                                                                                        lamb_0*pontosControle[0].y + lamb_1*pontosControle[1].y + lamb_2*pontosControle[4].y,

                                                                                        lamb_0*pontosControle[0].z + lamb_1*pontosControle[1].z + lamb_2*pontosControle[4].z);

                                                              

                                                               Ponto b1_110 = new Ponto(lamb_0*pontosControle[1].x + lamb_1*pontosControle[2].x + lamb_2*pontosControle[5].x,

                                                                                        lamb_0*pontosControle[1].y + lamb_1*pontosControle[2].y + lamb_2*pontosControle[5].y,

                                                                                        lamb_0*pontosControle[1].z + lamb_1*pontosControle[2].z + lamb_2*pontosControle[5].z);

                                                              

                                                               Ponto b1_020 = new Ponto(lamb_0*pontosControle[2].x + lamb_1*pontosControle[3].x + lamb_2*pontosControle[6].x,

                                                                                        lamb_0*pontosControle[2].y + lamb_1*pontosControle[3].y + lamb_2*pontosControle[6].y,

                                                                                        lamb_0*pontosControle[2].z + lamb_1*pontosControle[3].z + lamb_2*pontosControle[6].z);

                                                              

                                                               Ponto b1_101 = new Ponto(lamb_0*pontosControle[4].x + lamb_1*pontosControle[5].x + lamb_2*pontosControle[7].x,

                                                                                        lamb_0*pontosControle[4].y + lamb_1*pontosControle[5].y + lamb_2*pontosControle[7].y,

                                                                                        lamb_0*pontosControle[4].z + lamb_1*pontosControle[5].z + lamb_2*pontosControle[7].z);

                                                              

                                                               Ponto b1_011 = new Ponto(lamb_0*pontosControle[5].x + lamb_1*pontosControle[6].x + lamb_2*pontosControle[8].x,

                                                                                        lamb_0*pontosControle[5].y + lamb_1*pontosControle[6].y + lamb_2*pontosControle[8].y,

                                                                                        lamb_0*pontosControle[5].z + lamb_1*pontosControle[6].z + lamb_2*pontosControle[8].z);

                                                              

                                                               Ponto b1_002 = new Ponto(lamb_0*pontosControle[7].x + lamb_1*pontosControle[8].x + lamb_2*pontosControle[9].x,

                                                                                        lamb_0*pontosControle[7].y + lamb_1*pontosControle[8].y + lamb_2*pontosControle[9].y,

                                                                                        lamb_0*pontosControle[7].z + lamb_1*pontosControle[8].z + lamb_2*pontosControle[9].z);

 

                                                               //   001

                                                               // 100 010

                                                               Ponto b2_100 = new Ponto(lamb_0*b1_200.x + lamb_1*b1_110.x + lamb_2*b1_101.x,

                                                                                        lamb_0*b1_200.y + lamb_1*b1_110.y + lamb_2*b1_101.y,

                                                                                        lamb_0*b1_200.z + lamb_1*b1_110.z + lamb_2*b1_101.z);

                                                              

                                                               Ponto b2_010 = new Ponto(lamb_0*b1_110.x + lamb_1*b1_020.x + lamb_2*b1_011.x,

                                                                                        lamb_0*b1_110.y + lamb_1*b1_020.y + lamb_2*b1_011.y,

                                                                                        lamb_0*b1_110.z + lamb_1*b1_020.z + lamb_2*b1_011.z);

                                                              

                                                               Ponto b2_001 = new Ponto(lamb_0*b1_101.x + lamb_1*b1_011.x + lamb_2*b1_002.x,

                                                                                        lamb_0*b1_101.y + lamb_1*b1_011.y + lamb_2*b1_002.y,

                                                                                        lamb_0*b1_101.z + lamb_1*b1_011.z + lamb_2*b1_002.z);

 

                                                               pontosSuperficie[Index] = new Ponto(lamb_0*b2_100.x + lamb_1*b2_010.x + lamb_2*b2_001.x,

                                                                lamb_0*b2_100.y + lamb_1*b2_010.y + lamb_2*b2_001.y,

                                                                lamb_0*b2_100.z + lamb_1*b2_010.z + lamb_2*b2_001.z);

 

                                                               gl.glBegin(gl.GL_POINTS);

                                                                  gl.glColor3f(1.0f, 0.0f, 0.0f);

                                                                  gl.glVertex3f((float)pontosSuperficie[Index].x,

                                                                                    (float)pontosSuperficie[Index].y,

                                                                                    (float)pontosSuperficie[Index].z);

                                                                   gl.glEnd();

                           

                                                              Index++;

                                               }

                               }

                }

 

 

 

 

Abaixo seguem algumas imagens do programa em execução:

 

 

 



trabalho3src.zip