libs/ck-libs/datatransfer/test_cg3d.C

Go to the documentation of this file.
00001 /*  
00002 Volume calculations for complicated shapes, that
00003 are the intersection of simpler shapes.
00004 
00005 Orion Sky Lawlor, olawlor@acm.org, 2003/2/24
00006 */
00007 #include <stdio.h>
00008 #include <stdlib.h>
00009 #include "cg3d.h"
00010 
00011 using namespace cg3d;
00012 
00014 double randFloat(void) {
00015         return (rand()&0xffFF)*(1.0/(float)0xffFF);
00016 }
00017 
00019 CkVector3d randPoint(void) { 
00020         return CkVector3d(randFloat(),randFloat(),randFloat()); 
00021 }
00022 
00025 CkVector3d randPlane(void) { 
00026         CkVector3d planeOrigin(0,0,0);
00027 #if 0 // Roundoff-friendly perfectly flat plane
00028         CkVector3d planeX(1,0,0); 
00029         CkVector3d planeY(0,1,0);
00030 #else //Roundoff-unfriendly skew plane
00031         CkVector3d planeX(0.7,0.2,0.1);
00032         CkVector3d planeY(0.3,0.8,-0.2);
00033 #endif
00034         return planeOrigin
00035                 +randFloat()*planeX +randFloat()*planeY; 
00036 }
00037 
00038 const int tetTypes=6; //Number of different tet types to generate
00039 
00040 // Create a random tetrahedron using this random source
00041 inline Tet3d randTet(int tetType,PointSet3d *ps) {
00042         CkVector3d A,B,C,D;
00043         do {
00044                 A=randPoint(); B=randPoint(); C=randPoint();
00045                 switch (tetType) 
00046                 { 
00047                 case 0://Totally random tet
00048                         break;
00049                 case 1://Put the entire base in the plane
00050                         A=randPlane(); B=randPlane(); C=randPlane(); break;
00051                 case 2://Put two points in the plane
00052                         A=randPlane(); B=randPlane();break;
00053                 case 3://Fix three points
00054                         A=CkVector3d(0.123,0.234,0.456); /* no break; fallthrough */
00055                 case 4://Fix two points
00056                         B=CkVector3d(0.987,0.876,0.765); /* no break; fallthrough */
00057                 case 5://Fix one point
00058                         C=CkVector3d(0.654,0.543,0.432); break;
00059                 };
00060                 D=randPoint();
00061         } while (tetVolume(A,B,C,D)<1.0e-3);
00062         Tet3d t(ps,A,B,C,D); testShape(t); return t;
00063         // return Tet3d(ps,A,B,C,D);
00064 }
00065 
00066 // Test intersections for a bunch of random tets:
00067 void doTest(int firstTest,int lastTest) {
00068         printf("Running random tests from %d to %d\n",firstTest,lastTest);
00069         int nZero=0, nBig=0;
00070         for (int testNo=firstTest;testNo<lastTest;testNo++) {
00071                 if (testNo%1024==0) {
00072                         printf("."); 
00073                         printf("to %d: (%d zero, %d big)\n",testNo,nZero,nBig);
00074                         nZero=0; nBig=0; 
00075                         fflush(stdout);
00076                 }
00077                 srand(testNo); //Random seed is number of test
00078                 
00079                 int tetType=(int)(0.999*randFloat()*tetTypes); //Encourage degeneracies
00080                 PointSet3d ps;
00081                 Tet3d A(randTet(tetType,&ps));
00082                 Tet3d B(randTet(tetType,&ps));
00083                 
00084                 double volume=intersectDebug(&ps,A,B);
00085                 if (volume==-1) abort(); //Non-manifold error
00086                 if (volume<=0) nZero++;
00087                 if (volume>1.0e-3) nBig++;
00088         }
00089         printf("All tests from %d to %d passed\n",firstTest,lastTest);
00090 }
00091 
00092 
00093 int main(int argc,char *argv[])
00094 {
00095         int firstTest=0, lastTest=2000000000;
00096         if (argc>1) firstTest=atoi(argv[1]);
00097         if (argc>2) lastTest=atoi(argv[2]);
00098         doTest(firstTest,lastTest);
00099 
00100         return 0;
00101 }
00102 
00103 

Generated on Sun Jun 29 13:29:19 2008 for Charm++ by  doxygen 1.5.1