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

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/line.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 "out_structs.h"
        !            15: #include <math.h>
        !            16: #include "alloc.h"
        !            17: 
        !            18: IMPORT point *MakePoint();
        !            19: IMPORT point *TransPt();
        !            20: IMPORT real ICompare();
        !            21: IMPORT StartEdgePath();
        !            22: IMPORT iedge *NextEdgePath();
        !            23: IMPORT iedge *EndEdgePath();
        !            24: IMPORT PolyDesc *MakeDesc();
        !            25: IMPORT char *Concat();
        !            26: 
        !            27: #define pi 3.1415926535
        !            28: 
        !            29: MakeLine(rx1,ry1,rx2,ry2,trans)
        !            30: real rx1,rx2,ry1,ry2;
        !            31: transform *trans;
        !            32: {
        !            33:     int i;
        !            34:     iedge *e1,*e2;
        !            35:     real t;
        !            36: 
        !            37:     Trans(&rx1,&ry1,trans);
        !            38:     Trans(&rx2,&ry2,trans);
        !            39:     if(rx1 > rx2)  {  SWAP(rx1,rx2,t); SWAP(ry1,ry2,t);}
        !            40:     /* Now rx1 <= rx2 */
        !            41: 
        !            42:     e1 = GetIEdge();
        !            43:     e1->type = EDGE;
        !            44:     e1->poly = MakeDesc(NIL);
        !            45:     (e1->poly->refs)++;
        !            46: 
        !            47:     e2 = GetIEdge();
        !            48:     e2->type = EDGE;
        !            49:     e2->poly = e1->poly;
        !            50:     (e1->poly->refs)++;
        !            51: 
        !            52:     /* Now convert from CIF units to plotter units */
        !            53:     e1->x1 = e2->x1 = CONVERT(rx1); e1->y1 = e2->y1 = CONVERT(ry1);
        !            54:     e1->x2 = e2->x2 = CONVERT(rx2); e1->y2 = e2->y2 = CONVERT(ry2);
        !            55:     e1->min = e1->x1;
        !            56:     e2->min = e1->x1;
        !            57: 
        !            58:     e1->dir = 1; e2->dir = -1;
        !            59:     if(e2->x1 == e2->x2) { SWAP(e2->y1,e2->y2,i); }
        !            60:     PutUnAct(e1);
        !            61:     PutUnAct(e2);
        !            62:     }
        !            63: 
        !            64: DrawBBox(bb,trans)
        !            65: struct BBox *bb;
        !            66: transform *trans;
        !            67: {
        !            68: 
        !            69:     MakeLine((real) bb->xmin,(real) bb->ymin,(real) bb->xmax,(real) bb->ymin,trans);
        !            70:     MakeLine((real) bb->xmax,(real) bb->ymin,(real) bb->xmax,(real) bb->ymax,trans);
        !            71:     MakeLine((real) bb->xmax,(real) bb->ymax,(real) bb->xmin,(real) bb->ymax,trans);
        !            72:     MakeLine((real) bb->xmin,(real) bb->ymax,(real) bb->xmin,(real) bb->ymin,trans);
        !            73:     }
        !            74: 
        !            75: MakeNgon(n,center,radius,trans,poly)
        !            76: int n;
        !            77: point *center;
        !            78: real radius;
        !            79: transform *trans;
        !            80: PolyDesc *poly;
        !            81: {
        !            82:     real d;
        !            83:     int i;
        !            84:     real x,y;
        !            85:     iedge *e;
        !            86: 
        !            87:     d = -(pi/((real) n));
        !            88:     radius = radius/cos(-d);
        !            89:     x = radius*sin(d)+center->x;  y = radius*cos(d)+center->y;
        !            90: 
        !            91:     StartEdgePath(x,y,trans,poly);
        !            92:     for((i=1,d += (2.0*pi)/((real) n));i<n;(i++,d += (2.0*pi)/((real) n))) {
        !            93:        x = radius*sin(d)+center->x;  y = radius*cos(d)+center->y;
        !            94:        e = NextEdgePath(x,y);
        !            95:        Selector(e);
        !            96:        }
        !            97:     e = EndEdgePath();
        !            98:     Selector(e);
        !            99:     }
        !           100: 
        !           101: Grid()
        !           102: {
        !           103:        double x,y;
        !           104:        char s[512],*str;
        !           105:        if(grid != 0) {
        !           106:            /* Draw vertical grid lines */
        !           107:            x = ((int) (Window.xmin/grid)) * grid;
        !           108:            while(x<Window.xmax) {
        !           109:                if(Window.xmin < x) {
        !           110:                    MakeLine(x,Window.ymin,x,Window.ymax,ident);
        !           111:                    sprintf(s,"%d",(int) x);
        !           112:                    str = Concat(s,0);
        !           113:                    ClipText(str,x,Window.ymax,'r');
        !           114:                    }
        !           115:                x += grid;
        !           116:                }
        !           117:            /* Draw horizontal grid lines */
        !           118:            y = ((int) (Window.ymin/grid)) * grid;
        !           119:            while(y<Window.ymax) {
        !           120:                if(Window.ymin < y) {
        !           121:                    MakeLine(Window.xmin,y,Window.xmax,y,ident);
        !           122:                    sprintf(s,"%d",(int) y);
        !           123:                    str = Concat(s,0);
        !           124:                    ClipText(str,Window.xmax,y,'r');
        !           125:                    }
        !           126:                y += grid;
        !           127:                }
        !           128:            }
        !           129:     }
        !           130: 

unix.superglobalmegacorp.com

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