// determine perpendicular direction from model node // determine contour model nodes // ===================================================================== // PRELIMINARIES #include #define BACK 0 #define FRONT 1 #define CONTOUR 2 #define UNKNOWN 3 typedef struct vertex_struct { float pos[3]; // object space points float mImage[2]; // 'model' image float iImage[2]; // 'image' image float der[3][2]; // first derivative float der2[3][2]; // second derivative float perpendicular[2]; int frontback; int symmetric; } vertex_td; typedef struct face_struct { float area; int vindex[3]; int frontback; } face_td; // ===================================================================== // OBJECT // vertex list and face list // each face is triangle with 3 indices into vertex list int numFaces = 12; int numVerts = 8; int xres=20,yres=20; // x and y res of image static vertex_td varray[8]; static face_td farray[12]; float mTransform[3]; // model translation transformation float iTransform[3]; // image translation transformation static int image[200][200]; // zero or one for now int debug0 = 0; int debug1 = 1; void init_image(void); void generate_images(void); void vertex_get_perpendicular(int,float *,float *); float face_get_area(int); // ===================================================================== // ===================================================================== // IMAGE ROUTINES int main() { init_image(); generate_images(); } // ================================================================= // INIT IMAGE void init_image() { int i,j; iTransform[0] = 0.0; iTransform[1] = 0.0; iTransform[2] = 4.0; mTransform[0] = 1.0; mTransform[1] = 0.0; mTransform[2] = 5.0; varray[0].pos[0] = 1.0; varray[0].pos[1] = 1.0; varray[0].pos[2] = 1.0; varray[0].symmetric = 2; varray[1].pos[0] = 1.0; varray[1].pos[1] = 1.0; varray[1].pos[2] = -1.0; varray[1].symmetric = 1; varray[2].pos[0] = -1.0; varray[2].pos[1] = 1.0; varray[2].pos[2] = -1.0; varray[2].symmetric = 0; varray[3].pos[0] = -1.0; varray[3].pos[1] = 1.0; varray[3].pos[2] = 1.0; varray[3].symmetric = 3; varray[4].pos[0] = 1.0; varray[4].pos[1] = -1.0; varray[4].pos[2] = 1.0; varray[4].symmetric = 6; varray[5].pos[0] = 1.0; varray[5].pos[1] = -1.0; varray[5].pos[2] = -1.0; varray[5].symmetric = 7; varray[6].pos[0] = -1.0; varray[6].pos[1] = -1.0; varray[6].pos[2] = -1.0; varray[6].symmetric = 4; varray[7].pos[0] = -1.0; varray[7].pos[1] = -1.0; varray[7].pos[2] = 1.0; varray[7].symmetric = 5; // top face farray[0].vindex[0] = 0; farray[0].vindex[1] = 1; farray[0].vindex[2] = 3; farray[1].vindex[0] = 1; farray[1].vindex[1] = 2; farray[1].vindex[2] = 3; // x = 1 face farray[2].vindex[0] = 0; farray[2].vindex[1] = 4; farray[2].vindex[2] = 5; farray[3].vindex[0] = 5; farray[3].vindex[1] = 1; farray[3].vindex[2] = 0; // z = -1 face farray[4].vindex[0] = 1; farray[4].vindex[1] = 5; farray[4].vindex[2] = 6; farray[5].vindex[0] = 6; farray[5].vindex[1] = 2; farray[5].vindex[2] = 1; // x = -1 face farray[6].vindex[0] = 2; farray[6].vindex[1] = 6; farray[6].vindex[2] = 3; farray[7].vindex[0] = 3; farray[7].vindex[1] = 6; farray[7].vindex[2] = 7; // z = 1 face farray[8].vindex[0] = 0; farray[8].vindex[1] = 3; farray[8].vindex[2] = 7; farray[9].vindex[0] = 0; farray[9].vindex[1] = 7; farray[9].vindex[2] = 4; // y = -1 face farray[10].vindex[0] = 5; farray[10].vindex[1] = 4; farray[10].vindex[2] = 7; farray[11].vindex[0] = 6; farray[11].vindex[1] = 5; farray[11].vindex[2] = 7; // initialize image array to 0's for (i=0; iy2) { // 1-2 if (y3>y1) { // 3-1-2 xa = x3; ya = y3; xb = x1; yb = y1; xc = x2; yc = y2; } else { // 1-2-3 or 1-3-2 if (y2>y3) { // 1-2-3 xa = x1; ya = y1; xb = x2; yb = y2; xc = x3; yc = y3; } else { // 1-3-2 xa = x1; ya = y1; xb = x3; yb = y3; xc = x2; yc = y2; } } } else { // 2-1 if (y3>y2) { // 3-2-1 xa = x3; ya = y3; xb = x2; yb = y2; xc = x1; yc = y1; } else { // 2-3-1 or 2-1-3 if (y1>y3) { // 2-1-3 xa = x2; ya = y2; xb = x1; yb = y1; xc = x3; yc = y3; } else { // 2-3-1 xa = x2; ya = y2; xb = x3; yb = y3; xc = x1; yc = y1; } } } // split triangle at yb // calculate the left and right x values t = xa + (xc-xa)*(ya-yb)/(ya-yc); if (t>xb) { xl = xb; xr = t; } else { xl = t; xr = xb; } if (debug0) { printf(" %f %f\n %f:%f %f \n %f %f\n", xa,ya,xl,xr,yb,xc,yc); } // fill in the upper triangle dy = ya-yb; dxl = (xl-xa)/dy; dxr = (xr-xa)/dy; xL = xa; xR = xa; yi = (int)(ya); xL = xa + dxl*(ya-yi); xR = xa + dxr*(ya-yi); while (yi > yb) { for (xi=(int)(xL+1); xi<=(int)(xR); xi++) { image[xi][yi] = 1; } xL += dxl; xR += dxr; yi--; } // fill in the lower triangle dy = yb-yc; dxl = (xl-xc)/dy; dxr = (xr-xc)/dy; xL = xc; xR = xc; yi = (int)(yc+1.0); xL = xc + dxl*(yi-yc); xR = xc + dxr*(yi-yc); while (yi < yb) { for (xi=(int)(xL+1); xi<=(int)(xR); xi++) { image[xi][yi] = 1; } xL += dxl; xR += dxr; yi++; } } } // -------------------------------------------------- // process model-image faces for (i=0; i=0; j--) { printf("\n"); for (i=0; i