#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) { float recip, temp, cc; d[X0] = s[0][X]; d[Y0] = s[0][Y]; d[X1] = s[i][X] - s[0][X]; d[Y1] = s[i][Y] - s[0][Y]; d[X2] = s[i+1][X] - s[0][X]; d[Y2] = s[i+1][Y] - s[0][Y]; cc = d[X1]*d[Y2] - d[Y1]*d[X2]; temp = cc; if (cc < 0) temp = -cc; if (temp < MINAREA) return -1; /* is polygon degenerate ? */ recip = 1.0f/cc; d[X1] *= recip; d[Y1] *= recip; d[X2] *= recip; d[Y2] *= recip; return(0); } #define FitPlane(A, B, C, d,x0,x1,x2) \ { \ dz1 = (x1) - (x0); \ dz2 = (x2) - (x0); \ 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; }