/* --------------------------------------------------------------------- */ /* - S_CENTROID.C - */ /* --------------------------------------------------------------------- */ /* Filename: S_CENTROID.C - */ /* Description: Contains the centroid stuff for robot golf - */ /* Written by: - */ /* Shawn Lovelidge - */ /* Other authors of this code include: - */ /* Roger W. Webster, Ph.D - */ /* Robot Vision and Artificial Intelligence Lab - */ /* Department of Computer Science - */ /* Millersville University - */ /* Millersville, PA 17551 - */ /* (717) 872-3539 or (717) 872-3860 - */ /* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */ /* - necessary includes & defines for this file - */ /* --------------------------------------------------------------------- */ #include #include #define MAX 450 int hsums[MAX], vsums[MAX]; VIS$CENTROID (minx,miny,maxx,maxy, xcentroid, ycentroid, Area) int minx,miny,maxx,maxy, *xcentroid, *ycentroid,*Area; { int dx = 0,dy = 0,i = 0,j=0; int startx,starty = 0; int distance,sum; *Area = 0; *ycentroid = *xcentroid = 0; starty = startx = 0; distance = sum = 0; dx = maxx - minx; dy = maxy - miny; VIS$VERTICAL_SUMS ( minx,miny,dx,dy,vsums); VIS$HORIZONTAL_SUMS ( minx,miny,dx,dy,hsums); /* VIS$GET_V_SUMS (minx,miny,dx,dy,vsums,&startx); VIS$GET_H_SUMS (minx,miny,dx,dy, hsums,&starty); */ for(i=0;i<=dx;i++) *Area+=vsums[i]; /****************************************************************/ sum=0; distance = 1; for(i=0;i< dy;i++) { sum += (distance * hsums[i]); distance++; } *ycentroid = (round((float) sum /(float) *Area )); sum=0; distance = 1; for(i=0;i< dx;i++) { sum += (distance * vsums[i]); distance++; } *xcentroid = (round((float) sum /(float) *Area)); *ycentroid = *ycentroid + miny; *xcentroid = *xcentroid + minx; } /************************************************************************** G E T _ V _ S U M S ***************************************************************************/ VIS$GET_V_SUMS (minx,miny,dx,dy,vsums,startx) int minx,miny,dx,dy,*vsums,*startx; { int i, j; int values[640]; for (i = 0; i < dx; i++) { vsums[i] = 0; VIS$READ_VERTICAL_LINE (minx+i,miny, dy+10, values); /* RWW */ for (j=0;j< dy;j++) if (values[j] == 1 ) vsums[i] += 1; } i = 0; while (vsums[i++] == 0) ; *startx = i; } /************************************************************************** G E T _ H _ S U M S ***************************************************************************/ VIS$GET_H_SUMS (minx,miny,dx,dy, hsums,starty) int minx,miny,dx,dy, *hsums,*starty; { int i, j; int values[640]; for (i = 0; i < dy; i++) { hsums[i] = 0; VIS$READ_HORIZONTAL_LINE (minx,miny+i, dx+10, values); /* RWW */ for (j=0;j< dx;j++) if (values[j] == 1) hsums[i] += 1; } i = 0; while( hsums[i++] == 0) ; *starty = i; }