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, 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: