void divide_and_conquer(const pointVec_t &P, pointVec_t &H, point_t p1, point_t p2, bool buffered) { assert(P.size() >= 2); pointVec_t P_reduced; pointVec_t H1, H2; point_t p_far; if(buffered) { p_far = divide<SplitByCP_buf>(P, P_reduced, p1, p2); } else { p_far = divide<SplitByCP>(P, P_reduced, p1, p2); } if (P_reduced.size()<2) { H.push_back(p1); #if USECONCVEC appendVector(P_reduced, H); #else // insert into STD::VECTOR H.insert(H.end(), P_reduced.begin(), P_reduced.end()); #endif } else { divide_and_conquer(P_reduced, H1, p1, p_far, buffered); divide_and_conquer(P_reduced, H2, p_far, p2, buffered); #if USECONCVEC appendVector(H1, H); appendVector(H2, H); #else // insert into STD::VECTOR H.insert(H.end(), H1.begin(), H1.end()); H.insert(H.end(), H2.begin(), H2.end()); #endif } }
void quickhull(const pointVec_t &points, pointVec_t &hull) { if (points.size() < 2) { hull.insert(hull.end(), points.begin(), points.end()); return; } point_t p_maxx = extremum<FindXExtremum::maxX>(points); point_t p_minx = extremum<FindXExtremum::minX>(points); pointVec_t H; divide_and_conquer(points, hull, p_maxx, p_minx); divide_and_conquer(points, H, p_minx, p_maxx); hull.insert(hull.end(), H.begin(), H.end()); }
void divide_and_conquer(const pointVec_t &P, pointVec_t &H, point_t p1, point_t p2) { assert(P.size() >= 2); pointVec_t P_reduced; pointVec_t H1, H2; point_t p_far = divide(P, P_reduced, p1, p2); if (P_reduced.size()<2) { H.push_back(p1); H.insert(H.end(), P_reduced.begin(), P_reduced.end()); } else { divide_and_conquer(P_reduced, H1, p1, p_far); divide_and_conquer(P_reduced, H2, p_far, p2); H.insert(H.end(), H1.begin(), H1.end()); H.insert(H.end(), H2.begin(), H2.end()); } }
void quickhull(const pointVec_t &points, pointVec_t &hull, bool buffered) { if (points.size() < 2) { #if USECONCVEC appendVector(points, hull); #else // STD::VECTOR hull.insert(hull.end(), points.begin(), points.end()); #endif // USECONCVEC return; } point_t p_maxx = extremum<FindXExtremum::maxX>(points); point_t p_minx = extremum<FindXExtremum::minX>(points); pointVec_t H; divide_and_conquer(points, hull, p_maxx, p_minx, buffered); divide_and_conquer(points, H, p_minx, p_maxx, buffered); #if USECONCVEC appendVector(H, hull); #else // STD::VECTOR hull.insert(hull.end(), H.begin(), H.end()); #endif // USECONCVEC }
point_t divide(const pointVec_t &P, pointVec_t &P_reduced, const point_t &p1, const point_t &p2) { SplitByCP splitByCP(p1, p2, P_reduced); point_t farPoint = std::for_each(P.begin(), P.end(), splitByCP); if(util::verbose) { std::stringstream ss; ss << P.size() << " nodes in bucket"<< ", " << "dividing by: [ " << p1 << ", " << p2 << " ], " << "farthest node: " << farPoint; util::OUTPUT.push_back(ss.str()); } return farPoint; }
void appendVector(const pointVec_t& src, pointVec_t& dest) { std::copy(src.begin(), src.end(), dest.grow_by(src.size())); }
point_t extremum(const pointVec_t &points) { assert(!points.empty()); return std::for_each(points.begin(), points.end(), FindXExtremum(points[0], type)); }
void appendVector(mutex_t& insertMutex, const point_t* src, size_t srcSize, pointVec_t& dest) { mutex_t::scoped_lock lock(insertMutex); dest.insert(dest.end(), src, src + srcSize); }
void appendVector(mutex_t& insertMutex, const pointVec_t& src, pointVec_t& dest) { mutex_t::scoped_lock lock(insertMutex); dest.insert(dest.end(), src.begin(), src.end()); }