Annotation of researchv10no/cmd/ideal/piece.c, revision 1.1

1.1     ! root        1: #include "ideal.h"
        !             2: #include "y.tab.h"
        !             3: 
        !             4: void linecall (linefax)
        !             5: LINEPTR linefax;
        !             6: {
        !             7:        printf ("...line %g %g %g %g\n",
        !             8:                linefax->x0, linefax->y0,
        !             9:                linefax->x1, linefax->y1
        !            10:        );
        !            11: }
        !            12: 
        !            13: void circcall (circfax)
        !            14: CIRCPTR circfax;
        !            15: {
        !            16:        printf ("...circle %g %g %g\n",
        !            17:        circfax->x0, circfax->y0, circfax->r
        !            18:        );
        !            19: }
        !            20: 
        !            21: void arccall (arcfax)
        !            22: ARCPTR arcfax;
        !            23: {
        !            24:        printf ("...arc %g %g %g %g %g %g %g %g %g\n",
        !            25:        arcfax->x0, arcfax->y0,
        !            26:        arcfax->x1, arcfax->y1,
        !            27:        arcfax->x2, arcfax->y2,
        !            28:        arcfax->theta1, arcfax->theta2,
        !            29: 
        !            30:        fabs(arcfax->radius)
        !            31:        );
        !            32: }
        !            33: 
        !            34: void textcall (textfax)
        !            35: TEXTPTR textfax;
        !            36: {
        !            37:        switch (textfax->command) {
        !            38:        case LEFT:
        !            39:                printf ("...left %g %g '%s\n",
        !            40:                        textfax->x0,
        !            41:                        textfax->y0,
        !            42:                        textfax->string
        !            43:                );
        !            44:                break;
        !            45:        case CENTER:
        !            46:                printf ("...center %g %g '%s\n",
        !            47:                        textfax->x0,
        !            48:                        textfax->y0,
        !            49:                        textfax->string
        !            50:                );
        !            51:                break;
        !            52:        case RIGHT:
        !            53:                printf ("...right %g %g '%s\n",
        !            54:                        textfax->x0,
        !            55:                        textfax->y0,
        !            56:                        textfax->string
        !            57:                );
        !            58:                break;
        !            59:        default:
        !            60:                fprintf (stderr, "ideal: textcall: can't happen\n");
        !            61:                break;
        !            62:        }
        !            63: }
        !            64: 
        !            65: void splcall (knotlist)
        !            66: EXPRPTR knotlist;
        !            67: {
        !            68:        printf ("...spline %g %g\n",
        !            69:                Re(((INTLPTR) knotlist->expr)),
        !            70:                Im(((INTLPTR) knotlist->expr))
        !            71:        );
        !            72:        knotlist = knotlist->next;
        !            73:        while (knotlist) {
        !            74:                printf ("...knot %g %g\n",
        !            75:                        Re(((INTLPTR) knotlist->expr)),
        !            76:                        Im(((INTLPTR) knotlist->expr))
        !            77:                );
        !            78:                knotlist = knotlist->next;
        !            79:        }
        !            80:        printf ("...endspline\n");
        !            81: }
        !            82: 
        !            83: #define        maxx    bounds[MAXX]
        !            84: #define        maxy    bounds[MAXY]
        !            85: #define        minx    bounds[MINX]
        !            86: #define        miny    bounds[MINY]
        !            87: 
        !            88: void boundscall (bounds)
        !            89: double bounds[4];
        !            90: {
        !            91:        printf ("...maxx %g\n", maxx);
        !            92:        printf ("...maxy %g\n", maxy);
        !            93:        printf ("...minx %g\n", minx);
        !            94:        printf ("...miny %g\n", miny);
        !            95: }
        !            96: 
        !            97: void bbline (lineseg, bounds)
        !            98: LINEPTR lineseg;
        !            99: double bounds[4];
        !           100: {
        !           101:        maxx = max(maxx, max(lineseg->x0, lineseg->x1));
        !           102:        maxy = max(maxy, max(lineseg->y0, lineseg->y1));
        !           103:        minx = min(minx, min(lineseg->x0, lineseg->x1));
        !           104:        miny = min(miny, min(lineseg->y0, lineseg->y1));
        !           105: }
        !           106: 
        !           107: void bbcirc (circle, bounds)
        !           108: CIRCPTR circle;
        !           109: double bounds[4];
        !           110: {
        !           111:        maxx = max(maxx, circle->x0 + fabs(circle->r));
        !           112:        minx = min(minx, circle->x0 - fabs(circle->r));
        !           113:        maxy = max(maxy, circle->y0 + fabs(circle->r));
        !           114:        miny = min(miny, circle->y0 - fabs(circle->r));
        !           115: }
        !           116: 
        !           117: void bbstring (text, bounds)
        !           118: TEXTPTR text;
        !           119: double bounds[4];
        !           120: {
        !           121:        maxx = max(maxx, text->x0);
        !           122:        minx = min(minx, text->x0);
        !           123:        maxy = max(maxy, text->y0);
        !           124:        miny = min(miny, text->y0);
        !           125: }
        !           126: 
        !           127: /***************************************************************************
        !           128:    bounding box of a circular arc             Eric Grosse  24 May 84
        !           129: 
        !           130: Conceptually, this routine generates a list consisting of the start,
        !           131: end, and whichever north, east, south, and west points lie on the arc.
        !           132: The bounding box is then the range of this list.
        !           133:     list = {start,end}
        !           134:     j = quadrant(start)
        !           135:     k = quadrant(end)
        !           136:     if( j==k && long way 'round )  append north,west,south,east
        !           137:     else
        !           138:       while( j != k )
        !           139:          append center+radius*[j-th of north,west,south,east unit vectors]
        !           140:          j += 1  (mod 4)
        !           141:     return( bounding box of list )
        !           142: The following code implements this, with simple optimizations.
        !           143: ***********************************************************************/
        !           144: 
        !           145: bbarc(arc, bounds)
        !           146: ARCPTR arc;
        !           147: double bounds[4];
        !           148: {
        !           149:   double x0, y0, x1, y1, xc, yc;  /* start, end, center */
        !           150:   double xmin, xmax, ymin, ymax;
        !           151:   /* assumes center isn't too far out */
        !           152:   double r, x, y;
        !           153:   int j, k;
        !           154:   int quadrant();
        !           155:   x0 = arc->x1;
        !           156:   y0 = arc->y1;
        !           157:   x1 = arc->x2;
        !           158:   y1 = arc->y2;
        !           159:   xc = arc->x0;
        !           160:   yc = arc->y0;
        !           161:   x0 -= xc; y0 -= yc;
        !           162:   x1 -= xc; y1 -= yc;
        !           163:   xmin = (x0<x1)?x0:x1; ymin = (y0<y1)?y0:y1;
        !           164:   xmax = (x0>x1)?x0:x1; ymax = (y0>y1)?y0:y1;
        !           165:   r = sqrt(x0*x0+y0*y0);
        !           166:   if(r>0.){
        !           167:     j = quadrant(x0,y0);
        !           168:     k = quadrant(x1,y1);
        !           169:     if((j==k)&&(y1*x0<x1*y0)){
        !           170:       /* viewed as complex numbers, if Im(z1/z0)<0, arc is big */
        !           171:       if( xmin > -r) xmin = -r; if( ymin > -r) ymin = -r;
        !           172:       if( xmax <  r) xmax =  r; if( ymax <  r) ymax =  r;
        !           173:     }else{
        !           174:       while(j!=k){
        !           175:         switch(j){
        !           176:          case 1: if( ymax <  r) ymax =  r; break; /* north */
        !           177:          case 2: if( xmin > -r) xmin = -r; break; /* west */
        !           178:          case 3: if( ymin > -r) ymin = -r; break; /* south */
        !           179:          case 4: if( xmax <  r) xmax =  r; break; /* east */
        !           180:         }
        !           181:         j = j%4 + 1;
        !           182:       }
        !           183:     }
        !           184:   }
        !           185:   xmin += xc; ymin += yc;
        !           186:   xmax += xc; ymax += yc;
        !           187: 
        !           188:   maxx = max(maxx,xmax);
        !           189:   minx = min(minx,xmin);
        !           190:   maxy = max(maxy,ymax);
        !           191:   miny = min(miny,ymin);
        !           192: }
        !           193: 
        !           194: int
        !           195: quadrant(x,y)
        !           196:   double x,y;
        !           197: {
        !           198:   double z=0.;
        !           199:   if(      (x>=z)&&(y> z) ){ return(1); }
        !           200:   else if( (x< z)&&(y>=z) ){ return(2); }
        !           201:   else if( (x<=z)&&(y< z) ){ return(3); }
        !           202:   else if( (x> z)&&(y<=z) ){ return(4); }
        !           203:   else{ fprintf(stderr,"can't happen: x,y=%g,%g",x,y); exit(1);}
        !           204: }
        !           205: 
        !           206: void bbspline (knotlist, bounds)
        !           207: EXPRPTR knotlist;
        !           208: double bounds[4];
        !           209: {
        !           210:        double xmin, xmax, ymin, ymax, x, y;
        !           211:        xmin = xmax = Re(((INTLPTR) knotlist->expr));
        !           212:        ymin = ymax = Im(((INTLPTR) knotlist->expr));
        !           213:        knotlist = knotlist->next;
        !           214:        while (knotlist) {
        !           215:                x = Re(((INTLPTR) knotlist->expr));
        !           216:                xmin = min(xmin, x);
        !           217:                xmax = max(xmax, x);
        !           218:                y = Im(((INTLPTR) knotlist->expr));
        !           219:                ymin = min(ymin, y);
        !           220:                ymax = max(ymax, y);
        !           221:                knotlist = knotlist->next;
        !           222:        }
        !           223:        minx = min(minx, xmin);
        !           224:        maxx = max(maxx, xmax);
        !           225:        miny = min(miny, ymin);
        !           226:        maxy = max(maxy, ymax);
        !           227: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.