quicksort for < 20 points
diff --git a/src/delaunator.cpp b/src/delaunator.cpp index c05b127..e4517dc 100644 --- a/src/delaunator.cpp +++ b/src/delaunator.cpp
@@ -3,6 +3,7 @@ #include <cstdio> #include <limits> #include <tuple> +#include <exception> using namespace std; @@ -78,6 +79,91 @@ return make_tuple(x, y); } + double compare( + const vector<double> &coords, + unsigned long int i, + unsigned long int j, + double cx, + double cy + ) { + const double d1 = dist(coords[2 * i], coords[2 * i + 1], cx, cy); + const double d2 = dist(coords[2 * j], coords[2 * j + 1], cx, cy); + const double diff1 = d1 - d2; + const double diff2 = coords[2 * i] - coords[2 * j]; + const double diff3 = coords[2 * i + 1] - coords[2 * j + 1]; + + if (diff1) { + return diff1; + } else if(diff2) { + return diff2; + } else { + return diff3; + } + } + void quicksort( + unsigned long int ids[], + const vector<double> &coords, + unsigned int left, + unsigned int right, + double &cx, + double &cy + ) { + long int i; + long int j; + unsigned long int temp; + + if (right - left <= 20) { + for (i = left + 1; i <= right; i++) { + // printf("i=%lu\n", i); + temp = ids[i]; + j = i - 1; + while ( + j >= left && + compare(coords, ids[j], temp, cx, cy) > 0 + ) { + // printf("j=%lu\n", j); + ids[j + 1] = ids[j]; + j--; + } + ids[j + 1] = temp; + } + } else { + throw runtime_error("not implemented"); + }// else { + // const median = (left + right) >> 1; + // i = left + 1; + // j = right; + // swap(ids, median, i); + // if (compare(coords, ids[left], ids[right], cx, cy) > 0) swap(ids, left, right); + // if (compare(coords, ids[i], ids[right], cx, cy) > 0) swap(ids, i, right); + // if (compare(coords, ids[left], ids[i], cx, cy) > 0) swap(ids, left, i); + + // temp = ids[i]; + // while (true) { + // do i++; while (compare(coords, ids[i], temp, cx, cy) < 0); + // do j--; while (compare(coords, ids[j], temp, cx, cy) > 0); + // if (j < i) break; + // swap(ids, i, j); + // } + // ids[left + 1] = ids[j]; + // ids[j] = temp; + + // if (right - i + 1 >= j - left) { + // quicksort(ids, coords, i, right, cx, cy); + // quicksort(ids, coords, left, j - 1, cx, cy); + // } else { + // quicksort(ids, coords, left, j - 1, cx, cy); + // quicksort(ids, coords, i, right, cx, cy); + // } + // } + } + void print_array(unsigned long int ids[], unsigned int size) { + printf("["); + for (unsigned int i = 0; i < size; i++) { + printf("%lu, ", ids[i]); + } + printf("]\n"); + } } Delaunator::Delaunator(const vector<double> &coords) { @@ -86,7 +172,7 @@ double max_y = -1 * max_double; double min_x = max_double; double min_y = max_double; - unsigned int ids[n]; + unsigned long int ids[n]; for (long int i = 0; i < n; i++) { const double x = coords[2 * i]; const double y = coords[2 * i + 1]; @@ -171,6 +257,9 @@ tie(center_x, center_y) = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); // [cx, cy) = center; + print_array(ids, n); + quicksort(ids, coords, 0, n - 1, center_x, center_y); + print_array(ids, n); - printf("i0x=%f i0y=%f", i0x, i0y); + // printf("i0x=%f i0y=%f", i0x, i0y); };