/************************************************************************** S K E L E T O N . C ***************************************************************************/ /***************************************************************************** FILENAME : Skeleton.c PURPOSE : Extraction of Skeletal Points Algorithm (EOS Algorithm) *****************************************************************************/ #include #include #include #include #include "isthdefs.h" #include "piece.h" #include extern int image[512][512]; extern int border_x[512][512]; extern int border_y[512][512]; extern int dist_image[512][512]; float skel_distance(); int mat_length = 0; int px[19]; int py[19]; float thetathresh; char skel_strg[79]; #ifdef ROGER #endif /***************************************************************************** *****************************************************************************/ overinskeleton (deltax, deltay, minx, miny, maxx, maxy) int deltax, deltay, minx, miny, maxx, maxy; { int i,j,e, z; /* sprintf (skel_strg, "in overinskel"); printit(skel_strg); printf ("this is in over in skele\n"); waitforkey(); */ for (i=0;i<500;i++) j = i; } /***************************************************************************** PAINT_MEDIAL *****************************************************************************/ skel_paint_medial (deltax, deltay, minx, miny, maxx, maxy) int deltax, deltay, minx, miny, maxx, maxy; { int i,j,e, z; int grey = 1; float p; /* double */ /*sprintf (skel_strg, "before paint it"); printit(skel_strg); waitforkey(); */ p = tan ( (double)(MEDIAL_THETA * (M_PI / 360.0) ) ); thetathresh = (float)(p * p); j = (maxy - miny) / 2; medial_mode(); for (i=1; i<=deltax; i++) { if (image[j][i] != 0) { if (check_euclidean (j,i,minx, miny)) { mat_length = 0; medial_mode(); xxx_follow(j,i, minx, miny); if (mat_length > MEDIAL_LNGTH_THRESH) { /*printf ("mat_length: %d\n", mat_length); */ return(1); } mat_length = 0; } }/* endif*/ } /* end for i*/ } /* end */ /***************************************************************************** FOLLOW *****************************************************************************/ xxx_follow(j,i,minx, miny) int j,i, minx, miny; { int x,y,z, t, grey; VIS$SET_PIXEL (i + minx/*SUN*/,j + miny, 1); /*printf ("follow set_pixel at i %d j %d \n", i + minx,j + miny); */ for (z=1;z<=8;z++) { get_next_neighbor (z, i, j, &x, &y); grey = VIS$GET_PIXEL (x + minx, y + miny); if (grey != 1 && check_euclidean (y,x, minx, miny)) { mat_length++; xxx_follow(y,x, minx, miny); /*printf ("out of recursion at x:%d y:%d\n", i,j ); */ } } /* end for z */ } /* end function */ /***************************************************************************** CHECK_EUCLIDEAN *****************************************************************************/ check_euclidean (j,i, minx, miny) int j,i, minx, miny; { float a,b,c; int z,t; int theta, denom; float dist_ij[8]; px[1] = border_x[j-1][i+1]; py[1] = border_y[j-1][i+1]; px[2] = border_x[j-1][i]; py[2] = border_y[j-1][i]; px[3] = border_x[j-1][i-1]; py[3] = border_y[j-1][i-1]; px[4] = border_x[j][i-1]; py[4] = border_y[j][i-1]; px[5] = border_x[j+1][i-1]; py[5] = border_y[j+1][i-1]; px[6] = border_x[j+1][i]; py[6] = border_y[j+1][i]; px[7] = border_x[j+1][i+1]; py[7] = border_y[j+1][i+1]; px[8] = border_x[j][i+1]; py[8] = border_y[j][i+1]; for (z=1;z<=8;z++) { /*printf ("X: %d Y: %d px[%d]: %d", i, j, z, px[z]); printf (" py[]: %d\n", py[z]); */ if (px[z] == 0) return(0); } for (z = 1; z <= 8; z++) dist_ij[z] = skel_distance (i,j, px[z], py[z]); for (z = 1; z <= 8; z++) { c = dist_ij[z]; for (t = z+1; t <= 8; t++) { if (px[t] != px[t-1] || py[t] != py[t-1]) { a = skel_distance (px[z], py[z], px[t], py[t]); b = dist_ij[t]; if (a > A_LENGTH && b > B_LENGTH && c > C_LENGTH && abs( (int)sqrt(b) - (int)sqrt(c) ) < EPSILON) { denom = abs( (int)(b) - (int)(a) ); if (denom != 0) if ( ( a / (float)denom) > thetathresh ) { dist_image[j][i] = (int)c; return(1); } } /* endif epsilon stuff */ } /* endif not the same as just saw*/ } /* end for t loop */ } /* end for z loop */ return(0); } /* end function */ /************************************************************************** SKEL_DISTANCE ***************************************************************************/ float skel_distance(x1,y1,x2,y2) int x1,y1,x2,y2; { float a,b; float q; a = (float)(x2 - x1); b = (float)(y2 - y1); a = a*a; b = b*b; return ( (float)(a+b) ); } /***************************************************************************** END *****************************************************************************/