static void draw_line2( double *x, double *y, int num ) { ARMat *input, *evec; ARVec *ev, *mean; double a, b, c; int i; ev = arVecAlloc( 2 ); mean = arVecAlloc( 2 ); evec = arMatrixAlloc( 2, 2 ); input = arMatrixAlloc( num, 2 ); for( i = 0; i < num; i++ ) { arParamObserv2Ideal( dist_factor, x[i], y[i], &(input->m[i*2+0]), &(input->m[i*2+1]) ); } if( arMatrixPCA(input, evec, ev, mean) < 0 ) exit(0); a = evec->m[1]; b = -evec->m[0]; c = -(a*mean->v[0] + b*mean->v[1]); arMatrixFree( input ); arMatrixFree( evec ); arVecFree( mean ); arVecFree( ev ); draw_warp_line(a, b, c); }
static int arGetLine2(int x_coord[], int y_coord[], int coord_num, int vertex[], double line[4][3], double v[4][2], double *dist_factor) { ARMat *input, *evec; ARVec *ev, *mean; double w1; int st, ed, n; int i, j; ev = arVecAlloc( 2 ); mean = arVecAlloc( 2 ); evec = arMatrixAlloc( 2, 2 ); for( i = 0; i < 4; i++ ) { w1 = (double)(vertex[i+1]-vertex[i]+1) * 0.05 + 0.5; st = (int)(vertex[i] + w1); ed = (int)(vertex[i+1] - w1); n = ed - st + 1; input = arMatrixAlloc( n, 2 ); for( j = 0; j < n; j++ ) { arParamObserv2Ideal( dist_factor, x_coord[st+j], y_coord[st+j], &(input->m[j*2+0]), &(input->m[j*2+1]) ); } if( arMatrixPCA(input, evec, ev, mean) < 0 ) { arMatrixFree( input ); arMatrixFree( evec ); arVecFree( mean ); arVecFree( ev ); return(-1); } line[i][0] = evec->m[1]; line[i][1] = -evec->m[0]; line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]); arMatrixFree( input ); } arMatrixFree( evec ); arVecFree( mean ); arVecFree( ev ); for( i = 0; i < 4; i++ ) { w1 = line[(i+3)%4][0] * line[i][1] - line[i][0] * line[(i+3)%4][1]; if( w1 == 0.0 ) return(-1); v[i][0] = ( line[(i+3)%4][1] * line[i][2] - line[i][1] * line[(i+3)%4][2] ) / w1; v[i][1] = ( line[i][0] * line[(i+3)%4][2] - line[(i+3)%4][0] * line[i][2] ) / w1; } return(0); }
static double check_error( double *x, double *y, int num, double dist_factor[4] ) { ARMat *input, *evec; ARVec *ev, *mean; double a, b, c; double error; int i; ev = arVecAlloc( 2 ); mean = arVecAlloc( 2 ); evec = arMatrixAlloc( 2, 2 ); input = arMatrixAlloc( num, 2 ); for( i = 0; i < num; i++ ) { arParamObserv2Ideal( dist_factor, x[i], y[i], &(input->m[i*2+0]), &(input->m[i*2+1]) ); } if( arMatrixPCA(input, evec, ev, mean) < 0 ) exit(0); a = evec->m[1]; b = -evec->m[0]; c = -(a*mean->v[0] + b*mean->v[1]); error = 0.0; for( i = 0; i < num; i++ ) { error += (a*input->m[i*2+0] + b*input->m[i*2+1] + c) * (a*input->m[i*2+0] + b*input->m[i*2+1] + c); } error /= (a*a + b*b); arMatrixFree( input ); arMatrixFree( evec ); arVecFree( mean ); arVecFree( ev ); return error; }