Go to the documentation of this file.00001 #include "dynamicvoronoi.h"
00002
00003 #include <iostream>
00004 #include <fstream>
00005 #include <string.h>
00006
00007 void loadPGM( std::istream &is, int *sizeX, int *sizeY, bool ***map ) {
00008 std::string tag;
00009 is >> tag;
00010 if (tag!="P5") {
00011 std::cerr << "Awaiting 'P5' in pgm header, found " << tag << std::endl;
00012 exit(-1);
00013 }
00014
00015 while (is.peek()==' ' || is.peek()=='\n') is.ignore();
00016 while (is.peek()=='#') is.ignore(255, '\n');
00017 is >> *sizeX;
00018 while (is.peek()=='#') is.ignore(255, '\n');
00019 is >> *sizeY;
00020 while (is.peek()=='#') is.ignore(255, '\n');
00021 is >> tag;
00022 if (tag!="255") {
00023 std::cerr << "Awaiting '255' in pgm header, found " << tag << std::endl;
00024 exit(-1);
00025 }
00026
00027 *map = new bool*[*sizeX];
00028
00029 for (int x=0; x<*sizeX; x++) {
00030 (*map)[x] = new bool[*sizeY];
00031 }
00032 for (int y=*sizeY-1; y>=0; y--) {
00033 for (int x=0; x<*sizeX; x++) {
00034 int c = is.get();
00035 if ((double)c<255-255*0.2) (*map)[x][y] = true;
00036 else (*map)[x][y] = false;
00037 if (!is.good()) {
00038 std::cerr << "Error reading pgm map.\n";
00039 exit(-1);
00040 }
00041 }
00042 }
00043 }
00044
00045
00046 int main( int argc, char *argv[] ) {
00047
00048 if(argc<2 || argc>3 || (argc==3 && strcmp(argv[2],"prune")!=0)) {
00049 std::cerr<<"usage: "<<argv[0]<<" <pgm map> [prune]\n";
00050 exit(-1);
00051 }
00052
00053 bool doPrune = false;
00054 if (argc==3) doPrune = true;
00055
00056 std::ifstream is(argv[1]);
00057 if (!is) {
00058 std::cerr << "Could not open map file for reading.\n";
00059 exit(-1);
00060 }
00061
00062 bool **map=NULL;
00063 int sizeX, sizeY;
00064 loadPGM( is, &sizeX, &sizeY, &map );
00065 is.close();
00066 fprintf(stderr, "Map loaded (%dx%d).\n", sizeX, sizeY);
00067
00068
00069 DynamicVoronoi voronoi;
00070 voronoi.initializeMap(sizeX, sizeY, map);
00071 voronoi.update();
00072 if (doPrune) voronoi.prune();
00073 voronoi.visualize("initial.ppm");
00074 std::cerr << "Generated initial frame.\n";
00075
00076
00077 char filename[20];
00078 int numPoints = 10 + sizeX*sizeY*0.005;
00079 for (int frame=1; frame<=10; frame++) {
00080 std::vector<IntPoint> newObstacles;
00081 for (int i=0; i<numPoints; i++) {
00082 double x = 2+rand()/(double)RAND_MAX*(sizeX-4);
00083 double y = 2+rand()/(double)RAND_MAX*(sizeY-4);
00084 newObstacles.push_back(IntPoint(x,y));
00085 }
00086 voronoi.exchangeObstacles(newObstacles);
00087 voronoi.update();
00088 if (doPrune) voronoi.prune();
00089 sprintf(filename, "update_%03d.ppm", frame);
00090 voronoi.visualize(filename);
00091 std::cerr << "Performed update with random obstacles.\n";
00092 }
00093
00094
00095
00096 std::vector<IntPoint> empty;
00097 voronoi.exchangeObstacles(empty);
00098 voronoi.update();
00099 if (doPrune) voronoi.prune();
00100 voronoi.visualize("final.ppm");
00101 std::cerr << "Done with final update (all random obstacles removed).\n";
00102 std::cerr << "Check initial.ppm, update_???.ppm and final.ppm.\n";
00103 return 0;
00104 }