Annotation of 43BSD/contrib/X/xgedit/garc.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright    Massachusetts Institute of Technology    1984, 1985    */
        !             4: 
        !             5: #include "gedit.h"
        !             6: 
        !             7: #ifndef lint
        !             8: static char *rcsid_garc_c = "$Header: garc.c,v 10.5 86/02/01 16:18:41 tony Rel $";
        !             9: #endif lint
        !            10: 
        !            11: /* arc drawing routines */
        !            12: 
        !            13: double sqrt(),atan2(),sin(),cos();
        !            14: char *malloc();
        !            15: 
        !            16: /* construct a line object */
        !            17: gptr mline(x1,y1,x2,y2,next)
        !            18:   gptr next;
        !            19:   {    register gptr p;
        !            20: 
        !            21:        if ((p = (gptr)malloc(sizeof(struct segment))) == NULL) {
        !            22:          msg("out of room!");
        !            23:          return(next);
        !            24:        }
        !            25:        p->s.type = SEGMENT;
        !            26:        p->s.next = next;
        !            27:        p->s.parent = NULL;
        !            28:        p->s.x1 = x1;
        !            29:        p->s.y1 = y1;
        !            30:        p->s.x2 = x2;
        !            31:        p->s.y2 = y2;
        !            32:        p->s.angle = 0;
        !            33:        p->s.cache = NULL;
        !            34:        return(p);
        !            35: }
        !            36: 
        !            37: /* rounds the double x off to an integer */
        !            38: int round(x)
        !            39:  double x;
        !            40:   {    register int i;
        !            41:        if (x >= 0.0) i = x+0.5; else i = x-0.5;
        !            42:        return(i);
        !            43:   }
        !            44: 
        !            45: /* compute center from arc end point and radius */
        !            46: circcent(ang,fx,fy,tx,ty,xcp,ycp,rp)
        !            47:  int ang,fx,fy,tx,ty,*xcp,*ycp;
        !            48:  double *rp;
        !            49:   {    double xx,yy,ss,dd,x1,y1;
        !            50: 
        !            51:        xx = tx - fx; yy = ty - fy;
        !            52:        dd = sqrt(xx*xx + yy*yy);       /* length of chord */
        !            53:        if (dd == 0) { *xcp = fx; *ycp = fy; *rp = 0; return; }
        !            54: 
        !            55:        /* radius of arc */
        !            56:        *rp = dd / (2.0 * sin(3.141592653 * ang / 2048.0));
        !            57: 
        !            58:        /* length of perpendicular to chord */
        !            59:        ss = sqrt((*rp)*(*rp) - dd*dd/4.0);
        !            60: 
        !            61:        if (ang > 1024) ss = -ss;
        !            62:        x1 = (tx + fx) / 2.0;   /* compute center point of chord */
        !            63:        y1 = (ty + fy) / 2.0;
        !            64:        x1 -= yy*ss/dd;         /* now compute center of circle */
        !            65:        y1 += xx*ss/dd;
        !            66: 
        !            67:        *xcp = round(x1); *ycp = round(y1);
        !            68: }
        !            69: 
        !            70: /* calculate new arc list */
        !            71: newalist(p,xa,ya,xb,yb)
        !            72:   register struct segment *p;
        !            73:   {    double xx,yy,aa,bb;
        !            74:        double ainc,r;
        !            75:        int ix,iy,xc,yc;
        !            76:        int wherex,wherey;
        !            77: 
        !            78:        if (p->cache != NULL) {
        !            79:          rmalist(p->cache);
        !            80:          p->cache = NULL;
        !            81:        }
        !            82: 
        !            83:        if (p->angle == 0) return;
        !            84:        circcent(p->angle,xa,ya,xb,yb,&xc,&yc,&r);
        !            85: 
        !            86:        if (r < 2.0) {
        !            87:          p->cache = mline(xa-1,ya-1,xa+1,ya-1,p->cache);
        !            88:          p->cache = mline(xa-1,ya,xa+1,ya,p->cache);
        !            89:          p->cache = mline(xa-1,ya+1,xa+1,ya+1,p->cache);
        !            90:          return;
        !            91:        }
        !            92: 
        !            93:        xx = xa-xc; yy = ya-yc;
        !            94:        aa = atan2(yy,xx);
        !            95:        xx = xb-xc; yy = yb-yc;
        !            96:        bb = atan2(yy,xx);
        !            97: 
        !            98:        /* put aa and bb into proper relationship */
        !            99: /*     if (p->angle <= 1024) {
        !           100: */       if (aa > bb) bb += 2*3.141592653;
        !           101: /*     } else {
        !           102:          if (bb > aa) aa += 2*3.141592653;
        !           103:        }
        !           104: */
        !           105:        /* usually 32 lines/arc, but use enough to ensure that there would
        !           106:         * be at least 100 segments for a full circle.
        !           107:         */
        !           108:        ainc = (bb - aa)/32.0;
        !           109:        if (ainc > 0.628) ainc = 0.628;
        !           110:        else if (ainc < -0.628) ainc = -0.628;
        !           111: 
        !           112:        wherex = xa; wherey = ya;
        !           113:        while (1) {
        !           114:          ix = xc + r*cos(aa);
        !           115:          iy = yc + r*sin(aa);
        !           116:          p->cache = mline(wherex,wherey,ix,iy,p->cache);
        !           117:          wherex = ix; wherey = iy;
        !           118:          aa += ainc;
        !           119:          if ((ainc<0 && aa<=bb) || (ainc>=0 && aa>=bb)) break;
        !           120:        };
        !           121:        p->cache = mline(wherex,wherey,xb,yb,p->cache);
        !           122: }

unix.superglobalmegacorp.com

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