/* este programa vai pedindo pontos no espaco e para cada pto, apartir de 2 ptos, ele calcula o baricentro ... (metrica dos candidatos) */ #include #include #define N_PTOS 200 /* num de ptos maximo da nuvem */ #define DIM 3 /* ptos com DIM dimensoes o que implica em matrizes de nptos por DIM */ float erro_pixel; /* erro devido resolucao */ /* baricentro - calcula o baricentro dos ptos e os deslocam em relacao ao baricentro. */ void baricentro(m_3d, centro, nptos) float **m_3d; /* matriz(n x 3) de entrada e saida dos pontos; n=nptos */ int nptos; /* num. de linhas da matriz de entrada */ float *centro; /* retorna um vetor[3] dos ptos do centro */ { int i, j; for(j=0; j4)&&((fabs(d[ip])+g) == fabs(d[ip]))&& ((fabs(d[iq]+g) == fabs(d[iq])))) a[ip][iq] = 0.0; else { if(fabs(a[ip][iq])>tresh) { h = d[iq] - d[ip]; if((fabs(h)+g) == fabs(h)) t = a[ip][iq]/h; else { theta = 0.5*h/a[ip][iq]; t = 1.0/(fabs(theta)+sqrt(1.0+theta*theta)); if(theta < 0.0) t = -t; } c = 1.0/sqrt(1.0+t*t); s = t*c; tau = s/(1.0+c); h = t*a[ip][iq]; z[ip] -= h; z[iq] += h; d[ip] -= h; d[iq] += h; a[ip][iq] = 0.0; for(j=0; j<=(ip-1); j++) { g = a[j][ip]; h = a[j][iq]; a[j][ip] = g-s*(h+g*tau); a[j][iq] = h+s*(g-h*tau); } for(j=ip+1; j<=(iq-1); j++) { g = a[ip][j]; h = a[j][iq]; a[ip][j] = g-s*(h+g*tau); a[j][iq] = h+s*(g-h*tau); } for(j=iq+1; j=p) { k = j; p = d[j]; } } if(k!=i) { d[k] = d[i]; d[i] = p; for(j=0; j