proj home

Files   Classes   Functions   Hierarchy  

main.cpp File Reference

#include <cassert>
#include <iostream>
#include <fstream>
#include <GL/glut.h>
#include <GL/gl.h>
#include <zpr.h>
#include <graphmisc.h>
#include <commandline.h>
#include <gobj.h>
#include <pointsdisplay.h>
#include <random.h>
#include <print.h>
#include <point.h>
#include <d3tess.h>
#include <d3tessdraw.h>
#include <d2func.h>
#include <d2circle.h>
#include <halfspaceD2.h>
#include <aclock.h>
#include <d3meshpointreader.h>
#include <d3minboundary.h>
#include <d3minrecursive.h>
#include <d3mincircle.h>
#include <d3mincentroid.h>
#include <d3mincentroid2.h>
#include <message.h>
#include <typedefs.h>
#include <trianglespace.h>

Include dependency graph for main.cpp:

Go to the source code of this file.

Defines

#define SHOW(x)   #x << '=' << (x)

Typedefs

typedef point2< double > pt2
typedef point2< double > const pt2c

Functions

bool enabletargetcurve (false)
void init02 ()
string getInputString ()
boolc addpointinsidemesh ()
void addrandompointtomeshptvector (pt2 &x)
void addrandompointtomesh ()
void timmingexperiment04 ()
void timmingexperiment03 ()
void filereadingmesh (d3meshpointreader &mr)
void timmingexperiment02 ()
void timmingexperiment01 ()
void timmingexperiment05 ()
void timmingexperiment06 ()
void timmingexperiment00 ()
void minimizermenu ()
void searchStats (double &searchlongest, double &searchaverage, uintc n)
void searchexp01 ()
void searchexp02 ()
void filewritingmesh ()
void filereadingmesh ()
void filemenu ()
void searchmenu ()
void timmingsmenu ()
void displaymenu ()
void mainmenu ()
void keyboard (unsigned char key, int x, int y)
void display ()
void addpoint (pt2 const &x)
void addpoint (doublec x, doublec y)
void init00 ()
void help ()
int main (int argc, char **argv)

Variables

d3tessmesh
d3tessdrawmeshdraw
pt2 targetcenter
doublec targetradius = 0.6
d2funcp2dfunc = new d2circle(targetcenter,targetradius)
gobjMyCircle targetcircle
gobjMyCircleDraw targetcurve (targetradius, pt3(targetcenter.x, targetcenter.y, 0.0), targetcircle)
gobjContainer xGraphics
messagefile error ("error.txt", true)
random11< double > r


Define Documentation

#define SHOW (  )     #x << '=' << (x)

Definition at line 41 of file main.cpp.


Typedef Documentation

typedef point2<double> pt2

Definition at line 42 of file main.cpp.

typedef point2<double> const pt2c

Definition at line 43 of file main.cpp.


Function Documentation

void addpoint ( doublec  x,
doublec  y 
)

Definition at line 999 of file main.cpp.

References d2func::make(), and d3tess::pt.

01000 {
01001   mesh->pt.push_back(p2dfunc->make(x,y));
01002 }

void addpoint ( pt2 const &  x  ) 

Definition at line 994 of file main.cpp.

References d2func::make(), d3tess::pt, point2< T >::x, and point2< T >::y.

Referenced by partitionstest::addstar().

00995 {
00996   mesh->pt.push_back(p2dfunc->make(x.x,x.y));
00997 }

boolc addpointinsidemesh (  ) 

Definition at line 101 of file main.cpp.

References d3tess::addpoint(), d2func::eval(), messageglobal(), d3tess::pt, gobjContainer::push(), r, gobjQuadric::radius, d3tess::searchminimizetowardspoint(), point2< T >::x, and point2< T >::y.

Referenced by keyboard().

00102 {
00103   
00104 
00105   static gobjQuadric q4;
00106   q4.radius=0.005;
00107 
00108   xGraphics.push( new gobjglColor3f(1.0,0.0,0.0) );
00109                 
00110   uint k= mesh->pt.size();
00111 
00112   pt2 x(-1.0+2.0*r(),-1.0+2.0*r());
00113   mesh->pt.push_back(pt3(x.x,x.y,p2dfunc->eval(x)));
00114   xGraphics.push( new gobjMySphereDraw( x, &q4 ) );
00115 
00116   if (mesh->searchminimizetowardspoint(k))
00117   {
00118 
00119 
00120 messageglobal() << "addpointinsidemesh()" << "\n";
00121 messageglobal() << *mesh << "\n\n";
00122 
00123 messageglobal() << "k=" << k << "\n";
00124 
00125     mesh->addpoint(k);
00126 messageglobal() << *mesh << "\n\n";
00127     return true;
00128   }
00129 
00130   return false;
00131 }

void addrandompointtomesh (  ) 

Definition at line 140 of file main.cpp.

References d3tess::addpoint(), addrandompointtomeshptvector(), d3tess::pt, gobjContainer::push(), and gobjQuadric::radius.

Referenced by keyboard(), searchStats(), timmingexperiment00(), and timmingexperiment01().

00141 {
00142   static gobjQuadric q3;
00143   q3.radius=0.005;
00144 
00145   xGraphics.push( new gobjglColor3f(1.0,0.0,0.0) );
00146                 
00147   uint k= mesh->pt.size();
00148 
00149   pt2 x;
00150   addrandompointtomeshptvector(x);
00151   //pt2 x(-1.0+2.0*r(),-1.0+2.0*r());
00152   //mesh->pt.push_back(pt3(x.x,x.y,p2dfunc->eval(x)));
00153   xGraphics.push( new gobjMySphereDraw( x, &q3 ) );
00154 
00155   mesh->addpoint(k);
00156 }

void addrandompointtomeshptvector ( pt2 x  ) 

Definition at line 133 of file main.cpp.

References d2func::eval(), d3tess::pt, r, point2< T >::x, and point2< T >::y.

