Annotation of researchv9/jtools/src/cip/near.c, revision 1.1.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.