#include "skeleton.h" /* line primitives */ void setbox(line_ptr seg) { int i,x,y; if((seg==NULL) || (seg->pts==NULL)) return; seg->box[0][0] = seg->pts->p[0][0]; seg->box[0][1] = seg->pts->p[0][1]; seg->box[1][0] = seg->pts->p[0][0]; seg->box[1][1] = seg->pts->p[0][1]; for(i=1;inumber;i++) { x = seg->pts->p[i][0]; y = seg->pts->p[i][1]; if(xbox[0][0]) seg->box[0][0] = x; if(x>seg->box[1][0]) seg->box[1][0] = x; if(ybox[0][1]) seg->box[0][1] = y; if(y>seg->box[1][1]) seg->box[1][1] = y; } } line_ptr addpoint(line_ptr seg,int x,int y) { if(seg==NULL) { seg=(line_ptr)malloc(sizeof(struct line)); seg->number = 1; seg->box[0][0] = x; seg->box[1][0] = x; seg->box[0][1] = y; seg->box[1][1] = y; seg->linec = 1; seg->fillc = 0; seg->pts=(struct pts *)malloc(sizeof(struct pts)*POINTS); seg->pts->p[0][0]=x; seg->pts->p[0][1]=y; seg->next = NULL; } else { if(xbox[0][0]) seg->box[0][0] = x; if(x>seg->box[1][0]) seg->box[1][0] = x; if(ybox[0][1]) seg->box[0][1] = y; if(y>seg->box[1][1]) seg->box[1][1] = y; if(seg->number%POINTS==0) seg->pts=(struct pts *)realloc((void *)seg->pts, sizeof(struct pts)*POINTS*(seg->number/POINTS+1), sizeof(struct pts)*POINTS*(seg->number/POINTS)); seg->pts->p[seg->number][0] = x; seg->pts->p[seg->number][1] = y; seg->number = seg->number + 1; } if(seg->number==1) /* a single point is entered twice */ { seg->pts->p[1][0]=x; seg->pts->p[1][1]=y; } return(seg); } line_ptr appendpoint(line_ptr line,int x,int y) { if(line==NULL) return(addpoint(NULL,x,y)); while(line->next!=NULL) line=line->next; return(addpoint(line,x,y)); } void insertpoint(line_ptr seg,int point,int x,int y) { int xs,ys; if(seg==NULL) return; if(point>=seg->number) return((void)addpoint(seg,x,y)); if(xbox[0][0]) seg->box[0][0] = x; if(x>seg->box[1][0]) seg->box[1][0] = x; if(ybox[0][1]) seg->box[0][1] = y; if(y>seg->box[1][1]) seg->box[1][1] = y; if(seg->number%POINTS==0) seg->pts=(struct pts *)realloc((void *)seg->pts, sizeof(struct pts)*POINTS*(seg->number/POINTS+1), sizeof(struct pts)*POINTS*(seg->number/POINTS)); for(;pointnumber;point++) { xs = seg->pts->p[point][0]; ys = seg->pts->p[point][1]; seg->pts->p[point][0] = x; seg->pts->p[point][1] = y; x = xs; y = ys; } seg->pts->p[seg->number][0]=x; seg->pts->p[seg->number][1]=y; seg->number = seg->number + 1; } void deletepoint(line_ptr seg,int point) { if(seg==NULL || point>=seg->number || seg->number==0) return; seg->number = seg->number-1; for(;pointnumber;point++) { seg->pts->p[point][0] = seg->pts->p[point+1][0]; seg->pts->p[point][1] = seg->pts->p[point+1][1]; } if(seg->number%POINTS==0) if(seg->number!=0) seg->pts=(struct pts *)realloc((void *)seg->pts, sizeof(struct pts)*POINTS*(seg->number/POINTS), sizeof(struct pts)*POINTS*(seg->number/POINTS+1)); return; } void movepoint(line_ptr seg,int point,int x,int y) { if(seg==NULL || point>=seg->number) return; seg->pts->p[point][0] = x; seg->pts->p[point][1] = y; if(xbox[0][0]) seg->box[0][0] = x; if(x>seg->box[1][0]) seg->box[1][0] = x; if(ybox[0][1]) seg->box[0][1] = y; if(y>seg->box[1][1]) seg->box[1][1] = y; return; } line_ptr copyline(line_ptr line) { line_ptr newline,seg,last; newline = NULL; last = NULL; while(line!=NULL) { seg=(line_ptr)malloc(sizeof(struct line)); memcpy((char *)seg,(char *)line,sizeof(struct line)); if(seg->pts!=NULL) { seg->pts=(struct pts *) malloc(sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1)); memcpy((char *)seg->pts,(char *)line->pts, seg->number*sizeof(struct pts)); } if(seg->number==1) { seg->pts->p[1][0] = seg->pts->p[0][0]; seg->pts->p[1][1] = seg->pts->p[0][1]; } if(newline==NULL) newline = seg; else last->next = seg; last = seg; line = line->next; } return(newline); } /* line_ptr findpoint(line_ptr line,int x,int y,int *point) { while(line!=NULL) { for(;*point<=line->number;(*point)++) if(x==line->pts->p[*point][0] && y==line->pts->p[*point][1]) return(line); line = line->next; *point = 0; } return(NULL); } */ /* line_ptr findintersect(line_ptr line,int x,int y,int *point) { int x1,y1,x2,y2; while(line!=NULL) { for(;*pointnumber-1;(*point)++) { x1 = line->pts->p[*point][0]; y1 = line->pts->p[*point][1]; x2 = line->pts->p[*point+1][0]; y2 = line->pts->p[*point+1][1]; if(x>=min(x1,x2) && x<=max(x1,x2) && y>=min(y1,y2) && y<=max(y1,y2) && abs((x1-x2)*(y-y1)-(x-x1)*(y1-y2))< min(abs(x1-x2),abs(y1-y2)) ) return(line); } line = line->next; *point = 0; } return(NULL); } */ line_ptr cutseg(line_ptr seg,int point) { line_ptr newseg; if(point>=seg->number) return(NULL); newseg=(line_ptr)malloc(sizeof(struct line)); memcpy((char *)newseg,(char *)seg,sizeof(struct line)); newseg->next = NULL; newseg->number = seg->number-point; newseg->pts=(struct pts *) malloc(sizeof(struct pts)*POINTS*((newseg->number-1)/POINTS+1)); memcpy((char *)newseg->pts,(char *)seg->pts->p[point], newseg->number*sizeof(struct pts)); setbox(newseg); if(newseg->number==1) { newseg->pts->p[1][0] = seg->pts->p[0][0]; newseg->pts->p[1][1] = seg->pts->p[0][1]; } if(seg->number/POINTS != (point+1)/POINTS) seg->pts=(struct pts *)realloc((void *)seg->pts, sizeof(struct pts)*POINTS*(point/POINTS+1), sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1)); seg->number = point + 1; setbox(seg); if(seg->number==1) { seg->pts->p[1][0] = seg->pts->p[0][0]; seg->pts->p[1][1] = seg->pts->p[0][1]; } return(newseg); } /* line_ptr deleteseg(line_ptr seg) { line_ptr next; if(seg==NULL) return(NULL); next = seg->next; free(seg->pts,sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1)); free(seg,sizeof(struct line)); return(next); } */ /* line_ptr cutline(line_ptr line,line_ptr seg) { while(line!=NULL && line->next!=seg) line=line->next; if(line==NULL) return(NULL); line->next = NULL; return(seg); } */ void deleteline(line_ptr line) { line_ptr delete; while(line!=NULL) { delete = line; line = line->next; free(delete->pts,sizeof(struct pts)*POINTS*((delete->number-1)/POINTS+1)); free(delete,sizeof(struct line)); } } void appendline(line_ptr line,line_ptr append) { if(line==NULL) return; while(line->next!=NULL) line=line->next; line->next = append; } /* void scaleline(line_ptr line,int xfact,int yfact) { int i; while(line!=NULL) { line->box[1][0] = (((line->box[1][0]-line->box[0][0]) * xfact)>>8) + line->box[0][0]; line->box[1][1] = (((line->box[1][1]-line->box[0][1]) * yfact)>>8) + line->box[0][1]; for(i=0;inumber;i++) { line->pts->p[i][0] = (((line->pts->p[i][0]-line->box[0][0]) * xfact)>>8) + line->box[0][0]; line->pts->p[i][1] = (((line->pts->p[i][1]-line->box[0][1]) * yfact)>>8) + line->box[0][1]; } line = line->next; } } */