Referenced by addrandompointtomesh(), and searchStats().

00134 {
00135   x = pt2(-1.0+2.0*r(),-1.0+2.0*r());
00136   mesh->pt.push_back(pt3(x.x,x.y,p2dfunc->eval(x)));
00137 }

void display (  ) 

Definition at line 957 of file main.cpp.

References gobjMyCircleDraw::draw(), gobjContainer::draw(), d3tessdraw::draw(), enabletargetcurve(), glerrordisplay(), and targetcurve.

00958 { 
00959   //glMatrix temp;
00960   myglPushMatrix temp;
00961 
00962   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00963 
00964   //axes(0.5);
00965 
00966   meshdraw->draw();
00967 
00968   xGraphics.draw();
00969 
00970   glerrordisplay();
00971 
00972   {
00973     glPushMatrix();
00974 
00975     glPushAttrib(GL_CURRENT_BIT);
00976     glPushAttrib(GL_LIGHTING_BIT);
00977  
00978     glColor3f(1.0,1.0,0.0);
00979     glEnable(GL_LIGHTING);
00980   
00981     if (enabletargetcurve)
00982       targetcurve.draw();
00983 
00984     glPopAttrib();
00985     glPopAttrib();
00986 
00987     glPopMatrix();
00988   }
00989   glerrordisplay();
00990   
00991   glutSwapBuffers();
00992 }

void displaymenu (  ) 

Definition at line 737 of file main.cpp.

References getInputString(), d3tessdraw::graphicsDeffered, d3tessdraw::graphicsImmediate, gobjContainerSwitch::gswitch, and d3tessdraw::meshupdate().

Referenced by mainmenu().

00738 {
00739   cout << endl;
00740   cout << "Display Menu" << endl;
00741   cout << endl;
00742   cout << "  0:  points numbering toggle" << endl;
00743   cout << "  1:  triangles numbering toggle" << endl;
00744   cout << "  2:  winding toggle" << endl;
00745   cout << "  3:  grid toggle" << endl;
00746   cout << "  4:  cp toggle" << endl;
00747   cout << "  5:  surface toggle" << endl;
00748   cout << "  6:  cp circle toggle" << endl;
00749   cout << "  7:  circles through triangles" << endl;
00750   cout << "  8:  cp voronoi local polygons about base vertices" << endl;
00751   cout << "  9:  multicolored triangles" << endl;
00752   cout << " 10:  voronoi diagram" << endl;
00753     
00754   cout << "      Enter a choice  ";
00755 
00756   string const s = getInputString();
00757   if (s.empty())
00758   {
00759     cout << "No Choice Executed" << endl; 
00760     cout << "End of Display Menu" << endl;
00761     return;
00762   }
00763 
00764   if (s=="0")
00765   {
00766     meshdraw->graphicsDeffered.gswitch[0]->toggle();
00767     meshdraw->meshupdate();
00768   }
00769 
00770   if (s=="1")
00771   {
00772     meshdraw->graphicsDeffered.gswitch[1]->toggle();
00773     meshdraw->meshupdate();
00774   }
00775 
00776   if (s=="9")
00777   {
00778     meshdraw->graphicsDeffered.gswitch[2]->toggle();
00779     meshdraw->meshupdate();
00780   }
00781 
00782   if (s=="10")
00783   {
00784     meshdraw->graphicsDeffered.gswitch[3]->toggle();
00785     meshdraw->meshupdate();
00786   }
00787 
00788   if (s=="2")
00789     meshdraw->graphicsImmediate.gswitch[0]->toggle();
00790 
00791   if (s=="3")
00792     meshdraw->graphicsImmediate.gswitch[1]->toggle();
00793   
00794   if (s=="4")
00795     meshdraw->graphicsImmediate.gswitch[2]->toggle();
00796 
00797   if (s=="5")
00798     meshdraw->graphicsImmediate.gswitch[3]->toggle();
00799 
00800   if (s=="6")
00801     meshdraw->graphicsImmediate.gswitch[4]->toggle();
00802 
00803   if (s=="7")
00804     meshdraw->graphicsImmediate.gswitch[5]->toggle();
00805 
00806   if (s=="8")
00807     meshdraw->graphicsImmediate.gswitch[6]->toggle();
00808 
00809 
00810 
00811   cout << "End of Display Menu" << endl;
00812 }

bool enabletargetcurve ( false   ) 

Referenced by display(), and main().

void filemenu (  ) 

Definition at line 632 of file main.cpp.

References filereadingmesh(), filewritingmesh(), getInputString(), timmingexperiment02(), timmingexperiment03(), and timmingexperiment04().

Referenced by mainmenu().

00633 {
00634   cout << endl;
00635   cout << "File Menu" << endl;
00636   cout << endl;
00637   cout << "  0:  Read a tessellation in from a file." << endl;
00638   cout << "  1:  Write a tessellation out to a file." << endl;
00639   cout << "  2:  Read points from file." << endl;
00640   cout << "  3:  Create a new data set by writing 2D random data points to a file." << endl;
00641   cout << "  4:  Create a new data set by writing 3D random data points to a file." << endl;
00642 
00643   cout << "      Enter a choice  ";
00644 
00645   string const s = getInputString();
00646   if (s.empty())
00647   {
00648     cout << "No Choice Executed" << endl; 
00649     cout << "End of File Menu" << endl;
00650     return;
00651   }  
00652 
00653   if (s=="0")
00654     filereadingmesh();
00655 
00656   if (s=="1")
00657     filewritingmesh();
00658 
00659   if (s=="2")
00660     timmingexperiment02();
00661 
00662   if (s=="3")
00663     timmingexperiment03();
00664 
00665   if (s=="4")
00666     timmingexperiment04();
00667 
00668 }

void filereadingmesh (  ) 

Definition at line 608 of file main.cpp.

References getInputString().

