static void print1(ptr x, int d) { if (TAG(x, mask_fixnum) == tag_fixnum) { printf("%ld", (long)UNFIX(x)); } else if (TAG(x, mask_pair) == tag_pair) { int len = 0; ptr y; if (d > MAXDEPTH) { printf("(...)"); return; } printf("("); print1(CAR(x), d+1); y = CDR(x); while (TAG(y, mask_pair) == tag_pair && (len < MAXLENGTH-1)) { printf(" "); print1(CAR(y), d+1); y = CDR(y); len++; } if (y != _nil) if (len == MAXLENGTH-1) printf(" ..."); else { printf(" . "); print1(y, d+1); } printf(")"); } else if (TAG(x, mask_vector) == tag_vector) { long i, n; ptr *p; if (d > MAXDEPTH) { printf("#(...)"); return; } printf("#("); n = UNFIX(VECTORLENGTH(x)); p = VECTORDATA(x); i = n > MAXLENGTH ? MAXLENGTH : n; if (i != 0) { print1(*p, d+1); while (--i) { printf(" "); print1(*++p, d+1); } } if (n > MAXLENGTH) printf(" ..."); printf(")"); } else if (TAG(x, mask_procedure) == tag_procedure) { printf("#<procedure>"); } else if (x == _false) { printf("#f"); } else if (x == _true) { printf("#t"); } else if (x == _nil) { printf("()"); } else if (x == _void) { printf("#<void>"); } else { fprintf(stderr, "print (runtime.c): invalid ptr #x%x\n", (unsigned int) x); exit(1); } }
/** Here we define the plane of a polygon (boundary pointarray of a polygon) the plane is stored as a pont in plane (plane.pop) and a normal vector (plane.pv) */ int define_plane(POINTARRAY *pa, PLANE3D *pl) { int i,j, numberofvectors, pointsinslice; POINT3DZ p, p1, p2; double sumx=0; double sumy=0; double sumz=0; double vl; /*vector length*/ VECTOR3D v1, v2, v; if((pa->npoints-1)==3) /*Triangle is special case*/ { pointsinslice=1; } else { pointsinslice=(int) floor((pa->npoints-1)/4); /*divide the pointarray into 4 slices*/ } /*find the avg point*/ for (i=0;i<(pa->npoints-1);i++) { getPoint3dz_p(pa, i, &p); sumx+=p.x; sumy+=p.y; sumz+=p.z; } pl->pop.x=(sumx/(pa->npoints-1)); pl->pop.y=(sumy/(pa->npoints-1)); pl->pop.z=(sumz/(pa->npoints-1)); sumx=0; sumy=0; sumz=0; numberofvectors= floor((pa->npoints-1)/pointsinslice); /*the number of vectors we try can be 3, 4 or 5*/ getPoint3dz_p(pa, 0, &p1); for (j=pointsinslice;j<pa->npoints;j+=pointsinslice) { getPoint3dz_p(pa, j, &p2); if (!get_3dvector_from_points(&(pl->pop), &p1, &v1) || !get_3dvector_from_points(&(pl->pop), &p2, &v2)) return LW_FALSE; /*perpendicular vector is cross product of v1 and v2*/ if (!get_3dcross_product(&v1,&v2, &v)) return LW_FALSE; vl=VECTORLENGTH(v); sumx+=(v.x/vl); sumy+=(v.y/vl); sumz+=(v.z/vl); p1=p2; } pl->pv.x=(sumx/numberofvectors); pl->pv.y=(sumy/numberofvectors); pl->pv.z=(sumz/numberofvectors); return 1; }