Annotation of researchv10no/cmd/ccom/vax/tests/4.i, revision 1.1

1.1     ! root        1: extern struct  _iobuf {
        !             2:        int     _cnt;
        !             3:        char    *_ptr;
        !             4:        char    *_base;
        !             5:        short   _flag;
        !             6:        char    _file;
        !             7: } _iob[20];
        !             8: struct _iobuf  *fopen();
        !             9: struct _iobuf  *fdopen();
        !            10: struct _iobuf  *freopen();
        !            11: long   ftell();
        !            12: char   *fgets();
        !            13: typedef struct Triple{
        !            14:        float   x;
        !            15:        float   y;
        !            16:        float   z;
        !            17: }Triple;
        !            18: typedef Triple Color;
        !            19: typedef struct Point {
        !            20:        int type;
        !            21:        long stamp;             
        !            22:        double x;
        !            23:        double y;
        !            24:        double z;
        !            25: } Point;
        !            26: typedef struct Plane {
        !            27:        int type;
        !            28:        long stamp;
        !            29:        double A;
        !            30:        double B;
        !            31:        double C;
        !            32:        double D;
        !            33: } Plane;
        !            34: typedef struct Conic {
        !            35:        int type;
        !            36:        long stamp;
        !            37:        double A;
        !            38:        double B;
        !            39:        double C;
        !            40:        double D;
        !            41:        double E;
        !            42:        double F;
        !            43:        double G;
        !            44:        double H;
        !            45:        double I;
        !            46:        double J;
        !            47: } Conic;
        !            48: typedef struct Transform {
        !            49:        double A, B, C, D;
        !            50:        double E, F, G, H;
        !            51:        double I, J, K, L;
        !            52: } Transform;
        !            53: typedef struct Tpair {
        !            54:        int type;
        !            55:        long stamp;
        !            56:        Transform t;
        !            57:        Transform tinv;
        !            58: } Tpair;
        !            59: typedef struct Ctree {
        !            60:        int type;
        !            61:        int (*test)();
        !            62:        struct Ctree *car;
        !            63:        struct Ctree *cdr;
        !            64: } Ctree;
        !            65: typedef struct Surface {
        !            66:        int type;
        !            67:        short flags;
        !            68:        Triple n;       
        !            69:        short nfacet;
        !            70:        struct{
        !            71:                float m;
        !            72:                float frac;
        !            73:        }facet[5                ];
        !            74:        Triple *Dtab;
        !            75:        Color speccolor;
        !            76:        Color diffcolor;
        !            77:        Color ambcolor;
        !            78:        Color clearcolor;
        !            79: } Surface;
        !            80: typedef struct Object {
        !            81:        int type;
        !            82:        union {
        !            83:                Plane *plane;
        !            84:                Conic *conic;
        !            85:        } surface;
        !            86:        Conic *cover;
        !            87:        Point *center;
        !            88:        struct List *references;
        !            89:        Ctree *ctree;
        !            90:        Tpair *tpair;
        !            91:        Surface *srf;
        !            92:        float minrange1, minrange2;
        !            93:        float Q1, R1, S1, T1;
        !            94:        float Q2, R2, S2, T2;
        !            95:        int (*fun)();
        !            96: } Object;
        !            97: typedef struct View {
        !            98:        int type;
        !            99:        Tpair *tpair;
        !           100:        int style;
        !           101:        Color lightcolor;
        !           102:        Point *viewpoint;
        !           103:        Point *ul_corner, *ll_corner, *lr_corner;       
        !           104:        Plane *screen;
        !           105:        struct List *bin[32             ][32            ];      
        !           106: } View;
        !           107: typedef struct List {
        !           108:        int type;
        !           109:        union {
        !           110:                Point *point;
        !           111:                Object *object;
        !           112:                View *view;
        !           113:                struct List *list;
        !           114:        } car;
        !           115:        struct List *cdr;
        !           116: } List;
        !           117: typedef struct Symbol{
        !           118:        char    *name;
        !           119:        short   type;
        !           120:        union{
        !           121:                double  val;
        !           122:                List    *obj;
        !           123:                Tpair   *tpair;
        !           124:                Triple  *triple;
        !           125:                Surface *srf;
        !           126:        }u;
        !           127:        struct Symbol *next;
        !           128: }Symbol;
        !           129: extern double  range1;
        !           130: extern double  range2;
        !           131: extern long    transform_stamp;
        !           132: extern Color   black;
        !           133: extern Color   fillcolor;
        !           134: extern Color   white;
        !           135: extern List    *scene;
        !           136: extern Point   testpoint;
        !           137: extern Object  *pobject;
        !           138: extern Point   dirnums;
        !           139: extern Transform tnull;
        !           140: extern View    *camera;
        !           141: extern List    *lightsource;
        !           142: extern char    *progname;
        !           143: char           *emalloc();
        !           144: double         Pow();
        !           145: double         setvalue();
        !           146: double         value();
        !           147: double         fsqrt();
        !           148: Color          *create_color();
        !           149: Color          light();
        !           150: Ctree          *and();
        !           151: Ctree          *create_ctree();
        !           152: Ctree          *inside_list();
        !           153: Ctree          *outside_list();
        !           154: List           *cons_list();
        !           155: Object         *adddefn();
        !           156: Object         *boolean();
        !           157: Object         *copy();
        !           158: Object         *inside();
        !           159: Object         *outside();
        !           160: Object         *setobjvalue();
        !           161: Object         *unit_cone();
        !           162: Object         *unit_cube();
        !           163: Object         *unit_disc();
        !           164: Object         *unit_cylinder();
        !           165: Object         *unit_hyperboloid();
        !           166: Object         *unit_paraboloid();
        !           167: Object         *unit_paracylinder();
        !           168: Object         *unit_saddle();
        !           169: Object         *unit_sphere();
        !           170: Object         *unit_square();
        !           171: Point          intersect();
        !           172: Point          min_range();
        !           173: Point          trans_point();
        !           174: Surface                *create_surface();
        !           175: Symbol         *install();
        !           176: Symbol         *lookup();
        !           177: Tpair          *create_tpair();
        !           178: Tpair          *mulmat();
        !           179: Tpair          *matvalue();
        !           180: Tpair          *setmatvalue();
        !           181: Transform      trans_product();
        !           182: Triple         *trivalue();
        !           183: Triple         *settrivalue();
        !           184: Triple         *create_triple();
        !           185: View           *create_view();
        !           186: long transform_stamp = 1;
        !           187: extern double sin(), cos();
        !           188: Transform tnull = {1.0, 0.0, 0.0, 0.0,
        !           189:                   0.0, 1.0, 0.0, 0.0,
        !           190:                   0.0, 0.0, 1.0, 0.0,};
        !           191: Transform
        !           192: trans_product(t1, t2)
        !           193: register Transform *t1, *t2;
        !           194: {
        !           195:        Transform t3;
        !           196:        t3.A = t1->A * t2->A + t1->B * t2->E + t1->C * t2->I;
        !           197:        t3.B = t1->A * t2->B + t1->B * t2->F + t1->C * t2->J;
        !           198:        t3.C = t1->A * t2->C + t1->B * t2->G + t1->C * t2->K;
        !           199:        t3.D = t1->A * t2->D + t1->B * t2->H + t1->C * t2->L + t1->D;
        !           200:        t3.E = t1->E * t2->A + t1->F * t2->E + t1->G * t2->I;
        !           201:        t3.F = t1->E * t2->B + t1->F * t2->F + t1->G * t2->J;
        !           202:        t3.G = t1->E * t2->C + t1->F * t2->G + t1->G * t2->K;
        !           203:        t3.H = t1->E * t2->D + t1->F * t2->H + t1->G * t2->L + t1->H;
        !           204:        t3.I = t1->I * t2->A + t1->J * t2->E + t1->K * t2->I;
        !           205:        t3.J = t1->I * t2->B + t1->J * t2->F + t1->K * t2->J;
        !           206:        t3.K = t1->I * t2->C + t1->J * t2->G + t1->K * t2->K;
        !           207:        t3.L = t1->I * t2->D + t1->J * t2->H + t1->K * t2->L + t1->L;
        !           208:        return t3;
        !           209: }
        !           210: Conic
        !           211: trans_conic(t, c)
        !           212: register Transform *t;
        !           213: register Conic *c;
        !           214: {
        !           215:        Conic nc;
        !           216:        nc.type = 3;
        !           217:        nc.A =  (c->A*t->A*t->A + c->B*t->E*t->E + c->C*t->I*t->I) +
        !           218:                (c->D*t->A*t->E + c->E*t->E*t->I + c->F*t->A*t->I);
        !           219:        nc.B =  (c->A*t->B*t->B + c->B*t->F*t->F + c->C*t->J*t->J) +
        !           220:                (c->D*t->B*t->F + c->E*t->F*t->J + c->F*t->B*t->J);
        !           221:        nc.C =  (c->A*t->C*t->C + c->B*t->G*t->G + c->C*t->K*t->K) +
        !           222:                (c->D*t->C*t->G + c->E*t->G*t->K + c->F*t->C*t->K);
        !           223:        nc.D =  (c->A*t->A*t->B + c->B*t->E*t->F + c->C*t->I*t->J)*2.0 +
        !           224:                c->D*(t->A*t->F + t->B*t->E) +
        !           225:                c->E*(t->E*t->J + t->F*t->I) +
        !           226:                c->F*(t->A*t->J + t->B*t->I);
        !           227:        nc.E =  (c->A*t->B*t->C + c->B*t->F*t->G + c->C*t->J*t->K)*2.0 +
        !           228:                c->D*(t->B*t->G + t->C*t->F) +
        !           229:                c->E*(t->F*t->K + t->G*t->J) +
        !           230:                c->F*(t->B*t->K + t->C*t->J);
        !           231:        nc.F =  (c->A*t->A*t->C + c->B*t->E*t->G + c->C*t->I*t->K)*2.0 +
        !           232:                c->D*(t->A*t->G + t->E*t->C) +
        !           233:                c->E*(t->E*t->K + t->G*t->I) +
        !           234:                c->F*(t->A*t->K + t->C*t->I);
        !           235:        nc.G =  (c->A*t->A*t->D + c->B*t->E*t->H + c->C*t->I*t->L)*2.0 +
        !           236:                c->D*(t->A*t->H + t->D*t->E) +
        !           237:                c->E*(t->E*t->L + t->H*t->I) +
        !           238:                c->F*(t->A*t->L + t->D*t->I) +
        !           239:                c->G*t->A + c->H*t->E + c->I*t->I;
        !           240:        nc.H =  (c->A*t->B*t->D + c->B*t->F*t->H + c->C*t->J*t->L)*2.0 +
        !           241:                c->D*(t->B*t->H + t->D*t->F) +
        !           242:                c->E*(t->F*t->L + t->H*t->J) +
        !           243:                c->F*(t->B*t->L + t->D*t->J) +
        !           244:                c->G*t->B + c->H*t->F + c->I*t->J;
        !           245:        nc.I =  (c->A*t->C*t->D + c->B*t->G*t->H + c->C*t->K*t->L)*2.0 +
        !           246:                c->D*(t->C*t->H + t->D*t->G) +
        !           247:                c->E*(t->G*t->L + t->H*t->K) +
        !           248:                c->F*(t->C*t->L + t->D*t->K) +
        !           249:                c->G*t->C + c->H*t->G + c->I*t->K;
        !           250:        nc.J =  (c->A*t->D*t->D + c->B*t->H*t->H + c->C*t->L*t->L) +
        !           251:                (c->D*t->D*t->H + c->E*t->H*t->L + c->F*t->D*t->L) +
        !           252:                c->G*t->D + c->H*t->H + c->I*t->L +
        !           253:                c->J;
        !           254:        return nc;
        !           255: }
        !           256: Plane
        !           257: trans_plane(t, p)
        !           258: register Transform *t;
        !           259: register Plane *p;
        !           260: {
        !           261:        Plane np;
        !           262:        np.type = 2;
        !           263:        np.A = p->A*t->A + p->B*t->E + p->C*t->I;
        !           264:        np.B = p->A*t->B + p->B*t->F + p->C*t->J;
        !           265:        np.C = p->A*t->C + p->B*t->G + p->C*t->K;
        !           266:        np.D = p->A*t->D + p->B*t->H + p->C*t->L + p->D;
        !           267:        return np;
        !           268: }
        !           269: Point
        !           270: trans_point(t, p)
        !           271: register Transform *t;
        !           272: register Point *p;
        !           273: {
        !           274:        Point np;
        !           275:        np.type = 1;
        !           276:        np.x = t->A*p->x + t->B*p->y + t->C*p->z + t->D;
        !           277:        np.y = t->E*p->x + t->F*p->y + t->G*p->z + t->H;
        !           278:        np.z = t->I*p->x + t->J*p->y + t->K*p->z + t->L;
        !           279:        return np;
        !           280: }
        !           281: do_transform(tp, list)
        !           282: Tpair *tp;
        !           283: register List *list;
        !           284: {
        !           285:        if (!list)
        !           286:                return;
        !           287:        switch (list->type) {
        !           288:        case 1:
        !           289:                if (((Point *)list)->stamp == tp->stamp)
        !           290:                        return;
        !           291:                *((Point *)list) = trans_point(&tp->t, ((Point *)list));
        !           292:                ((Point *)list)->stamp = tp->stamp;
        !           293:                return;
        !           294:        case 3:
        !           295:                if (((Conic *)list)->stamp == tp->stamp)
        !           296:                        return;
        !           297:                *((Conic *)list) = trans_conic(&tp->tinv, ((Conic *)list));
        !           298:                ((Conic *)list)->stamp = tp->stamp;
        !           299:                return;
        !           300:        case 2:
        !           301:                if (((Plane *)list)->stamp == tp->stamp)
        !           302:                        return;
        !           303:                *((Plane *)list) = trans_plane(&tp->tinv, ((Plane *)list));
        !           304:                ((Plane *)list)->stamp = tp->stamp;
        !           305:                return;
        !           306:        case 5:
        !           307:                do_transform(tp, list->car.list);
        !           308:                do_transform(tp, list->cdr);
        !           309:                return;
        !           310:        case 7:
        !           311:                do_transform(tp, ((Ctree *)list)->car);
        !           312:                do_transform(tp, ((Ctree *)list)->cdr);
        !           313:                return;
        !           314:        case 4:
        !           315:                do_transform(tp, ((View *)list)->viewpoint);
        !           316:                do_transform(tp, ((View *)list)->ul_corner);
        !           317:                do_transform(tp, ((View *)list)->ll_corner);
        !           318:                do_transform(tp, ((View *)list)->lr_corner);
        !           319:                do_transform(tp, ((View *)list)->screen);
        !           320:                do_transform(tp, ((View *)list)->tpair);
        !           321:                return;
        !           322:        case 6:
        !           323:                do_transform(tp, ((Object *)list)->surface);
        !           324:                do_transform(tp, ((Object *)list)->cover);
        !           325:                do_transform(tp, ((Object *)list)->references);
        !           326:                do_transform(tp, ((Object *)list)->ctree);
        !           327:                do_transform(tp, ((Object *)list)->tpair);
        !           328:                do_transform(tp, ((Object *)list)->center);
        !           329:                return;
        !           330:        case 8:
        !           331:                if (((Tpair *)list)->stamp == tp->stamp)
        !           332:                        return;
        !           333:                ((Tpair *)list)->t = trans_product(&tp->t, &((Tpair *)list)->t);
        !           334:                ((Tpair *)list)->tinv = trans_product(&((Tpair *)list)->tinv, &tp->tinv);
        !           335:                ((Tpair *)list)->stamp = tp->stamp;
        !           336:        }
        !           337:        return;
        !           338: }
        !           339: translate(x, y, z, list)
        !           340: double x, y, z;
        !           341: List *list;
        !           342: {
        !           343:        Tpair tp;
        !           344:        tp.stamp = transform_stamp++;
        !           345:        tp.type = 8;
        !           346:        tp.t = tnull;
        !           347:        tp.t.A = 1.0;
        !           348:        tp.t.F = 1.0;
        !           349:        tp.t.K = 1.0;
        !           350:        tp.t.D = x;
        !           351:        tp.t.H = y;
        !           352:        tp.t.L = z;
        !           353:        tp.tinv = tp.t;
        !           354:        tp.tinv.D = -x;
        !           355:        tp.tinv.H = -y;
        !           356:        tp.tinv.L = -z;
        !           357:        do_transform(&tp, list);
        !           358: }
        !           359: stretch(x, y, z, list)
        !           360: double x, y, z;
        !           361: List *list;
        !           362: {
        !           363:        Tpair tp;
        !           364:        tp.stamp = transform_stamp++;
        !           365:        tp.type = 8;
        !           366:        tp.t = tnull;
        !           367:        tp.t.A = x;
        !           368:        tp.t.F = y;
        !           369:        tp.t.K = z;
        !           370:        tp.tinv = tnull;
        !           371:        tp.tinv.A = 1.0/x;
        !           372:        tp.tinv.F = 1.0/y;
        !           373:        tp.tinv.K = 1.0/z;
        !           374:        do_transform(&tp, list);
        !           375: }
        !           376: rotateX(theta, list)
        !           377: double theta;
        !           378: List *list;
        !           379: {
        !           380:        Tpair tp;
        !           381:        tp.stamp = transform_stamp++;
        !           382:        tp.type = 8;
        !           383:        theta = theta * 0.0174532925199432957692        ;
        !           384:        tp.t = tnull;
        !           385:        tp.t.A = 1.0;
        !           386:        tp.t.F = cos(theta);
        !           387:        tp.t.G = -sin(theta);
        !           388:        tp.t.J = -tp.t.G;
        !           389:        tp.t.K = tp.t.F;
        !           390:        tp.tinv = tp.t;
        !           391:        tp.tinv.G = -tp.tinv.G;
        !           392:        tp.tinv.J = -tp.tinv.J;
        !           393:        do_transform(&tp, list);
        !           394: }
        !           395: rotateY(theta, list)
        !           396: double theta;
        !           397: List *list;
        !           398: {
        !           399:        Tpair tp;
        !           400: 
        !           401: 
        !           402:        tp.stamp = transform_stamp++;
        !           403:        tp.type = 8;
        !           404:        theta = theta * 0.0174532925199432957692        ;
        !           405:        tp.t = tnull;
        !           406:        tp.t.F = 1.0;
        !           407:        tp.t.A = cos(theta);
        !           408:        tp.t.C = -sin(theta);
        !           409:        tp.t.I = -tp.t.C;
        !           410:        tp.t.K = tp.t.A;
        !           411:        tp.tinv = tp.t;
        !           412:        tp.tinv.C = -tp.tinv.C;
        !           413:        tp.tinv.I = -tp.tinv.I;
        !           414:        do_transform(&tp, list);
        !           415: }
        !           416: rotateZ(theta, list)
        !           417: double theta;
        !           418: List *list;
        !           419: {
        !           420:        Tpair tp;
        !           421: 
        !           422: 
        !           423:        tp.stamp = transform_stamp++;
        !           424:        tp.type = 8;
        !           425:        theta = theta * 0.0174532925199432957692        ;
        !           426:        tp.t = tnull;
        !           427:        tp.t.K = 1.0;
        !           428:        tp.t.A = cos(theta);
        !           429:        tp.t.B = -sin(theta);
        !           430:        tp.t.E = -tp.t.B;
        !           431:        tp.t.F = tp.t.A;
        !           432:        tp.tinv = tp.t;
        !           433:        tp.tinv.B = -tp.tinv.B;
        !           434:        tp.tinv.E = -tp.tinv.E;
        !           435:        do_transform(&tp, list);
        !           436: }
        !           437: Conic
        !           438: tangent_cone(p, c)
        !           439: register Point *p;
        !           440: register Conic *c;
        !           441: {
        !           442:        Conic e;
        !           443:        double f4, fx, fy, fz, fw;
        !           444:        
        !           445:        f4 = (p->x*(c->A*p->x + c->D*p->y + c->F*p->z + c->G) +
        !           446:              p->y*(c->B*p->y + c->E*p->z + c->H) +
        !           447:              p->z*(c->C*p->z + c->I) + c->J) * 4.0;
        !           448:        e.A = f4*c->A;
        !           449:        e.B = f4*c->B;
        !           450:        e.C = f4*c->C;
        !           451:        e.D = f4*c->D;
        !           452:        e.E = f4*c->E;
        !           453:        e.F = f4*c->F;
        !           454:        e.G = f4*c->G;
        !           455:        e.H = f4*c->H;
        !           456:        e.I = f4*c->I;
        !           457:        e.J = f4*c->J;
        !           458:        
        !           459:        fx = 2.0*c->A*p->x + c->D*p->y + c->F*p->z + c->G;
        !           460:        fy = 2.0*c->B*p->y + c->D*p->x + c->E*p->z + c->H;
        !           461:        fz = 2.0*c->C*p->z + c->E*p->y + c->F*p->x + c->I;
        !           462:        fw = 2.0*c->J      + c->G*p->x + c->H*p->y + c->I*p->z;
        !           463:        
        !           464:        e.A -= fx*fx;
        !           465:        e.B -= fy*fy;
        !           466:        e.C -= fz*fz;
        !           467:        e.J -= fw*fw;
        !           468:        e.D -= 2.0*fx*fy;
        !           469:        e.E -= 2.0*fy*fz;
        !           470:        e.F -= 2.0*fz*fx;
        !           471:        e.G -= 2.0*fx*fw;
        !           472:        e.H -= 2.0*fy*fw;
        !           473:        e.I -= 2.0*fz*fw;
        !           474:        return e;
        !           475: }

unix.superglobalmegacorp.com

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