home *** CD-ROM | disk | FTP | other *** search
- #include "vec4.h"
- #include <geom.h>
- #include <color.h>
- #include <point.h>
- #include "trigrp.h"
-
- extern ColorA GetCmapEntry();
-
-
- /* order is: 2,3,6 */
- /* use 4-tuples so can use library routines on them */
- Transform reftri[NUMGRPS] = {
- { /* 233 */
- {1., 0., 0., 1.},
- {0.57735, 0.816497, 0., 1.},
- {0.57735, 0., 0.816497, 1.},
- {0,0,0,1}},
- { /* 234 */
- {1., 0., 0., 1.},
- {0.816497, 0.57735, 0., 1.},
- {0.707107, 0., 0.707107, 1.},
- {0,0,0,1}},
- { /* 235 */
- {1., 0., 0., 1.},
- {0.934172, 0.356822, 0., 1.},
- {0.850651, 0., 0.525731, 1.},
- {0,0,0,1}},
- { /* 236 */
- {0,0,0,1},
- {.5,0,0,1},
- {0,.866025,0,1},
- {0,0,1,0}},
- { /* 237 */
- {0.49697043, 0., 0., 1.},
- {0.49697043, 0.23932834, 0., 1.},
- {0., 0., 0., 1.},
- {0,0,1,0}}
- };
-
- Transform reftritp[NUMGRPS];
- /* gl routines expect pointers to floats !!???!! */
- float t236[3][4] = {
- {0,0,0,1},
- {.5,0,0,1},
- {0,.866025,0,1}};
-
- Transform ireftri[NUMGRPS];
- Transform gens[NUMGRPS][3] = { /* 4 groups, 3 gens apiece */
- { /* 233 */
- {
- {0., 0.70710678, 0.70710678, 0.},
- {0.70710678, 0.5, -0.5, 0.},
- {0.70710678, -0.5, 0.5, 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., -1., 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., 1., 0., 0.},
- {0., 0., -1., 0.},
- {0., 0., 0., 1.}}},
- {{
- {0.5, 0.70710678, 0.5, 0.},
- {0.70710678, 0., -0.70710678, 0.},
- {0.5, -0.70710678, 0.5, 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., -1., 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., 1., 0., 0.},
- {0., 0., -1., 0.},
- {0., 0., 0., 1.}}},
- {{
- {0.80901699, 0.5, 0.30901699, 0.},
- {0.5, -0.30901699, -0.80901699, 0.},
- {0.30901699, -0.80901699, 0.5, 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., -1., 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {
- {1., 0., 0., 0.},
- {0., 1., 0., 0.},
- {0., 0., -1., 0.},
- {0., 0., 0., 1.}}
- },
-
- { /* 236 */
- {{-0.5, -0.866026, 0, 0.},
- {-0.866026, 0.5, 0, 0.},
- {0., 0, 1, 0.},
- {0.75, 0.433013, 0, 1.}},
- {{-1,0,0,0},
- {0,1,0,0},
- {0,0,1,0},
- {0,0,0,1}},
- {{1,0,0,0},
- {0,-1,0,0},
- {0,0,1,0},
- {0,0,0,1}}},
- { /* 237 */
- {{0.6234898, 0.78183148, 0., 0.},
- {0.78183148, -0.6234898, 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {{1., 0., 0., 0.},
- {0., -1., 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {{-1.6559706, 0., 0., -1.3199388},
- {0., 1., 0., 0.},
- {0., 0., 1., 0.},
- {1.3199388, 0., 0., 1.6559706}},
- /*
- {{-0.5, 0.8660254, 0., 0.},
- {0.8660254, 0.5, 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- {{-1.3201547, 0., 0., -0.86186338},
- {0., 1., 0., 0.},
- {0., 0., 1., 0.},
- {0.86186338, 0., 0., 1.3201547}},
- {{1., 0., 0., 0.},
- {0., -1., 0., 0.},
- {0., 0., 1., 0.},
- {0., 0., 0., 1.}},
- */
- }
- };
-
- Geom *plist = NULL;
- Geom *eucplist = NULL;
-
- compute_gen()
- {
- /* compute the inverse of the reference tri cord system */
- int i, j;
- Transform mm;
- HPoint3 pp1, pp2;
- for (i=0;i<NUMGRPS; ++i) {
- /*TmTranspose(reftri[i], reftritp[i]);*/
- TmInvert(reftri/*tp*/[i], ireftri[i]);
- /* matrices are in the wrong orientation for hg routines */
- /*for (j=0; j<3; ++j) {
- TmTranspose(gens[i][j], mm);
- TmCopy(mm, gens[i][j]);
- }
- */
- }
- }
-
- HPoint3 points[7]; /* Vertices in fundamental domain */
-
- Geom *
- Make2nmFD(bary, active_group, plptr)
- HPoint3 bary;
- Geom *plptr;
- {
- HPoint3 pp, p2, pn, pm;
- Hg4Coord *tp, *tq; /* images of the point */
- float total;
- int i;
-
- if (active_group >= 0 && active_group < 3) { /* spherical triangle */
- Line l1, l2, l3;
- static HPoint3 origin = {0,0,0,1};
- HPoint3 vertex,pt, pp2;
- Plane pl;
-
- PtTransform(reftri/*tp*/[active_group], &bary, &pp);
- tp = (Hg4Coord *) &pp;
- NORMALIZE3( tp ); pp.w = 1.0;
- PtTransform(gens[active_group][0],&pp, &p2);
- tq = (Hg4Coord *) &p2;
- MIDPOINT4( tp, tq, tq)
- PtTransform(gens[active_group][1], &pp,&pn);
- tq = (Hg4Coord *)&pn;
- MIDPOINT4(tp, tq, tq)
- PtTransform(gens[active_group][2],&pp,&pm);
- tq = (Hg4Coord *) ±
- MIDPOINT4(tp, tq, tq)
-
- /* in spherical groups, truncate the corner vertices */
- HLn3From2HPt3s(&l2, reftri[active_group][0], &origin);
- /* compute plane equation for pp,pn,pm */
- HLn3From2HPt3s(&l1, &pp, &pn);
- LnDual(&l1, &l1);
- Hg4AntiContractPijQj(&l1, &pm, &pl);
- LnIntersectPl(&l2, &pl, &pp2);
- Hg4Normalize(&pp2,&pp2);
- points[0] = pp2;
-
- HLn3From2HPt3s(&l2, reftri[active_group][1], &origin);
- /* compute plane equation for pp,pm,p2 */
- HLn3From2HPt3s(&l1, &pp, &pm);
- LnDual(&l1, &l1);
- Hg4AntiContractPijQj(&l1, &p2, &pl);
- LnIntersectPl(&l2, &pl, &pp2);
- Hg4Normalize(&pp2,&pp2);
- points[1] = pp2;
-
- HLn3From2HPt3s(&l2, reftri[active_group][2], &origin);
- /* compute plane equation for pp,p2,pn */
- HLn3From2HPt3s(&l1, &pp, &p2);
- LnDual(&l1, &l1);
- Hg4AntiContractPijQj(&l1, &pn, &pl);
- LnIntersectPl(&l2, &pl, &pp2);
- Hg4Normalize(&pp2,&pp2);
- points[2] = pp2;
-
- } else if (active_group == G_236) {
- PtTransform(reftri/*tp*/[active_group], &bary, &pp);
- tp = (Hg4Coord *) &pp;
- PtTransform(gens[active_group][0],&pp, &p2);
- tq = (Hg4Coord *) &p2;
- MIDPOINT4( tp, tq, tq)
- PtTransform(gens[active_group][1], &pp,&pn);
- tq = (Hg4Coord *) &pn;
- MIDPOINT4(tp, tq, tq)
- PtTransform(gens[active_group][2],&pp,&pm);
- tq = (Hg4Coord *) ±
- MIDPOINT4(tp, tq, tq)
- for (i=0; i<3; ++i)
- points[i] = *(HPoint3 *)reftri[active_group][i];
- } else { /* hyperbolic */
- /* need to replace these midpoint routines with genuine hyp stuff */
- PtTransform(reftri/*tp*/[active_group], &bary, &pp);
- tp = (Hg4Coord *) &pp;
- Hg4Normalize(tp,tp);
-
- PtTransform(gens[active_group][0],&pp, &p2);
- tq = (Hg4Coord *) &p2;
- midpoint31( tp, tq, tq);
- PROJECT4(tq);
-
- PtTransform(gens[active_group][1], &pp,&pn);
- tq = (Hg4Coord *)&pn;
- midpoint31(tp, tq, tq);
- PROJECT4(tq);
-
- PtTransform(gens[active_group][2],&pp,&pm);
- tq = (Hg4Coord *) ±
- midpoint31(tp, tq, tq);
- PROJECT4(tq);
-
-
- for (i=0; i<3; ++i)
- points[i] = *(HPoint3 *)reftri[active_group][i];
- }
-
- /* stuff 4 moving vertices into struct */
- /* order is : pp, p2, pn, pm */
- points[3] = pp;
- points[4] = p2;
- points[5] = pn;
- points[6] = pm;
- GeomCCreate(plptr, (GeomClass *)NULL, CR_POINT4, points, CR_END);
- }
-
- extern Geom *obj[];
-
- /* this is the indices of the vertices inthe 3 quads we produce */
- static table[3][4] = {
- 5,3,6,0,
- 4,1,6,3,
- 5,2,4,3
- };
-
- init_plist(active_group)
- {
- int i,j;
- static int threequads[3] = { 4,4,4 };
- ColorA facecolors[3];
- extern GeomClass *PolyListMethods();
-
- for (i=0; i<3; ++i)
- points[i] = *(HPoint3 *)reftri[active_group][i];
-
- for (i=3; i<7; ++i) /* Clone distinguished point */
- points[i] = points[0];
-
- if (plist == NULL) {
- for(i = 0; i < 3; i++)
- facecolors[i] = GetCmapEntry(i);
-
- plist = GeomCCreate(NULL, PolyListMethods(),
- CR_NPOLY, 3,
- CR_NVERT, threequads,
- CR_VERT, table,
- CR_POLYCOLOR, facecolors,
- CR_POINT4, points,
- CR_END);
- eucplist = GeomCopy(plist);
- } else {
- /* Update vertices */
- GeomCCreate(plist, (GeomClass *)NULL, CR_POINT4, points, CR_END);
- }
- }
-
- midpoint31(p0,p1,m)
- Hg4Coord *p0, *p1, *m;
- {
- float m0,m1;
- int i;
- Hg4Coord p2[4];
-
- VSUB4(p0, p1, p2)
- if (VISZERO4(p2))
- VCOPY4(p0, m)
- else
- {
- m0 = INPRO31(p0, p2);
- m1 = INPRO31(p1, p2);
- for (i=0; i<4; ++i)
- m[i] = m1*p0[i] - m0*p1[i];
- }
- }
-