#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <queue>
#include <deque>
#include <stack>
#include <algorithm>
#include <set>
#include <math.h>
#include <assert.h>
#include <limits>
#include <climits>
#include <string>
#include <time.h>
#include <malloc.h>
#include <getopt.h>
#include "vor_bitmap.h"
#include "background.h"

#define tprintf(...) printf("### %lf ### ", clock ()*1e-6); printf(__VA_ARGS__)

void function(VoronoiDiagramBitmap *vor)
{
      vor->set_bounds(0, vor->get_nb_vertex());
      vor->generate_func(0, 1, 2);
      vor->add_points(1);
      vor->export_function_ppma(); 
}

void classic(VoronoiDiagramBitmap *vor)
{
      vor->set_bounds(0, vor->get_nb_vertex());
      vor->generate();
      vor->add_points(1);
      vor->add_isolines(0.01, 0.0005);  
      vor->add_vorface();
      vor->export_vor_ppma(); 
}

void incremental(VoronoiDiagramBitmap *vor)
{
    for (int i = 0; i < vor->get_nb_vertex(); i++)
    {
      vor->set_bounds(0, i+1);
      vor->generate();
      vor->add_points(1);
      vor->add_isolines(0.01, 0.001);  
      vor->export_vor_ppma();    
    }
}

void lloyd(VoronoiDiagramBitmap *vor, int iter)
{
    vor->set_bounds(0, vor->get_nb_vertex());
    
//     progress_bar pbar(iter);
    
    for (int i = 0; i < iter; i++)
    {
//       pbar.progress(i);
      vor->generate();
      vor->add_vorface();
      vor->add_points(0);
      vor->export_vor_ppma();
      vor->lloyd();
    }
//     pbar.end();
    
    vor->add_points(1);
    vor->add_isolines(0.005, 0.0005);
    vor->add_vorface();
    vor->export_vor_ppma();
}

int main(int argc, char** argv)
{
    char filename[100];
    int error = 0;
    sprintf(filename, "%s.dat", argv[1]);
    printf("Reading %s ....\n", filename);
    FILE *fp = fopen(filename, "r");
    int nb_vx;
    if (fscanf(fp, "%d", &nb_vx) != 1)
        error++;
    printf("--> %d vertices\n", nb_vx);

    double *vx = new double[2 * nb_vx];
    for (int i = 0; i < nb_vx; i++)
    {
        double x, y, z;
        int index;
        if (fscanf(fp, "%lf %lf", &x, &y) != 2)
                error++;
        vx[2*i] = (double)x;
        vx[2*i+1] = (double)y;
    }
        
    fclose(fp);

    Background *bg = new Background(-0.1, -0.1, 1.2, 1.2);    
    VoronoiDiagramBitmap *vor = new VoronoiDiagramBitmap(vx, nb_vx, 0.1, 1500, bg);
      
//     function(vor);
    classic(vor);
//     lloyd(vor, 100);

    delete vor;
}