Annotation of 40BSD/cmd/cifplot/line.c, revision 1.1.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.