diff --git a/.gitignore b/.gitignore index df49f5531e13ef66944f068c9240261f302bed9c..9cd8b607439442334b69b4389fc6cbb0b8b0c2bd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ /.cproject /Release/ /test.ps +/output.html diff --git a/src/delaunay.c b/src/delaunay.c index c37b4df3f86c093b097c98306a38d8acbbec63c7..1c2b7c588484b2d5d1c1a205b60e0004e96fb2c1 100644 --- a/src/delaunay.c +++ b/src/delaunay.c @@ -36,13 +36,13 @@ int comparePointsByX (const void * a, const void * b) { return 1; }*/ -int reportTriangle(vertex* p, int size, FILE *out) { +int reportTriangle(vertex a, vertex b, vertex c) { //qsort (p, size, sizeof(*p), comparePointsByX); //char *color = "255,0,0"; - svgDrawTriangle(*(p), *(p+1), *(p+2), out); + svgDrawTriangle(a, b, c); /*edge l = {p[0], p[1]}; svgDrawLine(l, out, color); @@ -236,7 +236,7 @@ int arrayContains(int *jAlreadyUsed, int numberOfJ, int j){ return 0; } -void clockwiseNextDelaunayEdge(int *p, int *q, int *r, vertex *S, int *size, int *right, FILE *out) { +void clockwiseNextDelaunayEdge(int *p, int *q, int *r, vertex *S, int *size, int *right) { //0: r not initialized, 1: r is left, 2: r is right *right = 0; double maxAngle; @@ -283,7 +283,7 @@ void clockwiseNextDelaunayEdge(int *p, int *q, int *r, vertex *S, int *size, int -void delaunayCws(vertex* S, int size, FILE *out, int draw) { +void delaunayCws(vertex* S, int size) { //struct Triangle delaunayTriangles[size-2]; for(int i = 0; i < size; i++){ //TODO eventuell nur j zurueckgeben (i haben wir ja schon) @@ -294,14 +294,12 @@ void delaunayCws(vertex* S, int size, FILE *out, int draw) { //TODO eventuell nur k zurueckgeben (i haben wir ja schon) int k; int isTriangle; - clockwiseNextDelaunayEdge(&i, &j, &k, S, &size, &isTriangle, out); + clockwiseNextDelaunayEdge(&i, &j, &k, S, &size, &isTriangle); if(i < j && i < k) { if(isTriangle == 2){ - vertex tri[3] = {S[i], S[j], S[k]}; - - if(draw){ - reportTriangle(tri, 3, out); - } +#ifdef OUTPUTFILE + reportTriangle(S[i], S[j], S[k]); +#endif } } j = k; diff --git a/src/delaunay.h b/src/delaunay.h index 228a9922fdd23cae61712cf12ce37c12c56ee073..68d4a21058efcc809eea8d0b6b4dd9b87f8227dc 100644 --- a/src/delaunay.h +++ b/src/delaunay.h @@ -16,17 +16,17 @@ #include "helper.h" -int reportTriangle(vertex* p, int size, FILE *out); +int reportTriangle(vertex, vertex, vertex); circle circle_vvv(vertex, vertex, vertex); void readFile(char*, char*); vertex vector(vertex, vertex); double distance(vertex, vertex); void generatePoints(vertex*, int); void printPoint(vertex); -void delaunayCws(vertex*, int, FILE*, int); +void delaunayCws(vertex*, int); void drawPoints(vertex*, int); void write_ppm(const char*); -void clockwiseNextDelaunayEdge(int *p, int *q, int *r, vertex *S, int *size, int *right, FILE *out); +void clockwiseNextDelaunayEdge(int *p, int *q, int *r, vertex *S, int *size, int *right); int firstDelaunayEdgeIncidentTo(int j, vertex* S, int size); char* vertexToString(vertex); circle circleFrom3Points(vertex, vertex, vertex); diff --git a/src/dwyer.c b/src/dwyer.c index 92b8d319ce6b9fb3e00d2b1c6e8aa003599971e9..9cdc0e4d15f716c605ffd94929832eb591bd9d70 100644 --- a/src/dwyer.c +++ b/src/dwyer.c @@ -533,8 +533,8 @@ else { /* Quicksort */ /* plots a site on your favorite device. */ plot_site(v) VERTEX_PTR v; { -#ifdef POSTSCRIPT - printf("p%d drawsite\n", v); +#ifdef OUTPUTFILE + fprintf(out, "p%d drawsite\n", v); #endif } diff --git a/src/helper.c b/src/helper.c index 6d7aa6ec0941f82d2e903b3eb6cc55a73b441a12..cfbf2ad3c06fd00f575cb611559a8a72bf5b7726 100644 --- a/src/helper.c +++ b/src/helper.c @@ -7,23 +7,39 @@ #include "helper.h" -void svgDrawLine(edge l, FILE *out, char *color) { +void svgDrawLine(edge l, char *color) { +#ifdef OUTPUTFILE fprintf(out, "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" style=\"stroke:rgb(%s);stroke-width:1\" />\n", l.a.x*W, l.a.y*H, l.b.x*W, l.b.y*H, color); +#endif } -void svgDrawCircle(circle c, FILE *out) { +void svgDrawCircle(circle c) { +#ifdef OUTPUTFILE fprintf(out, "<circle cx=\"%f\" cy=\"%f\" r=\"%f\" stroke=\"green\" stroke-width=\"1\" fill=\"none\" />", c.center.x*W, c.center.y*H, c.radius*W); +#endif } -void svgDrawTriangle(vertex a, vertex b, vertex c, FILE *out) { +void svgDrawTriangle(vertex a, vertex b, vertex c) { +#ifdef OUTPUTFILE fprintf(out, "<polygon points=\"%f,%f %f,%f %f,%f\" style=\"fill:none;stroke:purple;stroke-width:1\" />", a.x*W, a.y*H, b.x*W, b.y*H, c.x*W, c.y*H); +#endif } -void writeSvgStart (FILE *out) { +void svgDrawSite(vertex v) { +#ifdef OUTPUTFILE + fprintf(out, "<circle cx=\"%f\" cy=\"%f\" r=\"%f\" stroke=\"black\" stroke-width=\"1\" fill=\"black\" />", v.x*W, v.y*H, 2); +#endif +} + +void writeSvgStart () { +#ifdef OUTPUTFILE fprintf (out, "<!DOCTYPE html>\n<html>\n<body>\n<svg width=\"%d\" height=\"%d\">\n", W, H); +#endif } -void writeSvgEnd (FILE *out) { +void writeSvgEnd () { +#ifdef OUTPUTFILE fprintf (out, "</svg>\n</body>\n</html>\n"); +#endif } diff --git a/src/helper.h b/src/helper.h index ab2ffaf0e2577e84374b23c4c7c0c4f03cf59e4a..581f2f955e593a70bfc702da460722bdd47d70fd 100644 --- a/src/helper.h +++ b/src/helper.h @@ -34,10 +34,10 @@ typedef struct { vertex b; } edge; -void writeSvgStart (FILE*); -void writeSvgEnd (FILE*); -void svgDrawLine(edge, FILE *, char *); -void svgDrawCircle(circle, FILE *); -void svgDrawTriangle(vertex, vertex, vertex, FILE*); +void writeSvgStart (); +void writeSvgEnd (); +void svgDrawLine(edge, char *); +void svgDrawCircle(circle); +void svgDrawTriangle(vertex, vertex, vertex); #endif /* HELPER_H_ */ diff --git a/src/main.c b/src/main.c index e442abf137c5afb086ebbc075ce5aea005ce3fc7..28982b32de4c61af67acc19c9f8bc931db99fabc 100644 --- a/src/main.c +++ b/src/main.c @@ -5,16 +5,21 @@ * Author: Mika */ +#define OUTPUTFILE "output.html" + #include "delaunay.h" #include "voronoi.h" +#ifdef OUTPUTFILE +FILE *out; +#endif + int main(int argc, char *argv[]) { - //input: 1. function 0=cws_delaunay 2. # of points, 3. draw? 4. # of executions + //input: 1. function 0=cws_delaunay 2. # of points, 3. # of executions //create_image(); //write_ppm ( "sine.ppm" ); int numberOfPoints = 10000; int function = 0; - int draw = 0; int executions = 1; if(argc > 0) { //printf("%s\n", argv[0]); @@ -26,58 +31,53 @@ int main(int argc, char *argv[]) { } - //puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ - //printf("%d\n", RAND_MAX); vertex points[numberOfPoints]; - printf("%lu\n", sizeof(points)); generatePoints(points, numberOfPoints); + printf("%u\n", sizeof(points)); + fflush(stdout); //drawPoints(points, numberOfPoints); +#ifdef OUTPUTFILE + out = fopen ( OUTPUTFILE, "w" ); + writeSvgStart ( out ); +#endif + clock_t begin = clock(); switch(function){ case 0: for(int i = 0; i < executions; i++) { - FILE *out = NULL; - if(draw) { - out = fopen ( "delaunay.html", "w" ); - writeSvgStart ( out ); - } - delaunayCws(points, numberOfPoints, out, draw); - if(draw){ - writeSvgEnd ( out ); - fclose(out); - } + delaunayCws(points, numberOfPoints); } break; case 1: for(int i = 0; i < executions; i++) { - FILE *out = NULL; - if(draw) { - - out = fopen ( "voronoi.html", "w" ); - writeSvgStart ( out ); - } - voronoiCws(points, numberOfPoints, out, draw); - if(draw){ - writeSvgEnd ( out ); - fclose(out); - } + voronoiCws(points, numberOfPoints); } break; case 2: - dwyer('m', points, numberOfPoints); + printf("test\n"); + fflush(stdout); + for(int i = 0; i < executions; i++) { + dwyer('m', points, numberOfPoints); + } + break; default: break; } clock_t end = clock(); + +#ifdef OUTPUTFILE + writeSvgEnd ( out ); + fclose(out); +#endif + double number_of_clocks = (double) (end-begin); double time_spent = (double)(end - begin) / CLOCKS_PER_SEC; printf("Number of clocks: %f\n", number_of_clocks); printf("Time spent: %f\n", time_spent); - //readFile("test.txt", "r"); return EXIT_SUCCESS; } diff --git a/src/voronoi.c b/src/voronoi.c index f096a76f5d5417df02404265d8549d5c6e55866a..8d867b54a2d4317f4c427821a098eb91db5c48f9 100644 --- a/src/voronoi.c +++ b/src/voronoi.c @@ -13,11 +13,11 @@ circle center(vertexCircle vc) { circle c = circleFrom3Points(vc.a, vc.b, vc.c); return c; } -int reportEdge(edge l, FILE *out) { +int reportEdge(edge l) { //svgDrawCircle(a,out); //svgDrawCircle(b,out); char *color = "0,0,255"; - svgDrawLine(l, out, color); + svgDrawLine(l, color); return 0; } @@ -71,7 +71,7 @@ int outOfBorder(vertex v) { return 0; } -void voronoiCws(vertex* S, int size, FILE *out, int draw) { +void voronoiCws(vertex* S, int size) { for(int i = 0; i < size; i++){ int j = firstDelaunayEdgeIncidentTo(i, S, size); int j0 = j; @@ -82,7 +82,7 @@ void voronoiCws(vertex* S, int size, FILE *out, int draw) { do { int k; int isTriangle; - clockwiseNextDelaunayEdge(&i, &j, &k, S, &size, &isTriangle, out); + clockwiseNextDelaunayEdge(&i, &j, &k, S, &size, &isTriangle); if(isTriangle == 2) { currentV = vertexCircle2vertex((vertexCircle){S[i], S[j], S[k]}); if(first) { @@ -90,16 +90,14 @@ void voronoiCws(vertex* S, int size, FILE *out, int draw) { firstV = currentV; } else { if(!outOfBorder(currentV)) { - if(draw) { +#ifdef OUTPUTFILE reportEdge((edge){currentV, lastV}, out); - - } +#endif } if(k == j0) { - if(draw) { - reportEdge((edge){currentV, firstV}, out); - - } +#ifdef OUTPUTFILE + reportEdge((edge){currentV, firstV}); +#endif } } } else if(isTriangle == 1) { @@ -111,26 +109,24 @@ void voronoiCws(vertex* S, int size, FILE *out, int draw) { firstV = currentV; } else { if(!outOfBorder(lastV)) { - if(draw) { +#ifdef OUTPUTFILE reportEdge((edge){currentV, lastV}, out); - - } +#endif } } currentV = findBorderVertex(S[i], S[k]); if(k == j0) { if(!outOfBorder(firstV)) { - reportEdge((edge){currentV, firstV}, out); + reportEdge((edge){currentV, firstV}); } } } lastV = currentV; if(i < j && i < k) { if(isTriangle == 2){ - vertex tri[3] = {S[i], S[j], S[k]}; - if(draw){ - reportTriangle(tri, 3, out); - } +#ifdef OUTPUTFILE + reportTriangle(S[i], S[j], S[k]); +#endif } } j = k; diff --git a/src/voronoi.h b/src/voronoi.h index 7f6edb39873794ff29a91cb76acd188df416b32b..4723923699629aa272d0d0b90b7a435b219bb0e4 100644 --- a/src/voronoi.h +++ b/src/voronoi.h @@ -50,9 +50,9 @@ edgeCircle clockwiseNextVoronoiEdge(edgeCircle e); */ edgeCircle nextVoronoiEdgeOnBoudary(edgeCircle e); -int reportEdge(edge l, FILE *out); +int reportEdge(edge l); -void voronoiCws(vertex* S, int size, FILE *out, int draw); +void voronoiCws(vertex* S, int size); #endif /* SRC_VORONOI_H_ */