00609 {
00610   cout << endl;
00611   cout << "  Reading a mesh in." << endl;
00612   cout << endl;
00613   cout << "  Enter the filename: ";
00614 
00615   string fname(getInputString());
00616 
00617   if (fname.empty())
00618     return;
00619 
00620   ifstream targ(fname.c_str());
00621  
00622   if (targ.good()==false)
00623   {
00624     cout << "error:  could not read the file." << endl;
00625     return;
00626   }
00627 
00628   targ >> *mesh;
00629 }

void filereadingmesh ( d3meshpointreader mr  ) 

Definition at line 200 of file main.cpp.

References aclock::diff_s(), d3meshpointreader::eval(), and aclock::measure().

Referenced by filemenu(), main(), and timmingexperiment02().

00203 {
00204     
00205   cout << "Starting insertion of points into the mesh" << endl;
00206 
00207   aclock c;
00208   c.measure();
00209   mr.eval();
00210   c.measure();
00211 
00212   cout << "Finished insertion of points into the mesh" << endl << endl;
00213   cout << "Time without graphics: ";
00214   cout << c.diff_s() << "s" << endl;
00215 }

void filewritingmesh (  ) 

Definition at line 585 of file main.cpp.

References getInputString().

Referenced by filemenu().

00586 {
00587   cout << endl;
00588   cout << "  Writing the mesh out." << endl;
00589   cout << endl;
00590   cout << "  Enter the filename: ";
00591 
00592   string fname(getInputString());
00593 
00594   if (fname.empty())
00595     return;
00596 
00597   ofstream targ(fname.c_str());
00598  
00599   if (targ.good()==false)
00600   {
00601     cout << "error:  could not write the file out." << endl;
00602     return;
00603   }
00604 
00605   targ << *mesh;
00606 }

string getInputString (  ) 

Definition at line 75 of file main.cpp.

Referenced by displaymenu(), filemenu(), filereadingmesh(), filewritingmesh(), mainmenu(), minimizermenu(), searchmenu(), and timmingsmenu().

00076 {
00077   string s;
00078   cin >> s;
00079   return s;
00080 /*
00081   string s;
00082   char ch;
00083   for ( ; ; )
00084   {
00085     ch = cin.peek();
00086     cin.ignore();
00087 
00088     if (ch=='\n')
00089       return s;
00090 
00091     s += ch;
00092   }
00093 
00094   assert(false);
00095   return s;
00096 */
00097 }

void help (  ) 

Definition at line 1032 of file main.cpp.

Referenced by maze005::keyboard01(), simplexD2tessapp01::keyboard02(), delaunaysimpleD2test::keyboard02(), and main().

01033 {
01034   cout << "Command Line Options" << endl;
01035   cout << "For boolean values true and 1, false and 0 are equivalent" << endl;
01036   cout << "file=filename  - read in points from a file" << endl;
01037   cout << "cp=true        - current pointer" << endl;
01038   cout << "winding=true   - display the triangle windings" << endl;
01039   cout << "surface=true   - draw the surface" << endl;
01040   cout << "grid=true      - draw the triangles as blue grid" << endl;
01041   cout << "points=true    - number each point with its integer index" << endl;
01042   cout << "debug=0        - only use when NDEBUG is undefined so checkdebug() is not excecuted" << endl;
01043   cout << "triangles=1    - number each triangle with its integer index" << endl;
01044   cout << "cpcircle=1     - draw a circle through the cp's simplex." << endl;
01045   cout << "circles=1      - draw circles through every simplex." << endl;
01046   cout << "cpvoronoi=1    - display voronoi polygons about the cp."  << endl;
01047   cout << "multcolor=1    - display the triangles with random colorings" << endl;
01048   cout << "voronoi=1      - display strict voronoi polygons" << endl;
01049 
01050 
01051   cout << endl;
01052   cout << "Keyboard Commands" << endl;
01053   cout << "'T' enters you into the main menu which is displayed at the" << endl;
01054   cout << "  command line rather than the application." << endl << endl;
01055   cout << "'a' 'A' - rotate anticlockwise or clockwise the cp triangle." << endl;
01056   cout << "'j' 'k' - move left, right and down on current triangle" << endl;
01057   cout << "  'm'" << endl;
01058   cout << "'b'     - orient the current triangle to the boundary if possible" << endl;
01059   cout << "'w' 'e' - First orient the cp to the boundary with 'b'.  Then move" << endl;
01060   cout << "         on the surface left and right respectively." << endl;
01061   cout << "'z'     - the flip operator" << endl;
01062 
01063   cout << endl;
01064   cout << "Minimizers" << endl;
01065   cout << "  Explore mesh balancing." << endl;
01066   cout << "  By default no mesh balancing is performed." << endl;
01067   cout << "minb=1        - boundary minimization on insertion" << endl;
01068   cout << "minbr=1       - boundary minimization with recursion" << endl;
01069   cout << "minc=1        - circle minimization on insertion" << endl;
01070   cout << "minDT=1       - Delauny Triangulation - recursive circle minimization" << endl;
01071   cout << "mincentroid=1 - circle by average points and radius, insertion" << endl;
01072   cout << "mincentroid2r=1 - circle by average points and min radius, recursive" << endl;
01073   //cout << "greedy=true    - very bad mesh generated." << endl;
01074   //cout << "greedy2=true   - very experimental, do I know what I am doing?" << endl;
01075 
01076 }

void init00 (  ) 

Definition at line 1004 of file main.cpp.

References d2func::make(), d3tess::pt, and d3tess::vi.

01005 {
01006   cout << endl;
01007   cout << "Test Mesh" << endl;
01008 
01009   mesh->pt.push_back(p2dfunc->make(0.0,0.0));
01010   mesh->pt.push_back(p2dfunc->make(1.0,0.0));
01011   mesh->pt.push_back(p2dfunc->make(1.0,1.0));
01012 
01013   mesh->vi.push_back( simplexD2linked(1,2,3, 0,0,0) );
01014 }

