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) { appendVector(points, hull); 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); appendVector(H, hull); }
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); appendVector(P_reduced, H); } else { divide_and_conquer(P_reduced, H1, p1, p_far); divide_and_conquer(P_reduced, H2, p_far, p2); appendVector(H1, H); appendVector(H2, H); } }
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 }
void operator()(const range_t& range) { const size_t i_end = range.end(); size_t j = 0; double cp; point_t tmp_vec[grainSize]; for(size_t i = range.begin(); i != i_end; ++i) { if( (initialSet[i] != p1) && (initialSet[i] != p2) ) { cp = util::cross_product(p1, p2, initialSet[i]); if(cp>0) { tmp_vec[j++] = initialSet[i]; if(cp>howFar) { farPoint = initialSet[i]; howFar = cp; } } } } #if USECONCVEC appendVector(tmp_vec, j, reducedSet); #else // USE STD::VECTOR appendVector(insertMutex, tmp_vec, j, reducedSet); #endif // USECONCVEC }
static status initialiseBlockv(Block b, int argc, Any *argv) { int n; initialiseCode((Code) b); assign(b, members, newObject(ClassChain, EAV)); for(n=0; n<argc; n++) { if ( instanceOfObject(argv[n], ClassVar) ) { if ( isNil(b->parameters) ) assign(b, parameters, newObjectv(ClassCodeVector, 1, &argv[n])); else appendVector(b->parameters, 1, &argv[n]); } else break; } for( ; n < argc; n++ ) appendChain(b->members, argv[n]); succeed; }