/************************************************************************** C A N A L Y S . C ***************************************************************************/ /***************************************************************************** FILENAME : canalys.c PURPOSE : Some curvature routines *****************************************************************************/ #include #include #include "/usr/users/header/arrkey.h" #include "statline.h" #include "piece.h" #include "isthdefs.h" #define ISTHBACKOFF 10 extern WINDOW *stdscr; extern WINDOW *drwin,*funcwin; extern inverse_isthmus; extern float distance(); extern double radt,dx,dy,thta; /* Variables !! */ extern float ll; extern int oldsharp,oldzero; char string[80]; /************************************************************************ M R K S T A R T ************************************************************************/ mrkstrt() { showletter(41,round(piece[1].avgx[1])-4,round(piece[1].avgy[1])-5,7); showletter(41,round(piece[2].avgx[1])-4,round(piece[2].avgy[1])-5,7); } #ifdef ROGER /************************************************************************* M R K C O R N E R S **************************************************************************/ mrkcorners(piecenum,thresh,gphabs) int piecenum; float thresh; int gphabs; { int i,j,k,radius,oldindex = 0; float seglen = 0.0; float oldist = -15.0,ldist = 0.0;char gak[10]; piece[piecenum].brknum = 0; /* printf ("thresh = %f\n", thresh); */ for(i=1;i<=piece[piecenum].numinres-1;i++) { if (piece[piecenum].curv[i] != 0) piece[piecenum].radius[i] = 1 / piece[piecenum].curv[i]; else piece[piecenum].radius[i] = 0; if(piece[piecenum].radius[i] < 0.0) piece[piecenum].radius[i] *= -1; ldist += piece[piecenum].l[i]; seglen += piece[piecenum].l[i]; if((piece[piecenum].radius[i] <= thresh)&&((ldist-oldist)>15)) /* This tags a BREAKING POINT */ { piece[piecenum].brknum++; sprintf(gak,"B%d",piece[piecenum].brknum); showstring(gak,round(ldist-4.0),gphabs-5,8); piece[piecenum].brk[piece[piecenum].brknum] = ((i)*resl); oldist = ldist; piece[piecenum].dmtbrk[piece[piecenum].brknum].indexend = i; piece[piecenum].dmtbrk[piece[piecenum].brknum].indexbeg = oldindex; piece[piecenum].dmtbrk[piece[piecenum].brknum].lenseg = seglen; seglen = 0.0; oldindex = i; } } for(i=1;i<=piece[piecenum].brknum;i++) { sprintf(gak,"B%d",i); showstring(gak,round(piece[piecenum].avgx[piece[piecenum].brk[i]])-4,round(piece[piecenum].avgy[piece[piecenum].brk[i]])-5,8); } } #endif /************************************************************************* R O T A T E P **************************************************************************/ rotatep(piecenum, undraw) int piecenum, undraw; { float t,x,y; int i,j,k; char gak[30]; echo(); wmove(funcwin,19,15); waddstr(funcwin,"Enter Theta value => "); wrefresh(funcwin); wscanw(funcwin,"%f",&t); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); drawpiece(piecenum,undraw); draw_all_isthmii (piecenum, undraw, undraw, NO); draw_skeleton(piecenum, undraw); draw_inv_skeleton(piecenum, undraw); center(piecenum); /* RWW */ x= piece[piecenum].centx; y= piece[piecenum].centy; rotatepoly(piecenum,t); center(piecenum); x = (piece[piecenum].centx - x) * -1; y = (piece[piecenum].centy - y); y = 0.0; transpoly(piecenum,x,y); noecho(); wrefresh(funcwin); } /************************************************************************ D R A W P I E C E *************************************************************************/ drawpiece(pcnum,clr) int pcnum,clr; { int i,j,k; /*printf ("draw piece pcnum: %d resl: %d\n", pcnum, resl); */ for(i=1;i<=piece[pcnum].pathcnt-resl;i+=resl) drawline((int)(piece[pcnum].avgx[i]),(int)(piece[pcnum].avgy[i]), (int)(piece[pcnum].avgx[i+resl]),(int)(piece[pcnum].avgy[i+resl]),clr); drawline((int)(piece[pcnum].avgx[i]),(int)(piece[pcnum].avgy[i]), (int)(piece[pcnum].avgx[1]),(int)(piece[pcnum].avgy[1]),clr); } /************************************************************************* T R A N S P **************************************************************************/ transp(piecenum, undraw) int piecenum, undraw; { int x,y; echo(); wmove(funcwin,19,15); waddstr(funcwin,"Enter Delta XX value => "); wrefresh(funcwin); wscanw(funcwin,"%d",&x); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter Delta YY value => "); wrefresh(funcwin); wscanw(funcwin,"%d",&y); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); drawpiece(piecenum,undraw); draw_all_isthmii (piecenum, undraw, undraw, NO); draw_skeleton(piecenum, undraw); draw_inv_skeleton(piecenum, undraw); transpoly(piecenum, (float)x, (float)y ); center(piecenum); noecho(); wrefresh(funcwin); } /************************************************************************* S E L T S H A R P **************************************************************************/ seltsharp(sharp) float *sharp; { float g; echo(); wmove(funcwin,19,15); waddstr(funcwin,"Enter NEW Sharp value => "); wrefresh(funcwin); wscanw(funcwin,"%f",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *sharp = g; } /************************************************************************* SELT_BAND **************************************************************************/ selt_band(band) int *band; { int g; echo(); wstandend(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter the BAND => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *band = g; noecho(); } /************************************************************************* SELT_NO_PIECES **************************************************************************/ selt_no_pieces(pieces) int *pieces; { int g; echo(); wstandend(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter number of pieces => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *pieces = g; noecho(); } /************************************************************************* S E L T R E S L **************************************************************************/ seltresl(resl) int *resl; { int g; echo(); wstandend(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter NEW Resolution => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *resl = g; noecho(); } /************************************************************************* S E L T P I E C E **************************************************************************/ seltpiece(currpiece) int *currpiece; { int g; echo(); wstandend(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter NEW piece number => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *currpiece = g; noecho(); } /************************************************************************* S E L T G P H A B S **************************************************************************/ seltgphabs(gphabs) int *gphabs; { int g; echo(); /*wclear(funcwin); */ wstandend(funcwin); wmove(funcwin,19,15); waddstr(funcwin,"Enter NEW Graph Absolute zero Value => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); wmove(funcwin,19,15); waddstr(funcwin," "); wrefresh(funcwin); *gphabs = g; noecho(); } /************************************************************************* S E L T Z E R O **************************************************************************/ seltzero(xtimes) int *xtimes; { int g; echo(); wmove(funcwin,20,15); waddstr(funcwin,"Enter NEW Xtimes for Average Funct => "); wrefresh(funcwin); wscanw(funcwin,"%d",&g); wrefresh(funcwin); *xtimes = g; } /************************************************************************** G P H C U R V F N T ***************************************************************************/ gphcurvfnt(piecenum,gphabs) int piecenum,gphabs; { int i,j,k; float ldist; int y1,y2; drawline(0,gphabs,511,gphabs,6); ldist = 0.0; for(i=1;i<=piece[piecenum].numinres-2;i++) { ldist += piece[piecenum].l[i]; y1 = gphabs-round(piece[piecenum].curv[i]); y2 = gphabs-round(piece[piecenum].curv[i+1]); if(y1<0) y1 = 0; if(y2<0) y2 = 0; if(y1>480) y1 = 512; if(y2>480) y2 = 512; drawline(round(ldist),y1,round(ldist+piece[piecenum].l[i+1]),y2,3); } } /************************************************************************** G P H C U R V I S T ***************************************************************************/ gphcurvist(piecenum,gphabs,start, end, color) int piecenum,gphabs, start, end, color; { int i,j,k; float ldist; int y1,y2; int temp, p; ldist = 256.0 /*0.0*/; drawline((int)ldist, gphabs,511,gphabs,255); p = piece[piecenum].pathcnt; if (inverse_isthmus) { for(i=end; i>=start; i--) { ldist += piece[piecenum].l[i]; y1 = gphabs+round(piece[piecenum].curv[i]); y2 = gphabs+round(piece[piecenum].curv[i-1]); if(y1<0) y1 = 0; if(y2<0) y2 = 0; if(y1>480) y1 = 512; if(y2>480) y2 = 512; drawline(round(ldist),y1,round(ldist+piece[piecenum].l[i-1]),y2,color); } } /* */ else { for(i=start; i<=end; i++) { ldist += piece[piecenum].l[i % p]; y1 = gphabs-round(piece[piecenum].curv[i % p]); y2 = gphabs-round(piece[piecenum].curv[(i+1) % p]); if(y1<0) y1 = 0; if(y2<0) y2 = 0; if(y1>480) y1 = 512; if(y2>480) y2 = 512; drawline(round(ldist),y1,round(ldist+piece[piecenum].l[(i+1) % p]),y2,color); } } /* end else*/ } /* end function */ /***************************************************************************** GPHISTHMUS *****************************************************************************/ gphisthmus (pcnum) int pcnum; { int y, i; int numisth, index1, index2; int color = 3; if (!inverse_isthmus) { numisth = piece[pcnum].isthnum; for (i=1; i<= numisth; i++) { #ifdef ROGER printf ("index1: %d\n", piece[pcnum].dmtisth[i].indexbeg); printf ("index2: %d\n", piece[pcnum].dmtisth[i].indexend); printf ("length: %d\n", piece[pcnum].dmtisth[i].lenseg); #endif index1 = piece[pcnum].dmtisth[i].indexbeg - ISTHBACKOFF; index1 = (index1 / resl) + 1; index2 = (piece[pcnum].dmtisth[i].indexend + ISTHBACKOFF); y = (int)piece[pcnum].avgy[index2 - ISTHBACKOFF]; index2 = (index2 / resl) + 1; #ifdef ROGER printf ("index1: %d\n", index1); printf ("index2: %d\n", index2); printf ("y: %d\n", y); #endif gph_curv_dist (pcnum, y, index1, index2, color); printstat(piece[pcnum].dmtisth[i].lenseg, piece[pcnum].dmtisth[i].skeldist, piece[pcnum].dmtisth[i].index_dist); color = color + 2; if (numisth > 1) waitforkey(); } } else { numisth = piece[pcnum].inv_isthnum; #ifdef ROGER printf ("INVERSE numisth: %d \n", numisth); #endif for (i=1; i<= numisth; i++) { #ifdef ROGER printf ("index1: %d\n", piece[pcnum].inv_isth[i].indexbeg); printf ("index2: %d\n", piece[pcnum].inv_isth[i].indexend); printf ("length: %d\n", piece[pcnum].inv_isth[i].lenseg); #endif index1 = piece[pcnum].inv_isth[i].indexbeg - ISTHBACKOFF; index1 = (index1 / resl) + 1; index2 = (piece[pcnum].inv_isth[i].indexend + ISTHBACKOFF); y = (int)piece[pcnum].avgy[index2 - ISTHBACKOFF]; index2 = (index2 / resl) + 1; #ifdef ROGER printf ("index1: %d\n", index1); printf ("index2: %d\n", index2); printf ("y: %d\n", y); #endif gph_curv_dist (pcnum, y, index1, index2, color); printstat(piece[pcnum].inv_isth[i].lenseg, piece[pcnum].inv_isth[i].skeldist, piece[pcnum].inv_isth[i].index_dist); color = color + 2; if (numisth > 1) waitforkey(); } } } /* end function */