void init02 (  ) 

Definition at line 1016 of file main.cpp.

References d4tess::debugcheck(), d3func::eval(), d3tess::initialize(), d2func::make(), d4tess::pt, d3tess::pt, r, d4tess::viadd(), point4< T >::x, point4< T >::y, and point4< T >::z.

Referenced by main(), mainmenu(), searchStats(), and timmingexperiment01().

01017 {
01018   cout << endl;
01019   cout << "Test Mesh" << endl;
01020   cout << "Adding three random points to make the first" << endl;
01021   cout << "  simplex or triangle in the mesh." << endl;
01022 
01023   for (uint i=0; i<3; ++i)
01024     mesh->pt.push_back( 
01025       p2dfunc->make(-1.0+2.0*r(),-1.0+2.0*r()) );
01026 
01027   mesh->initialize();
01028 }

void keyboard ( unsigned char  key,
int  x,
int  y 
)

Definition at line 868 of file main.cpp.

References addpointinsidemesh(), addrandompointtomesh(), virtualtriangle::anticlockwise(), d3tess::boundaryorient(), virtualtriangle::clockwise(), d3tess::flip(), mainmenu(), d3tessdraw::meshupdate(), d3tess::movedown(), d3tess::moveleft(), d3tess::moveright(), d3tess::surfaceleft(), d3tess::surfaceright(), and d3tess::vs.

00869 {
00870   switch (key)
00871   {
00872     case 27:
00873       delete mesh;
00874       mesh=0;
00875       delete meshdraw;
00876       meshdraw=0;
00877       delete p2dfunc;
00878       p2dfunc=0;
00879       
00880       exit(0);
00881       break;
00882 
00883     case 'a':
00884       mesh->vs.anticlockwise();
00885       break;
00886 
00887     case 'A':
00888       mesh->vs.clockwise();
00889       break;
00890 
00891     case 'j':
00892       mesh->moveleft();
00893       break;
00894 
00895     case 'k':
00896       mesh->moveright();
00897       break;
00898 
00899     case 'm':
00900       mesh->movedown();
00901       break;
00902 
00903     case 'b':
00904       mesh->boundaryorient();
00905       break;
00906 
00907     case 'w':
00908       mesh->surfaceleft();
00909       break;
00910     case 'e':
00911       mesh->surfaceright();
00912       break;
00913 
00914     case 'R':
00915       {
00916         for (; !addpointinsidemesh(); );
00917 
00918         meshdraw->meshupdate();
00919       }
00920       break;
00921 
00922 
00923     case 'r':
00924       addrandompointtomesh();
00925       meshdraw->meshupdate();
00926       break;
00927 
00928     case 't':
00929       for (uint i=0; i<100; ++i) 
00930         addrandompointtomesh();
00931       meshdraw->meshupdate();
00932       break;
00933 
00934     case 'T':
00935       mainmenu();
00936       break;
00937 
00938     case 'p':
00939       cout << endl;
00940       cout << *mesh;
00941       break;
00942 
00943     case 'z':
00944       mesh->flip();
00945       meshdraw->meshupdate();
00946       break;
00947 
00948     case 'l':
00949       cout << "l=" << mesh->cpbasemeasure() << endl;
00950       break;
00951 
00952   }
00953 
00954   glutPostRedisplay();
00955 }

int main ( int  argc,
char **  argv 
)

Definition at line 1079 of file main.cpp.

References d3tessdraw::circle, d3tessdraw::circles, d3tessdraw::cp, d3tess::debugenable, display(), enabletargetcurve(), error, filereadingmesh(), message::globalset(), d3tessdraw::graphicsDeffered, d3tessdraw::graphicsImmediate, d3tessdraw::grid, gobjContainerSwitch::gswitch, help(), init02(), keyboard(), commandline::mapvar(), d3tessdraw::meshupdate(), d3tess::minimizerSet(), d3tessdraw::multicolor, d3tessdraw::points, random11< T, G >::rg, randomgenerator::seed(), gobjContainer::set(), d3tessdraw::simplexes, d3tessdraw::surface, d3tessdraw::voronoi, d3tessdraw::voronoip, and d3tessdraw::winding.

