|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.