Annotation of researchv9/jtools/src/cip/near.c, revision 1.1

1.1     ! root        1: /*
        !             2:   %Z%  %M%  version %I% %Q%of %H% %T%
        !             3:   Last Delta:  %G% %U% to %P%
        !             4: */
        !             5: 
        !             6: #include "cip.h"
        !             7: 
        !             8: extern int gridState;
        !             9: 
        !            10: Point 
        !            11: near(p,h,offset) 
        !            12: Point p, offset; 
        !            13: struct thing *h;
        !            14: {
        !            15:   register struct thing *t;  
        !            16:   register int g; 
        !            17:   register Point *s;
        !            18:   Point stickyPoint[9], found, q; 
        !            19: 
        !            20:   p = sub(p,offset);
        !            21:   found.x=0;  found.y=0; 
        !            22:   t = (h==(struct thing *)NULL)?(struct thing *)NULL:h->next;
        !            23:   if (t != h) {
        !            24:     do {
        !            25:       if (ptinrect(p,inset(t->bb,-nearPT))) {
        !            26:        s = stickyPoint;
        !            27:        if (t->type!=ARC) {
        !            28:          *s++ = t->origin;
        !            29:        }
        !            30:        switch(t->type) {
        !            31:          case LINE: {
        !            32:            *s++ = t->otherValues.end;
        !            33:            *s++ = div(add(t->origin,t->otherValues.end),2);
        !            34:            break;
        !            35:          }
        !            36:          case MACRO:
        !            37:          case BOX: {
        !            38:            *s++ = t->bb.corner;
        !            39:            s->x = t->origin.x; 
        !            40:            s->y = t->bb.corner.y;
        !            41:            s++;
        !            42:            s->x = t->bb.corner.x;
        !            43:            s->y = t->origin.y;
        !            44:            s++;
        !            45:            if (t->type==BOX) {
        !            46:              s->x = t->origin.x;
        !            47:              s->y = (t->origin.y + t->bb.corner.y)/2;
        !            48:              s++;
        !            49:              s->x = (t->origin.x + t->bb.corner.x)/2;
        !            50:              s->y = t->origin.y;
        !            51:              s++;
        !            52:              s->x = t->bb.corner.x;
        !            53:              s->y = (t->origin.y + t->bb.corner.y)/2;
        !            54:              s++;
        !            55:              s->x = (t->origin.x + t->bb.corner.x)/2;
        !            56:              s->y = t->bb.corner.y;
        !            57:              s++;
        !            58:              *s++ = div(add(t->origin,t->bb.corner),2);
        !            59:            }
        !            60:            break;
        !            61:          }
        !            62:          case CIRCLE: {
        !            63:            q.x = 0;
        !            64:            q.y = t->otherValues.radius;
        !            65:            *s++ = add(t->origin,q);
        !            66:            *s++ = sub(t->origin,q);
        !            67:            *s++ = add(t->origin,Pt(q.y,q.x));
        !            68:            *s++ = sub(t->origin,Pt(q.y,q.x));
        !            69:            break;
        !            70:          }
        !            71:          case ELLIPSE: {
        !            72:            q.y = t->otherValues.ellipse.ht>>1;
        !            73:            q.x = t->otherValues.ellipse.wid>>1;
        !            74:            *s++ = add(t->origin,Pt(0,q.y));
        !            75:            *s++ = sub(t->origin,Pt(0,q.y));
        !            76:            *s++ = add(t->origin,Pt(q.x,0));
        !            77:            *s++ = sub(t->origin,Pt(q.x,0));
        !            78:            break;
        !            79:          }
        !            80:          case SPLINE: {
        !            81:            *s++ = 
        !            82:            t->otherValues.spline.plist[t->otherValues.spline.used];
        !            83:            break;
        !            84:          }
        !            85:          case ARC: {
        !            86:            *s++ = t->otherValues.arc.start;
        !            87:            *s++ = t->otherValues.arc.end;
        !            88:            break;
        !            89:          }
        !            90:        }
        !            91:        for (g=0; g<(s-stickyPoint); g++) {
        !            92:          if (distance(p,stickyPoint[g])<nearPT) {
        !            93:            found = stickyPoint[g];
        !            94:          }
        !            95:        }
        !            96:       }
        !            97:       if (found.x==0) {
        !            98:        t = t->next;
        !            99:       }
        !           100:     } while ((t != h)&&(found.x==0));
        !           101:   }
        !           102:   if ((found.x==0) && (gridState==GRIDon)) {
        !           103:     found = sub(mul(div(add(p,offset),8),8),offset);
        !           104:   }
        !           105:   return( (found.x==0 && found.y==0) ? found : add(found,offset) );
        !           106: }

unix.superglobalmegacorp.com

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