diff --git a/src/delaunay.c b/src/delaunay.c index fcdcca87847be230d21ba3d3267377759a9124e8..812294eb9c845292a511935ee5e20a74e767358b 100644 --- a/src/delaunay.c +++ b/src/delaunay.c @@ -89,6 +89,19 @@ double det2(double a, double b, double c, double d) { return a*d-b*c; } +void circleCenter(const vertex* v1, const vertex* v2, const vertex* v3, + vertex* center) { + double ax = 2 * (v1->x - v2->x); + double bx = 2 * (v1->y - v2->y); + double cx = v1->x * v1->x - v2->x * v2->x + v1->y * v1->y - v2->y * v2->y; + double ay = 2 * (v1->x - v3->x); + double by = 2 * (v1->y - v3->y); + double cy = v1->x * v1->x - v3->x * v3->x + v1->y * v1->y - v3->y * v3->y; + double det = det2(ax, bx, ay, by); + center->x = det2(cx, bx, cy, by) / det; + center->y = det2(ax, cx, ay, cy) / det; +} + /* * https://stackoverflow.com/questions/22791951/algorithm-to-find-an-arc-its-center-radius-and-angles-given-3-points * https://de.wikipedia.org/wiki/Cramersche_Regel @@ -97,15 +110,7 @@ double det2(double a, double b, double c, double d) { //TODO seperate radius from this function circle circleFrom3Points(vertex v1, vertex v2, vertex v3) { circle c; - double ax = 2*(v1.x-v2.x); - double bx = 2*(v1.y-v2.y); - double cx = v1.x*v1.x - v2.x*v2.x + v1.y*v1.y - v2.y*v2.y; - double ay = 2*(v1.x-v3.x); - double by = 2*(v1.y-v3.y); - double cy = v1.x*v1.x - v3.x*v3.x + v1.y*v1.y - v3.y*v3.y; - double det = det2(ax, bx, ay, by); - c.center.x = det2(cx, bx, cy, by)/det; - c.center.y = det2(ax, cx, ay, cy)/det; + circleCenter(&v1, &v2, &v3, &c.center); c.radius = sqrt((v1.x-c.center.x)*(v1.x-c.center.x)+(v1.y-c.center.y)*(v1.y-c.center.y)); return c; } diff --git a/src/main.c b/src/main.c index 845c9411bdf29871d4dedecb4538fd4f6881e73b..49640866c62e4b74cae63ba6b4bd0e6ecb24da19 100644 --- a/src/main.c +++ b/src/main.c @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) { //input: 1. function 0=cws_delaunay 2. # of points, 3. # of executions //create_image(); //write_ppm ( "sine.ppm" ); - int numberOfPoints = 2000; + int numberOfPoints = 10000; int function = 0; int executions = 1; if(argc > 0) { diff --git a/src/voronoi.c b/src/voronoi.c index 250a769a3b6466fbee54a3d06eefcdaec7a70122..15bafae9de32c9dc458d174b500c0a09ad234927 100644 --- a/src/voronoi.c +++ b/src/voronoi.c @@ -83,7 +83,8 @@ void voronoiCws(vertex* S, int size) { int isTriangle; clockwiseNextDelaunayEdge(&i, &j, &k, S, &size, &isTriangle); if(isTriangle == 2) { - currentV = vertexCircle2vertex((vertexCircle){S[i], S[j], S[k]}); + //currentV = vertexCircle2vertex((vertexCircle){S[i], S[j], S[k]}); + circleCenter(S[i], S[j], S[k], currentV); if(first) { first = 0; firstV = currentV;