From e7f18acc7d160f3bf1d22e91e95952de1df88524 Mon Sep 17 00:00:00 2001 From: karl Date: Mon, 28 Dec 2020 12:17:44 +0100 Subject: [PATCH] Move point comparator lambda to function This avoids some code duplication --- kdtree.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/kdtree.h b/kdtree.h index 14d56a2..a860e17 100644 --- a/kdtree.h +++ b/kdtree.h @@ -47,6 +47,14 @@ private: 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) { @@ -59,9 +67,7 @@ private: for (int it_axis = 0; it_axis < 3; it_axis++) { // Get extent along this axis - auto comparator = [it_axis](Point *p1, Point *p2) { - return p1->coordinates[it_axis] < p2->coordinates[it_axis]; - }; + auto comparator = get_point_comparator(it_axis); Point *min = *std::max_element(points.begin(), points.end(), comparator); Point *max = *std::max_element(points.begin(), points.end(), comparator); @@ -80,12 +86,8 @@ private: // left-of-median and right-of-median using nth_element int middle = points.size() / 2; - // TODO: Code duplication from the comparator in the earlier axis assessment - // loop std::nth_element(points.begin(), points.begin() + middle, points.end(), - [axis](Point *p1, Point *p2) { - return p1->coordinates[axis] < p2->coordinates[axis]; - }); + get_point_comparator(axis)); Point *median; float pivot;