01080 {
01081   glutInit(&argc,argv);
01082   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
01083   uintc wx=800;
01084   uintc wy=800;
01085 
01086   glutInitWindowSize(wx,wy);
01087 
01088   glutCreateWindow("");
01089 
01090   glutDisplayFunc(display);
01091   glutKeyboardFunc(keyboard);
01092 
01093   OpenGLinitialisation();
01094 
01095   glEnable(GL_DEPTH_TEST);
01096 
01097   //glDisable(GL_CULL_FACE);
01098   glEnable(GL_CULL_FACE);
01099 
01100   glEnable(GL_NORMALIZE);
01101 
01102   xGraphics.set();
01103 
01104   //error.setMessageGlobal();
01105   error.globalset();
01106 
01107   help();
01108 
01109   commandline cmd(argc,argv);
01110 
01111   uint N(1000);
01112   cmd.mapvar(N,"N");
01113   
01114   mesh = new d3tess(N);
01115 
01116   cmd.mapvar(mesh->debugenable,"debug");
01117 
01118   meshdraw = new d3tessdraw(*mesh);
01119 
01120   cmd.mapvar(meshdraw->graphicsDeffered.gswitch[d3tessdraw::points]->isdrawn,"points");
01121   cmd.mapvar(meshdraw->graphicsDeffered.gswitch[d3tessdraw::simplexes]->isdrawn,"triangles");
01122   cmd.mapvar(meshdraw->graphicsDeffered.gswitch[d3tessdraw::multicolor]->isdrawn,"multicolor");
01123   cmd.mapvar(meshdraw->graphicsDeffered.gswitch[d3tessdraw::voronoi]->isdrawn,"voronoi");
01124 
01125 
01126   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::winding]->isdrawn,"winding");
01127   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::grid]->isdrawn,"grid",true);
01128   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::cp]->isdrawn,"cp",true);
01129   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::surface]->isdrawn,"surface");
01130   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::circle]->isdrawn,"cpcircle");
01131   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::circles]->isdrawn,"circles");
01132   cmd.mapvar(meshdraw->graphicsImmediate.gswitch[d3tessdraw::voronoip]->isdrawn,"cpvoronoi");
01133 
01134 
01135 
01136   bool enableminb(false);
01137   cmd.mapvar(enableminb,"minb");
01138   if (enableminb)
01139     mesh->minimizerSet( new d3minboundary(*mesh) );
01140 
01141   bool enableminbr(false);
01142   cmd.mapvar(enableminbr,"minbr");
01143   if (enableminbr)
01144     mesh->minimizerSet
01145     ( 
01146       new d3minrecursiveoperator(*mesh,new d3minboundary(*mesh)) 
01147     );
01148 
01149   bool enableminc(false);
01150   cmd.mapvar(enableminc,"minc");
01151   if (enableminc)
01152     mesh->minimizerSet( new d3mincircle(*mesh) );
01153 
01154   bool enableminDT(false);
01155   cmd.mapvar(enableminDT,"minDT");
01156   if (enableminDT)
01157     mesh->minimizerSet
01158     ( 
01159       new d3minrecursiveoperator(*mesh,new d3mincircle(*mesh)) 
01160     );
01161 
01162   bool enablemincentroid(false);
01163   cmd.mapvar(enablemincentroid,"mincentroid");
01164   if (enablemincentroid)
01165     mesh->minimizerSet( new d3mincentroid(*mesh) );
01166 
01167   bool enablemincentroid2r(false);
01168   cmd.mapvar(enablemincentroid2r,"mincentroid2r");
01169   if (enablemincentroid2r)
01170     mesh->minimizerSet
01171     ( 
01172       new d3minrecursiveoperator(*mesh,new d3mincentroid2(*mesh)) 
01173     );
01174 
01175   cmd.mapvar(enabletargetcurve,"targetcurve");
01176 
01177   //test01();
01178 
01179   r.rg.seed(17);
01180 
01181   string fname;
01182   cmd.mapvar(fname,"file");
01183   bool fileread(false);
01184 
01185   if (fname.empty()==false)
01186   {
01187     d3meshpointreader mr(fileread,*mesh,fname);
01188  
01189     if (fileread)
01190       filereadingmesh(mr);
01191     else
01192       cout << "error:  could not read file " << fname << endl;
01193   }
01194 
01195   if (fileread==false)
01196     init02();
01197 
01198   meshdraw->meshupdate();
01199 
01200   zpr zz;
01201 
01202   glutPostRedisplay();
01203 
01204   glutMainLoop();
01205 
01206   return 0;
01207 }

void mainmenu (  ) 

Definition at line 815 of file main.cpp.

References displaymenu(), filemenu(), getInputString(), init02(), d3tessdraw::meshupdate(), minimizermenu(), d3tess::reset(), searchmenu(), and timmingsmenu().

Referenced by keyboard(), and menusystemtest::test02().

00816 {
00817   for (; ; )
00818   {
00819 
00820     cout << endl;
00821     cout << "Main Menu" << endl;
00822     cout << endl;
00823     cout << "  0:  Timmings Menu" << endl;
00824     cout << "  1:  Display Menu" << endl;
00825     cout << "  2:  File Menu" << endl;
00826 
00827     cout << "  5:  Change the Minimizer." << endl;
00828     cout << "  6:  Reset the mesh." << endl;
00829     cout << "  9:  Search Menu" << endl;
00830     
00831     cout << "      Enter a choice  ";
00832 
00833 
00834     string const s = getInputString();
00835     if (s.empty())
00836     {
00837       cout << "No Choice Executed" << endl; 
00838       cout << "End of Main Menu" << endl;
00839       return;
00840     }
00841 
00842     if (s=="0")
00843       timmingsmenu();
00844 
00845     if (s=="1")
00846       displaymenu();
00847 
00848     if (s=="2")
00849       filemenu();
00850 
00851     if (s=="5")
00852       minimizermenu();
00853 
00854     if (s=="6")
00855     {
00856       mesh->reset();
00857       init02();
00858       meshdraw->meshupdate();
00859     }
00860 
00861     if (s=="9")
00862       searchmenu();
00863 
00864   }
00865 }

void minimizermenu (  ) 

Definition at line 418 of file main.cpp.

References getInputString(), and d3tess::minimizerSet().

Referenced by mainmenu().

00419 {
00420   cout << endl;
00421   cout << "Minimizer Menu" << endl;
00422   cout << endl;
00423   cout << "The tessellator has a minimizer."  << endl;
00424   cout << "Setting the minimizer affects all future mesh insertions." << endl; 
00425   cout << endl;
00426   cout << "  0: No minimizer" << endl;
00427   cout << "  1: minb        - minimize the boundary on insertion" << endl;
00428   cout << "  2: minbr" << endl;
00429   cout << "  3: minc" << endl;
00430   cout << "  4: minDT   - Delaunay Triangulation" << endl;
00431   cout << "  5: mincentroid" << endl;
00432   cout << "  6: mincentroidr" << endl;
00433 
00434   cout << "      Enter a choice  ";
00435 
00436   string const s = getInputString();
00437   if (s.empty())
00438   {
00439     cout << "No Choice Executed" << endl; 
00440     cout << "End of Minimizer Menu" << endl;
00441     return;
00442   }
00443 
00444   if (s=="0")
00445     mesh->minimizerSet( new d3minoperator(*mesh) );
00446 
00447   if (s=="1")
00448     mesh->minimizerSet( new d3minboundary(*mesh) );
00449  
00450   if (s=="2")
00451     mesh->minimizerSet
00452     ( 
00453       new d3minrecursiveoperator(*mesh,new d3minboundary(*mesh)) 
00454     );
00455 
00456   if (s=="3")
00457     mesh->minimizerSet( new d3mincircle(*mesh) );
00458 
00459   if (s=="4")     
00460     mesh->minimizerSet
00461     ( 
00462       new d3minrecursiveoperator(*mesh,new d3mincircle(*mesh)) 
00463     );
00464 
00465   if (s=="5")
00466     mesh->minimizerSet( new d3mincentroid(*mesh) );
00467 
00468   if (s=="6")
00469     mesh->minimizerSet
00470     ( 
00471       new d3minrecursiveoperator(*mesh,new d3mincentroid2(*mesh)) 
00472     );
00473 
00474   cout << "End of Choice Menu" << endl;
00475 }

