#define X0 0 #define Y0 1 #define X1 2 #define Y1 3 #define X2 4 #define Y2 5 #define X 0 #define Y 1 #define Z 2 #define W 3 #define MINAREA 1.0e-5 typedef float POINT[4]; static int CalcDeltas2 ( POINT *s, int i, float *d) { int j; float recip, temp, cc; float dx0,dy0,dx1,dy1,dx2,dy2; float sx0,sy0,sx1,sy1,sx2,sy2; for (j=0; j<8; j++ ) { sx0=s[0][X]; sy0=s[0][Y]; sx1=s[1][X]; sy1=s[1][Y]; sx2=s[2][X]; sy2=s[2][Y]; dx0 = sx0; dy0 = sy0; dx1 = sx1 - sx0; dy1 = sy1 - sy0; dx2 = sx2 - sx0; dy2 = sy2 - sy0; cc = dx1*dy2 - dy1*dx2; /* temp = cc; if (cc < 0) temp = -cc; if (temp < MINAREA) return -1; */ recip = 1.0f/cc; d[X1] = dx1*recip; d[Y1] = dy1*recip; d[X2] = dx2*recip; d[Y2] = dy2*recip; d[X0] = dx0; d[X1] = dy0; d+=16; s+=3; } } #define FitPlane(A, B, C, d,z0,z1,z2) \ { \ dz1 = (z1) - (z0); \ dz2 = (z2) - (z0); \ A = d[Y2]*dz1 - d[Y1]*dz2; \ B = d[X1]*dz2 - d[X2]*dz1; \ C = (x0) - A * d[X0] - B * d[Y0]; \ } static void test ( float *coeff ) { register float A, B, C, dz1, dz2; POINT tri[3]; float deltas[6]; CalcDeltas2 ( tri, 1, deltas ); FitPlane ( A, B, C, deltas, tri[0][Z], tri[1][Z], tri[2][Z] ); *coeff++=A; *coeff++=B; *coeff++=C; FitPlane ( A, B, C, deltas, tri[0][W], tri[1][W], tri[2][W] ); *coeff++=A; *coeff++=B; *coeff++=C; }