Annotation of 40BSD/cmd/cifplot/transforms.c, revision 1.1

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/transforms.c                                    *
        !             4: *    Written by Dan Fitzpatrick                                    *
        !             5: *    copyright 1980 -- Regents of the University of California     *
        !             6: *                                                                  *
        !             7: ********************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <math.h>
        !            11: #include "defs.h"
        !            12: #include "globals.h"
        !            13: #include "parser_defs.h"
        !            14: #include "structs.h"
        !            15: #include "alloc.h"
        !            16: 
        !            17: IMPORT alloc();
        !            18: IMPORT point *MakePoint();
        !            19: IMPORT char *Concat();
        !            20: 
        !            21: transform *CurTransform;
        !            22: struct TCell *TransStack;
        !            23: 
        !            24: transform *
        !            25: MatrixMult(t1,t2)
        !            26: register transform *t1,*t2;
        !            27: /* Return a pointer to a transform that is the product of 't1' & 't2' */
        !            28: {
        !            29:     register transform *out;
        !            30:     /*
        !            31:     int i,j,k;
        !            32:     */
        !            33:     out = GetTransform();
        !            34:     out->refs = 0;
        !            35:     if(output == NOPLOT)
        !            36:        out->TransString = Concat(t1->TransString,t2->TransString,0);
        !            37:     /*
        !            38:     for(i=0; i<3; i++)
        !            39:        for(j=0; j<3; j++)
        !            40:            out->t[i][j] = 0;
        !            41:      for(i=0; i<3; i++)
        !            42:        for(j=0; j<3; j++)
        !            43:            for(k=0; k<3; k++)
        !            44:                out->t[i][j] = out->t[i][j] + t1->t[i][k]*t2->t[k][j];
        !            45:                */
        !            46:      out->t[0][0] = t1->t[0][0]*t2->t[0][0] + t1->t[0][1]*t2->t[1][0];
        !            47:      out->t[0][1] = t1->t[0][0]*t2->t[0][1] + t1->t[0][1]*t2->t[1][1];
        !            48:      out->t[1][0] = t1->t[1][0]*t2->t[0][0] + t1->t[1][1]*t2->t[1][0];
        !            49:      out->t[1][1] = t1->t[1][0]*t2->t[0][1] + t1->t[1][1]*t2->t[1][1];
        !            50:      out->t[2][0] = t1->t[2][0]*t2->t[0][0] + t1->t[2][1]*t2->t[1][0] + t2->t[2][0];
        !            51:      out->t[2][1] = t1->t[2][0]*t2->t[0][1] + t1->t[2][1]*t2->t[1][1] + t2->t[2][1];
        !            52:      return(out);
        !            53:      }
        !            54: 
        !            55: transform *
        !            56: MakeTransform()
        !            57: /* Return a pointer to an identity transform */
        !            58: {
        !            59:     transform *trans;
        !            60:     int i,j;
        !            61:     trans = GetTransform();
        !            62:     if(output == NOPLOT)
        !            63:        trans->TransString = Concat("",0);
        !            64:     trans->refs = 0;
        !            65:     for(i=0; i<3; i++)
        !            66:        for(j=0; j<3; j++)
        !            67:            if (i==j) trans->t[i][i]=1;
        !            68:                  else trans->t[i][j]=0;
        !            69:     return(trans);
        !            70:     }
        !            71: 
        !            72: transform *
        !            73: CopyTransform(t)
        !            74: transform *t;
        !            75: {
        !            76:     transform *temp;
        !            77:     int i,j;
        !            78:     temp = MakeTransform();
        !            79:     for(i=0; i<3; i++)
        !            80:        for(j=0; j<3; j++)
        !            81:                temp->t[i][j] = t->t[i][j];
        !            82:     return(temp);
        !            83:     }
        !            84: 
        !            85: transform *
        !            86: Mirror(ch,trans)
        !            87: char ch;
        !            88: transform *trans;
        !            89: /* Return a pointer to a transform that does a mirroring about the
        !            90:  * axis specified in 'ch' combined with the effect of 'trans' */
        !            91: {
        !            92:     transform *temp,*temp2;
        !            93:     temp = MakeTransform();
        !            94:     if(output == NOPLOT)
        !            95:        Free(temp->TransString);
        !            96:     if(ch == 'y' || ch == 'Y') {
        !            97:        temp->t[1][1] = -1;
        !            98:         if(output == NOPLOT)
        !            99:                temp->TransString = Concat(" MY",0);
        !           100:        }
        !           101:     else if(ch == 'x' || ch == 'X') {
        !           102:        temp->t[0][0] = -1;
        !           103:         if(output == NOPLOT)
        !           104:                temp->TransString = Concat(" MX",0);
        !           105:        }
        !           106:       else {
        !           107:        Error("Mirror call about unknown axis",INTERNAL);
        !           108:         if(output == NOPLOT)
        !           109:                temp->TransString = Concat(" XX",0);
        !           110:        }
        !           111:     temp2 = MatrixMult(temp,trans);
        !           112:     if(output == NOPLOT)
        !           113:        Free(temp->TransString);
        !           114:     FreeTransform(temp);
        !           115:     return(temp2);
        !           116:     }
        !           117: 
        !           118: transform *
        !           119: Rotate(pt,trans)
        !           120: point *pt;
        !           121: transform *trans;
        !           122: /* Return a pointer to a transform that does a rotation to a vector
        !           123:  * specified by 'pt' combined with the effect of trans. */
        !           124: {
        !           125:     transform *temp,*temp2;
        !           126:     real c;
        !           127:     char s[128];
        !           128: 
        !           129:     temp = MakeTransform();
        !           130:     if(output == NOPLOT) {
        !           131:        Free(temp->TransString);
        !           132:        sprintf(s," R %d %d",TRUNC(pt->x), TRUNC(pt->y));
        !           133:        temp->TransString = Concat(s,0);
        !           134:        }
        !           135:     c = (real) sqrt((double) ((pt->x)*(pt->x) + (pt->y)*(pt->y)));
        !           136:     /* Watch out for divide by 0 */
        !           137:     if( -0.00001 <= c && c <= 0.00001 ) Error("Attempted to divide by zero",INTERNAL);
        !           138:     temp->t[0][0] = (pt->x)/c; temp->t[0][1] = (pt->y)/c;
        !           139:     temp->t[1][0] = -(pt->y)/c;        temp->t[1][1] = (pt->x)/c;
        !           140:     temp2 = MatrixMult(temp,trans);
        !           141:     if(output == NOPLOT)
        !           142:        Free(temp->TransString);
        !           143:     FreeTransform(temp);
        !           144:     return(temp2);
        !           145:     }
        !           146: 
        !           147: transform *
        !           148: Translate(pt,trans)
        !           149: point *pt;
        !           150: transform *trans;
        !           151: /* Return a pointer to a transform that translates points by the vector
        !           152:  * 'pt' combined with the effects of 'trans'. */
        !           153: {
        !           154:     transform *temp,*temp2;
        !           155:     char s[128];
        !           156: 
        !           157:     temp = MakeTransform();
        !           158:     if(output == NOPLOT) {
        !           159:        Free(temp->TransString);
        !           160:        sprintf(s," T %d %d",TRUNC(pt->x), TRUNC(pt->y));
        !           161:        temp->TransString = Concat(s,0);
        !           162:        }
        !           163:     temp->t[2][0] = pt->x;
        !           164:     temp->t[2][1] = pt->y;
        !           165:     temp2 = MatrixMult(temp,trans);
        !           166:     if(output == NOPLOT) 
        !           167:        Free(temp->TransString);
        !           168:     FreeTransform(temp);
        !           169:     return(temp2);
        !           170:     }
        !           171: 
        !           172: transform *
        !           173: Scale(a,b,trans)
        !           174: int a,b;
        !           175: transform *trans;
        !           176: /* Return a pointer to a transform that scales points by a/b
        !           177:  * combined with the effects of 'trans'. */
        !           178: {
        !           179:     transform *temp,*temp2;
        !           180:     char s[128];
        !           181: 
        !           182:     temp = MakeTransform();
        !           183:     if(output == NOPLOT) {
        !           184:        Free(temp->TransString);
        !           185:        sprintf(s," S %d %d",a,b);
        !           186:        temp->TransString = Concat(s,0);
        !           187:        }
        !           188:     temp->t[0][0] = ((real) a)/((real) b);
        !           189:     temp->t[1][1] = ((real) a)/((real) b);
        !           190:     temp2 = MatrixMult(temp,trans);
        !           191:     if(output == NOPLOT) 
        !           192:        Free(temp->TransString);
        !           193:     FreeTransform(temp);
        !           194:     return(temp2);
        !           195:     }
        !           196: 
        !           197: /*
        !           198: real
        !           199: MakeFloat(a,b)
        !           200: int a,b;
        !           201: {
        !           202:     real f,d;
        !           203:     int rem;
        !           204:     f = 0.0;
        !           205:     d = 1.0;
        !           206: 
        !           207:     while(b>0) {
        !           208:        rem = b%10;
        !           209:        d = d*0.1;
        !           210:        f = f + ((real) rem)*d;
        !           211:        b = TRUNC(b/10);
        !           212:        }
        !           213:     return(a>=0 ? ((real) a) + f: ((real) a) - f);
        !           214:     }
        !           215:     */
        !           216: 
        !           217: /*
        !           218: transform *
        !           219: ReadTransform(a,b,c,d,e,f,g,h,i,j,k,l,t)
        !           220: int a,b,c,d,e,f;
        !           221: int g,h,i,j,k,l;
        !           222: transform *t;
        !           223: {
        !           224:     transform *temp,*temp2;
        !           225:     temp = MakeTransform();
        !           226:     temp->t[0][0] = MakeFloat(a,b);
        !           227:     temp->t[0][1] = MakeFloat(c,d);
        !           228:     temp->t[1][0] = MakeFloat(e,f);
        !           229:     temp->t[1][1] = MakeFloat(g,h);
        !           230:     temp->t[2][0] = MakeFloat(i,j);
        !           231:     temp->t[2][1] = MakeFloat(k,l);
        !           232:     temp2 = MatrixMult(temp,t);
        !           233:     FreeTransform(temp);
        !           234:     return(temp2);
        !           235:     }
        !           236:     */
        !           237: 
        !           238: /*
        !           239: float MakeFlt(i,d)
        !           240: int i;
        !           241: float d;
        !           242: {
        !           243:     float f;
        !           244: 
        !           245:     f = (i < 0) ? i - d : i + d;
        !           246:     return(f);
        !           247:     }
        !           248: 
        !           249: float Float(ch,f)
        !           250: char ch;
        !           251: float f;
        !           252: {
        !           253:     float d;
        !           254: 
        !           255:     d = 0.1*((float) ((ch -'0') + f));
        !           256:     return(d);
        !           257:     }
        !           258:     */
        !           259: 
        !           260: point *
        !           261: TransPt(pt,trans)
        !           262: point *pt;
        !           263: transform *trans;
        !           264: /* Transform point */
        !           265: {
        !           266:     real x,y;
        !           267: 
        !           268:     x = pt->x*trans->t[0][0] + pt->y*trans->t[1][0] + trans->t[2][0];
        !           269:     y = pt->x*trans->t[0][1] + pt->y*trans->t[1][1] + trans->t[2][1];
        !           270:     return(MakePoint(x,y));
        !           271:     }
        !           272: 
        !           273: Trans(x,y,trans)
        !           274: register real *x,*y;
        !           275: register transform *trans;
        !           276: {
        !           277:     register real z;
        !           278: 
        !           279:     z = *x;
        !           280:     *x = z*trans->t[0][0] + (*y)*trans->t[1][0] + trans->t[2][0];
        !           281:     *y = z*trans->t[0][1] + (*y)*trans->t[1][1] + trans->t[2][1];
        !           282:     }
        !           283: 
        !           284: /*
        !           285: InitTransform()
        !           286: {
        !           287:     TransStack = NIL;
        !           288:     CurTransform = MakeTransform();
        !           289:     }
        !           290: 
        !           291: PushTransform(trans)
        !           292: transform *trans;
        !           293: /* Push the Current Transform on the transform stack. Multiply
        !           294:  * 'trans' by old Current Transform and make the product the
        !           295:  * Current Traansform. */
        !           296:  /*
        !           297: {
        !           298:     struct TCell *p;
        !           299: 
        !           300:     p = (struct TCell *) alloc(sizeof(struct TCell));
        !           301:     p->TPtr = CurTransform;
        !           302:     p->TLink = TransStack;
        !           303:     TransStack = p;
        !           304:     CurTransform = MatrixMult(CurTransform,trans);
        !           305:     return;
        !           306:     }
        !           307: 
        !           308: transform *
        !           309: PopTransform()
        !           310: /* Replace the Current Transform by the top of the transform stack
        !           311:  * and pop the transform stack */
        !           312:  /*
        !           313: {
        !           314:     struct TCell *t;
        !           315: 
        !           316:     if(TransStack == NIL)
        !           317:        Error("Attempted to Pop empty Transform Stack",INTERNAL);
        !           318:     CurTransform = TransStack->TPtr;
        !           319:     t = TransStack;
        !           320:     TransStack = TransStack->TLink;
        !           321:     FreeTransform(t);
        !           322:     return(CurTransform);
        !           323:     }
        !           324:     */

unix.superglobalmegacorp.com

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