void searchexp01 (  ) 

Definition at line 533 of file main.cpp.

References d3tessdraw::meshupdate(), searchStats(), and SHOW.

Referenced by searchmenu().

00534 {
00535   cout << "Enter the number of points: ";
00536   uint n;
00537   cin >> n;
00538 
00539   double searchlongest;
00540   double searchaverage;
00541 
00542   searchStats(searchlongest,searchaverage,n);
00543 
00544   cout << SHOW(searchlongest) << endl;
00545   cout << SHOW(searchaverage) << endl;
00546 
00547   meshdraw->meshupdate();
00548 }

void searchexp02 (  ) 

Definition at line 550 of file main.cpp.

References searchStats().

Referenced by searchmenu().

00551 {
00552   uint nmax = 1000000;
00553 
00554   cout << "Writing search results to search.txt" << endl;
00555   cout << "The number of points is capped at " << nmax << endl;
00556 
00557   string fname("search.txt");
00558   ofstream f(fname.c_str());
00559 
00560   if (f.good()==false)
00561   {
00562     cout << "error:  can not open file: " << fname << endl;
00563     return;
00564   }
00565 
00566   uint n = 8;
00567   uint N = 3;
00568 
00569   cout << "Enter the initial number of points u and the number of times" << endl;
00570   cout << "  this is doubled." << endl;
00571   cin >> n;
00572   cin >> N;
00573 
00574   double searchlongest;
00575   double searchaverage;
00576 
00577   for (uint i=0; i<N; ++i)
00578   {
00579     searchStats(searchlongest,searchaverage,n);
00580     f << n << " " << searchaverage << endl;
00581     n *= 2;
00582   }
00583 }

void searchmenu (  ) 

Definition at line 671 of file main.cpp.

References getInputString(), searchexp01(), and searchexp02().

Referenced by mainmenu().

00672 {
00673   cout << endl;
00674   cout << "Search Menu" << endl;
00675   cout << endl;
00676   cout << "  0: Calculate the shortes, longest and average lengths" << endl;
00677   cout << "       of a n point data set with n random inside searches." << endl;
00678   cout << "  1: Write the average search lengths to a file search.txt ." << endl;
00679 
00680   cout << "      Enter a choice  ";
00681 
00682   string const s = getInputString();
00683   if (s.empty())
00684   {
00685     cout << "No Choice Executed" << endl; 
00686     cout << "End of Search Menu" << endl;
00687     return;
00688   }
00689 
00690   if (s=="0")
00691     searchexp01();
00692 
00693   if (s=="1")
00694     searchexp02();
00695 
00696   cout << "End of Search Menu" << endl;
00697 }

void searchStats ( double &  searchlongest,
double &  searchaverage,
uintc  n 
)

Definition at line 479 of file main.cpp.

References addrandompointtomesh(), addrandompointtomeshptvector(), d3tess::cp, init02(), d3tess::movecounter, d3tess::pt, d3tess::reset(), and d3tess::searchminimizetowardspoint().

Referenced by searchexp01(), and searchexp02().

00484 {
00485   // Create the mesh first.
00486   mesh->reset();
00487   init02();
00488   
00489   for (uint i=3; i<n; ++i) 
00490     addrandompointtomesh();
00491 
00492   // Create a vector of points inside the mesh
00493   vector<uint> v;
00494 
00495   pt2 x;
00496   uint k;
00497   for ( ; v.size()<n; )
00498   {
00499     k = mesh->pt.size();
00500     addrandompointtomeshptvector(x);
00501     if (mesh->searchminimizetowardspoint(k))
00502       v.push_back(k);
00503   }
00504 
00505   // Set the cp to some random point inside the mesh
00506   mesh->cp = (rand()% n)+1;
00507 
00508   mesh->searchminimizetowardspoint(v[0]);
00509   double c = mesh->movecounter; 
00510   searchlongest = c;
00511   searchaverage = c;
00512 
00513   for (uint i=1, sz=v.size(); i<sz; ++i)
00514   {
00515 #ifndef NDEBUG
00516     assert( mesh->searchminimizetowardspoint(v[i]) );
00517 #else
00518     mesh->searchminimizetowardspoint(v[i]);
00519 #endif
00520 
00521     c = mesh->movecounter; 
00522     if (c>searchlongest)
00523       searchlongest = c;
00524 
00525     searchaverage += c; 
00526   }
00527 
00528   searchaverage *= 1.0/n;
00529 }

void timmingexperiment00 (  ) 

Definition at line 399 of file main.cpp.

References addrandompointtomesh(), aclock::diff_s(), aclock::measure(), d3tessdraw::meshupdate(), and d3tess::vi.

Referenced by timmingsmenu().

00400 {
00401   cout << "Timing experiment." << endl;
00402   cout << "Enter the number of points n: ";
00403   uint n;
00404   cin >> n;
00405   mesh->vi.reserve(n);
00406 
00407   aclock c;
00408   c.measure();
00409   for (uint i=0; i<n; ++i) 
00410     addrandompointtomesh();
00411   c.measure();
00412   cout << "Time without graphics: ";
00413   cout << c.diff_s() << "s" << endl;
00414 
00415   meshdraw->meshupdate();
00416 }

