From ece164a66059e703ced481629f8e14b21d304fc8 Mon Sep 17 00:00:00 2001 From: karl Date: Mon, 28 Dec 2020 12:23:23 +0100 Subject: [PATCH] Fix clang-format That earlier change introduced an error because YAML sucks --- .clang-format | 3 +- kdtree.h | 131 ++++++++++++++++++++++++-------------------------- 2 files changed, 66 insertions(+), 68 deletions(-) diff --git a/.clang-format b/.clang-format index 5f23e8f..a63e137 100644 --- a/.clang-format +++ b/.clang-format @@ -9,4 +9,5 @@ AllowShortLoopsOnASingleLine: 'false' AlwaysBreakBeforeMultilineStrings: 'true' IndentWidth: '4' ColumnLimit: 100 -... \ No newline at end of file + +... diff --git a/kdtree.h b/kdtree.h index a860e17..aa32d2c 100644 --- a/kdtree.h +++ b/kdtree.h @@ -8,97 +8,94 @@ struct Point; struct Triangle; struct Node { - Node(int axis, Point *point, Node *left, Node *right) - : axis(axis), point(point), left(left), right(right) {} + Node(int axis, Point *point, Node *left, Node *right) + : axis(axis), point(point), left(left), right(right) {} - int axis; + int axis; - Point *point; + Point *point; - Node *left; - Node *right; + Node *left; + Node *right; }; struct Triangle { - Triangle(Point *p1, Point *p2, Point *p3) : p1(p1), p2(p2), p3(p3) {} + Triangle(Point *p1, Point *p2, Point *p3) : p1(p1), p2(p2), p3(p3) {} - Point *p1; - Point *p2; - Point *p3; + Point *p1; + Point *p2; + Point *p3; }; struct Point { - Point(float coordinates[3], Triangle *triangle) - : coordinates(coordinates), triangle(triangle) {} + Point(float coordinates[3], Triangle *triangle) + : coordinates(coordinates), triangle(triangle) {} - float *coordinates; + float *coordinates; - Triangle *triangle; + Triangle *triangle; }; class KDTree { -public: - KDTree(std::vector points) { root = build(points, 0); } + public: + KDTree(std::vector points) { root = build(points, 0); } - ~KDTree() = default; + ~KDTree() = default; -private: - Node *root; + private: + Node *root; - int MAX_DEPTH = 500; + int MAX_DEPTH = 500; - // Returns a comparator lambda for assessing which of the two points has a - // greater coordinate in the given axis. - auto get_point_comparator(int axis) { - return [axis](Point *p1, Point *p2) { - return p1->coordinates[axis] < p2->coordinates[axis]; - }; - } - - Node *build(std::vector points, int depth) { - // Exit conditions - if (points.empty() || depth > MAX_DEPTH) { - return nullptr; + // Returns a comparator lambda for assessing which of the two points has a + // greater coordinate in the given axis. + auto get_point_comparator(int axis) { + return [axis](Point *p1, Point *p2) { + return p1->coordinates[axis] < p2->coordinates[axis]; + }; } - // Select axis by choosing the one with maximal extent - float max_extent = 0; - int axis = 0; + Node *build(std::vector points, int depth) { + // Exit conditions + if (points.empty() || depth > MAX_DEPTH) { return nullptr; } - for (int it_axis = 0; it_axis < 3; it_axis++) { - // Get extent along this axis - auto comparator = get_point_comparator(it_axis); + // Select axis by choosing the one with maximal extent + float max_extent = 0; + int axis = 0; - Point *min = *std::max_element(points.begin(), points.end(), comparator); - Point *max = *std::max_element(points.begin(), points.end(), comparator); + for (int it_axis = 0; it_axis < 3; it_axis++) { + // Get extent along this axis + auto comparator = get_point_comparator(it_axis); - float extent = max->coordinates[it_axis] - min->coordinates[it_axis]; + Point *min = *std::max_element(points.begin(), points.end(), comparator); + Point *max = *std::max_element(points.begin(), points.end(), comparator); - // Is it greater than max_extent? - if (extent > max_extent) { - // If so, make this the splitting axis - max_extent = extent; - axis = it_axis; - } + float extent = max->coordinates[it_axis] - min->coordinates[it_axis]; + + // Is it greater than max_extent? + if (extent > max_extent) { + // If so, make this the splitting axis + max_extent = extent; + axis = it_axis; + } + } + + // Choose the median as the pivot and sort the points into + // left-of-median and right-of-median using nth_element + int middle = points.size() / 2; + + std::nth_element(points.begin(), points.begin() + middle, points.end(), + get_point_comparator(axis)); + + Point *median; + float pivot; + + // TODO: This copies. Can we split the vector into two without copying? + std::vector left_of_median(points.begin(), points.begin() + middle); + std::vector right_of_median(points.begin() + middle, points.end()); + + // Create node, recursively call to construct subtree + return new Node(axis, median, build(left_of_median, depth + 1), + build(right_of_median, depth + 1)); } - - // Choose the median as the pivot and sort the points into - // left-of-median and right-of-median using nth_element - int middle = points.size() / 2; - - std::nth_element(points.begin(), points.begin() + middle, points.end(), - get_point_comparator(axis)); - - Point *median; - float pivot; - - // TODO: This copies. Can we split the vector into two without copying? - std::vector left_of_median(points.begin(), - points.begin() + middle); - std::vector right_of_median(points.begin() + middle, points.end()); - - // Create node, recursively call to construct subtree - return new Node(axis, median, build(left_of_median, depth + 1), - build(right_of_median, depth + 1)); - } };