Annotation of 41BSD/cmd/cifplot/bbox.c, revision 1.1

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/bbox.c                                          *
        !             4: *    Written by Dan Fitzpatrick                                    *
        !             5: *    copyright 1980 -- Regents of the University of California     *
        !             6: *                                                                  *
        !             7: ********************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include "defs.h"
        !            11: #include "globals.h"
        !            12: #include "parser_defs.h"
        !            13: #include "structs.h"
        !            14: #include "alloc.h"
        !            15: 
        !            16: IMPORT transform *MakeTransform();
        !            17: IMPORT transform *Rotate();
        !            18: IMPORT transform *Translate();
        !            19: IMPORT point *MakePoint();
        !            20: IMPORT point *TransPt();
        !            21: IMPORT double cos();
        !            22: 
        !            23: ZeroBBox(bbox)
        !            24: struct BBox *bbox;
        !            25: /* Set bbox to the smallest possible value */
        !            26: {
        !            27:     bbox->xmin = bbox->ymin = INFINITY;
        !            28:     bbox->xmax = bbox->ymax = -INFINITY;
        !            29:     }
        !            30: 
        !            31: ClearBBox(bbox)
        !            32: struct BBox *bbox;
        !            33: /* set all values to 0  */
        !            34: {
        !            35:     bbox->xmin = bbox->ymin = 0;
        !            36:     bbox->xmax = bbox->ymax = 0;
        !            37:     }
        !            38: 
        !            39: MakeBBox(bbox,com)
        !            40: Command *com;
        !            41: struct BBox *bbox;
        !            42: /* The bounding box for the Command 'com' is computed and
        !            43:  * stored in the location pointed to by 'bbox' */
        !            44: {
        !            45:     Command *q;
        !            46:     PointList *p;
        !            47:     point pt,*ptr;
        !            48:     transform *t,*t1;
        !            49:     struct BBox bb;
        !            50:     
        !            51:     ZeroBBox(bbox);
        !            52:     switch(com->type) {
        !            53:        case POINTNAME:
        !            54:                CompPtBBox(bbox,&(com->Ctype.PointName.loc));
        !            55:                break;
        !            56:        case TEXT:
        !            57:                break;
        !            58:        case BOX:
        !            59:                bb.xmin = com->Ctype.Box.bcenter.x
        !            60:                                        - com->Ctype.Box.blength/2.0;
        !            61:                bb.xmax = com->Ctype.Box.bcenter.x
        !            62:                                        + com->Ctype.Box.blength/2.0;
        !            63:                bb.ymin = com->Ctype.Box.bcenter.y
        !            64:                                        - com->Ctype.Box.bwidth/2.0;
        !            65:                bb.ymax = com->Ctype.Box.bcenter.y
        !            66:                                        + com->Ctype.Box.bwidth/2.0;
        !            67:                t = MakeTransform();
        !            68:                t1 = Translate(&(com->Ctype.Box.bcenter),t);
        !            69:                FreeTransform(t);
        !            70:                t = Rotate(&(com->Ctype.Box.bdirect),t1);
        !            71:                FreeTransform(t1);
        !            72:                ptr = MakePoint(-(com->Ctype.Box.bcenter.x),-(com->Ctype.Box.bcenter.y));
        !            73:                t1 = Translate(ptr,t);
        !            74:                Free(ptr); FreeTransform(t);
        !            75:                BBoxTransform(bbox,&bb,t1);
        !            76:                FreeTransform(t1);
        !            77:                break;
        !            78:        case FLASH:
        !            79:            {
        !            80:                real radius;
        !            81:                radius = com->Ctype.Flash.fdia/2.0;
        !            82:                if(circle != 0)
        !            83:                    radius = radius/cos(3.1415926535/(real) circle);
        !            84:                bbox->xmin = com->Ctype.Flash.fcenter.x
        !            85:                                        - radius;
        !            86:                bbox->xmax = com->Ctype.Flash.fcenter.x
        !            87:                                        + radius;
        !            88:                bbox->ymin = com->Ctype.Flash.fcenter.y
        !            89:                                        - radius;
        !            90:                bbox->ymax = com->Ctype.Flash.fcenter.y
        !            91:                                        + radius;
        !            92:                }
        !            93:                break;
        !            94:        case POLYGON:
        !            95:                /* The bounding box must surround every point in the polygon */
        !            96:                for(p=com->Ctype.Path;p != NIL;p=p->PLink) 
        !            97:                        CompPtBBox(bbox,&(p->pt));
        !            98:                break;
        !            99:        case WIRE:
        !           100:            {
        !           101:                real scale;
        !           102:                if(circle == 0)
        !           103:                    scale = 1.0;
        !           104:                  else
        !           105:                    scale = 1.0/cos(3.1415926535/(real) circle);
        !           106:                /* The bounding box surrounds the wire */
        !           107:                for(p=com->Ctype.Wire.WPath;p != NIL;p=p->PLink) 
        !           108:                        CompPtBBox(bbox,&(p->pt));
        !           109:                bbox->xmin -= scale*com->Ctype.Wire.WWidth/2.0;
        !           110:                bbox->ymin -= scale*com->Ctype.Wire.WWidth/2.0;
        !           111:                bbox->xmax += scale*com->Ctype.Wire.WWidth/2.0;
        !           112:                bbox->ymax += scale*com->Ctype.Wire.WWidth/2.0;
        !           113:                }
        !           114:                break;
        !           115:        case SYMBOL:
        !           116:                /* The bounding box must surround every command in the symbol */
        !           117:                for(q=com->Ctype.Symbl.CStart;q != NIL;q=q->CLink){
        !           118:                        CompBBox(bbox,&(q->CBBox));
        !           119:                        }
        !           120:                break;
        !           121:        case CALL:
        !           122:                if(com->Ctype.Call.CSymb == NIL) break;
        !           123:                /* The bounding box must contain all the corners of the
        !           124:                 * symbol's bounding box after it has been transformed */
        !           125:                BBoxTransform(bbox,&(com->Ctype.Call.CSymb->CBBox),
        !           126:                                        com->Ctype.Call.trans);
        !           127:                break;
        !           128:        case ARRAY:
        !           129:                q = com->Ctype.Array.ACom;
        !           130:                MakeBBox(&(q->CBBox),q);
        !           131:                MakeBBox(&(com->CBBox),q);
        !           132:                pt.x = (com->Ctype.Array.Adx < 0) ?
        !           133:                        com->CBBox.xmin + com->Ctype.Array.Adx*(com->Ctype.Array.Am-1):
        !           134:                        com->CBBox.xmax + com->Ctype.Array.Adx*(com->Ctype.Array.Am-1);
        !           135:                pt.y = (com->Ctype.Array.Ady < 0) ?
        !           136:                        com->CBBox.ymin + com->Ctype.Array.Ady*(com->Ctype.Array.An-1):
        !           137:                        com->CBBox.ymax + com->Ctype.Array.Ady*(com->Ctype.Array.An-1);
        !           138:                CompPtBBox(&(com->CBBox),&pt);
        !           139:                bbox->xmin = com->CBBox.xmin;
        !           140:                bbox->xmax = com->CBBox.xmax;
        !           141:                bbox->ymin = com->CBBox.ymin;
        !           142:                bbox->ymax = com->CBBox.ymax;
        !           143:                break;
        !           144:        default:
        !           145:                Error("Attempted to make bounding box for inappropriate command",INTERNAL);
        !           146:        }
        !           147:     }
        !           148: 
        !           149: BBoxTransform(bb,sbb,trans)
        !           150: struct BBox *bb;
        !           151: struct BBox *sbb;
        !           152: transform *trans;
        !           153: /* Transform the bounding box 'sbb' by transform 'trans' and expand
        !           154:  * 'bb' till it contains the transformed 'sbb' bounding box.  */
        !           155: {
        !           156:     real x,y;
        !           157: 
        !           158:     /* For every corner of bounding box 'sbb', transform it and
        !           159:      * make 'bb' contain that transformed corner       */
        !           160:     x = sbb->xmin;     y = sbb->ymin;
        !           161:     Trans(&x,&y,trans);
        !           162:     CompNumBBox(bb,x,y);
        !           163: 
        !           164:     x = sbb->xmax;     y = sbb->ymin;
        !           165:     Trans(&x,&y,trans);
        !           166:     CompNumBBox(bb,x,y);
        !           167: 
        !           168:     x = sbb->xmax;     y = sbb->ymax;
        !           169:     Trans(&x,&y,trans);
        !           170:     CompNumBBox(bb,x,y);
        !           171: 
        !           172:     x = sbb->xmin;     y = sbb->ymax;
        !           173:     Trans(&x,&y,trans);
        !           174:     CompNumBBox(bb,x,y);
        !           175: 
        !           176:     }
        !           177: 
        !           178: CompBBox(bb1,bb2)
        !           179: struct BBox *bb1,*bb2;
        !           180: /* Expand bb1 so that it encloses bb2 */
        !           181: {
        !           182:     if (bb1->xmin > bb2->xmin)
        !           183:        bb1->xmin = bb2->xmin;
        !           184:     if (bb1->ymin > bb2->ymin)
        !           185:        bb1->ymin = bb2->ymin;
        !           186:     if (bb1->xmax < bb2->xmax)
        !           187:        bb1->xmax = bb2->xmax;
        !           188:     if (bb1->ymax < bb2->ymax)
        !           189:        bb1->ymax = bb2->ymax;
        !           190:     }
        !           191: 
        !           192: CompPtBBox(bb,pt)
        !           193: struct BBox *bb;
        !           194: point *pt;
        !           195: /* Expand bb so that it encloses pt */
        !           196: {
        !           197:     if (bb->xmin > pt->x)
        !           198:        bb->xmin = pt->x;
        !           199:     if (bb->ymin > pt->y)
        !           200:        bb->ymin = pt->y;
        !           201:     if (bb->xmax < pt->x)
        !           202:        bb->xmax = pt->x;
        !           203:     if (bb->ymax < pt->y)
        !           204:        bb->ymax = pt->y;
        !           205:     }
        !           206: 
        !           207: CompNumBBox(bb,x,y)
        !           208: struct BBox *bb;
        !           209: real x,y;
        !           210: /* Expand bb so that in encloses (x,y) */
        !           211: {
        !           212:     if (bb->xmin > x)
        !           213:        bb->xmin = x;
        !           214:     if (bb->ymin > y)
        !           215:        bb->ymin = y;
        !           216:     if (bb->xmax < x)
        !           217:        bb->xmax = x;
        !           218:     if (bb->ymax < y)
        !           219:        bb->ymax = y;
        !           220:     }
        !           221:     

unix.superglobalmegacorp.com

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