void timmingexperiment01 (  ) 

Definition at line 240 of file main.cpp.

References addrandompointtomesh(), aclock::diff_s(), init02(), aclock::measure(), d3tess::reset(), SHOW, and d3tess::vi.

Referenced by timmingsmenu().

00241 {
00242   cout << "Multiple timing experiments" << endl;
00243   cout << endl;
00244   cout << "Enter the filename: ";
00245   string fname;
00246   cin >> fname;
00247   
00248   ofstream fil(fname.c_str());
00249 
00250   cout << "Enter number of measurements M: ";
00251   uint M;
00252   cin >> M;
00253 
00254   uint n=100;
00255 
00256   aclock c;
00257 
00258   for (uint k=0; k<M; ++k)
00259   {
00260 cout << SHOW(k) << endl;
00261 cout << SHOW(n) << endl;
00262     mesh->vi.reserve(n);
00263 
00264     c.measure();
00265     for (uint i=0; i<n; ++i) 
00266       addrandompointtomesh();
00267     c.measure();
00268     fil << n << " " << c.diff_s() << endl;
00269 
00270     mesh->reset();
00271 
00272     init02();
00273 
00274     n *= 2;
00275   }
00276 cout << "out of loop" << endl;
00277 exit(0);
00278 
00279 }

void timmingexperiment02 (  ) 

Definition at line 217 of file main.cpp.

References filereadingmesh().

Referenced by filemenu(), and keyboard().

00218 {
00219   cout << "Reading Points from a File" << endl;
00220   cout << "Expecting the file to have 2 or 3 columns of numbers." << endl;
00221   cout << endl;
00222   cout << "  Enter the filename: ";
00223   string fname;
00224 
00225   //fname = "dataset2D08.txt";
00226   //cout << fname << endl;
00227   cin >> fname;
00228 
00229   bool res;
00230   d3meshpointreader mr(res,*mesh,fname);
00231 
00232   if (res==false)
00233     return;
00234 
00235   filereadingmesh(mr);
00236 }

void timmingexperiment03 (  ) 

Definition at line 180 of file main.cpp.

References r.

Referenced by filemenu(), and keyboard().

00181 {
00182   cout << "Creating a 2D Data Set" << endl;
00183   cout << "Writing Points to a File" << endl;
00184   cout << "  Enter the filename: ";
00185   string fname;
00186   cin >> fname;
00187   cout << "  Enter the number of points: ";
00188   uint n;
00189   cin >> n;
00190 
00191   ofstream targ(fname.c_str());
00192 
00193   for (uint i=0; i<n; ++i)
00194     targ << -1.0+2.0*r() << " " << -1.0+2.0*r() << endl;
00195 
00196   cout << "Finished writing file: " << fname << endl << endl;
00197 }

void timmingexperiment04 (  ) 

Definition at line 158 of file main.cpp.

References d2func::eval(), r, point2< T >::x, and point2< T >::y.

Referenced by filemenu().

00159 {
00160   cout << "Creating a 3D Data Set" << endl;
00161   cout << "Writing Points to a File" << endl;
00162   cout << "  Enter the filename: ";
00163   string fname;
00164   cin >> fname;
00165   cout << "  Enter the number of points: ";
00166   uint n;
00167   cin >> n;
00168 
00169   ofstream targ(fname.c_str());
00170 
00171   for (uint i=0; i<n; ++i)
00172   {
00173     pt2 x(-1.0+2.0*r(),-1.0+2.0*r());
00174     targ << x.x << " " << x.y << " " << p2dfunc->eval(x) << endl;
00175   }
00176 
00177   cout << "Finished writing file: " << fname << endl << endl;
00178 }

void timmingexperiment05 (  ) 

Definition at line 281 of file main.cpp.

References d3meshpointreader::eval().

Referenced by timmingsmenu().

00282 {
00283   cout << "Multiple Timing Experiments." << endl;
00284   cout << "The results are stored in timings.txt" << endl;
00285 
00286   cout << "Enter the filename with a list of 2D data files to be timed: ";
00287   string filenames;
00288   //cin >> filenames;
00289   filenames="dataset2Dlist.txt";
00290   cout << filenames << endl;
00291 
00292   ifstream filelist(filenames.c_str());
00293 
00294   ofstream filtim("timings.txt");
00295 
00296   if (filelist.good()==false)
00297   {
00298     cout << "error:  can not open file: " << filenames << endl;
00299     return;
00300   }
00301 
00302   while (filelist.eof()==false)
00303   {
00304     string f1;
00305     filelist >> f1;
00306 
00307     if (f1.empty())
00308       continue;
00309 
00310     cout << "Started reading file: " << f1 << endl;
00311     bool res;
00312     d3meshpointreader mr(res,*mesh,f1);
00313     if (res==false)
00314     {
00315       cout << "error:  could not read file:" << f1 << "." << endl;
00316       continue;
00317     }
00318     cout << "Finished reading file: " << f1 << endl;
00319     cout << "Timing file:" << f1 << "." << endl;
00320 
00321     cout << "Starting insertion of points into the mesh" << endl;
00322     mr.eval(filtim);
00323     cout << "Finished insertion of points into the mesh" << endl << endl;
00324   }
00325 }

void timmingexperiment06 (  ) 

Definition at line 330 of file main.cpp.

References d3meshpointreader::eval().

Referenced by timmingsmenu().

00331 {
00332   cout << "Simulating Multiple Timing Experiments." << endl;
00333   cout << "The results are stored in timings.txt" << endl;
00334   cout << "This is testing an algorithm not yet build." << endl;
00335   cout << "  It has the same complexity as this one." << endl;
00336   cout << "  A O(n) operation is applied after this step." << endl;
00337   cout << endl;
00338   cout << "A bounding box is first inserted.  All the points " << endl;
00339   cout << "  should lie well within the bounding box." << endl;
00340   cout << endl;
00341   cout << "For a preordered data set I am expecting linear results" << endl;
00342 
00343 
00344   cout << "Enter the filename with a list of 2D data files to be timed: ";
00345   string filenames;
00346   //cin >> filenames;
00347   filenames="datasetlist.txt";
00348   cout << filenames << endl;
00349 
00350   ifstream filelist(filenames.c_str());
00351 
00352   ofstream filtim("timings.txt");
00353 
00354   if (filelist.good()==false)
00355   {
00356     cout << "error:  can not open file: " << filenames << endl;
00357     return;
00358   }
00359 
00360   // Points defining the bounding box.
00361   vector< pt3 > vbox;
00362   vbox.push_back( pt3(-2.0,-2.0,0.0) );
00363   vbox.push_back( pt3(2.0,-2.0,0.0) );
00364   vbox.push_back( pt3(2.0,2.0,0.0) );
00365   vbox.push_back( pt3(-2.0,2.0,0.0) );
00366 
00367 
00368   while (filelist.eof()==false)
00369   {
00370     string f1;
00371     filelist >> f1;
00372 
00373     if (f1.empty())
00374       continue;
00375 
00376     cout << "Started reading file: " << f1 << endl;
00377     bool res;
00378     d3meshpointreader mr(res,*mesh,vbox,f1);
00379     if (res==false)
00380     {
00381       cout << "error:  could not read file:" << f1 << "." << endl;
00382       continue;
00383     }
00384     cout << "Finished reading file: " << f1 << endl;
00385     cout << "Timing file:" << f1 << "." << endl;
00386 
00387     cout << "Starting insertion of points into the mesh" << endl;
00388     mr.eval(filtim);
00389     cout << "Finished insertion of points into the mesh" << endl << endl;
00390   }
00391 }

void timmingsmenu (  ) 

Definition at line 699 of file main.cpp.

References getInputString(), timmingexperiment00(), timmingexperiment01(), timmingexperiment05(), and timmingexperiment06().

Referenced by mainmenu().

00700 {
00701   cout << endl;
00702   cout << "Timmings Menu" << endl;
00703   cout << endl;
00704   cout << "  0:  One tessellation with n points measured." << endl;
00705   cout << "  1:  Multiple timing measurements to file." << endl;
00706   cout << "  2:  Multiple timmings on 2D data files" << endl;
00707   cout << "  3:  Simulating Multiple timmings on my Bounded Algorithm" << endl;
00708   cout << "      Enter a choice  ";
00709 
00710 
00711   string const s = getInputString();
00712   if (s.empty())
00713   {
00714     cout << "No Choice Executed" << endl; 
00715     cout << "End of Timmings Menu" << endl;
00716     return;
00717   }
00718 
00719   if (s=="0")
00720     timmingexperiment00();
00721 
00722   if (s=="1")
00723     timmingexperiment01();
00724 
00725   if (s=="2")
00726     timmingexperiment05();
00727 
00728   if (s=="3")
00729     timmingexperiment06();
00730 
00731   cout << "End of Timmings Menu" << endl;
00732 }


Variable Documentation

messagefile error("error.txt", true)

Definition at line 48 of file main.cpp.

Definition at line 49 of file main.cpp.

Definition at line 53 of file main.cpp.

random11<double> r

Definition at line 69 of file main.cpp.

Referenced by protractor::addAngleRuler(), addpointinsidemesh(), protractor::addRadiusRuler(), addrandompointtomeshptvector(), pointgrid3D::createIndexedTriangles(), d3writefile(), tessD1draw01linesmulticolor< TESS, PT >::draw(), triangledisplaygergonnepoint< TR >::draw(), triangledisplayincenter< TR >::draw(), triangledisplaycircumcenter< TR >::draw(), tessD2draw02circles< TESS, PT, INDX >::draw(), regionD2tessdisplaymesh< TS, Indx >::draw(), writemulticolorobj::draw(), d4mingreedy2::eval(), trianglevisualize< T >::eval(), tessD2disp01< PT >::eval(), polytopeD2tessdisp01< VPTS, VPOLY >::eval(), generateRandomPointsInCircle< T, D, RG >::generateRandomPointsInCircle(), generateRandomPointsInSphere< T, D, RG >::generateRandomPointsInSphere(), visconvex::handlecommand(), mazematrixD2createmaze< T >::impropermaze01(), init02(), particle::isIntersecting(), keyboard(), integration< D, F >::LJcalc(), d2homogeneous::matrixMultiply(), zprmouse::mouseratio(), d2homogeneous::operator*=(), halfspaceD2draw::rotate(), d2homogeneous::setRotateAboutPoint(), gausselim< T >::substitute(), randomtest::test01(), histogramtest::test01(), delaunaysimpleD2test::test01(), test01(), spiralindextest::test02(), randomtest::test02(), delaunaysimpleD2test::test02(), test02(), randomtest::test03(), halfspaceD3test::test03(), triangles3Tdisplaytest::test03(), test03(), spiralindextest::test04(), randomtest::test04(), triangles3Tdisplaytest::test04(), partitionstest::test06(), test13(), timmingexperiment03(), timmingexperiment04(), triangles3Tdisplaymulticolored< T, W >::triangles3Tdisplaymulticolored(), pointgrid3Ddraw::update(), pointgrid3Dbilineardraw::update(), and rpnp_to_c::visit().

Definition at line 51 of file main.cpp.

Definition at line 57 of file main.cpp.

gobjMyCircleDraw targetcurve(targetradius, pt3(targetcenter.x, targetcenter.y, 0.0), targetcircle)

Referenced by display().

Definition at line 52 of file main.cpp.

Definition at line 65 of file main.cpp.


Generated on Fri Mar 4 00:49:32 2011 for Chelton Evans Source by  doxygen 1.5.8