// Construct as the bounding box of the given pointField Foam::treeBoundBox::treeBoundBox ( const UList<point>& points, const UList<label>& meshPoints ) : boundBox() { if (points.empty() || meshPoints.empty()) { WarningIn ( "treeBoundBox::treeBoundBox" "(const UList<point>&, const UList<label>&)" ) << "cannot find bounding box for zero-sized pointField" << "returning zero" << endl; return; } min() = points[meshPoints[0]]; max() = points[meshPoints[0]]; for (label i = 1; i < meshPoints.size(); i++) { min() = ::Foam::min(min(), points[meshPoints[i]]); max() = ::Foam::max(max(), points[meshPoints[i]]); } }
void Foam::boundBox::calculate(const UList<point>& points, const bool doReduce) { if (points.empty()) { min_ = Zero; max_ = Zero; if (doReduce && Pstream::parRun()) { // Use values that get overwritten by reduce minOp, maxOp below min_ = point(VGREAT, VGREAT, VGREAT); max_ = point(-VGREAT, -VGREAT, -VGREAT); } } else { min_ = points[0]; max_ = points[0]; for (label i = 1; i < points.size(); i++) { min_ = ::Foam::min(min_, points[i]); max_ = ::Foam::max(max_, points[i]); } } // Reduce parallel information if (doReduce) { reduce(min_, minOp<point>()); reduce(max_, maxOp<point>()); } }
Foam::label Foam::mergePoints ( const UList<Type>& points, const scalar mergeTol, const bool verbose, labelList& pointMap, const Type& origin ) { Type compareOrigin = origin; if (origin == Type::max) { if (points.size()) { compareOrigin = sum(points)/points.size(); } } // Create a old to new point mapping array pointMap.setSize(points.size()); pointMap = -1; if (points.empty()) { return points.size(); } // We're comparing distance squared to origin first. // Say if starting from two close points: // x, y, z // x+mergeTol, y+mergeTol, z+mergeTol // Then the magSqr of both will be // x^2+y^2+z^2 // x^2+y^2+z^2 + 2*mergeTol*(x+z+y) + mergeTol^2*... // so the difference will be 2*mergeTol*(x+y+z) const scalar mergeTolSqr = Foam::sqr(scalar(mergeTol)); // Sort points by magSqr const Field<Type> d(points - compareOrigin); List<scalar> magSqrD(d.size()); forAll(d, pointI) { magSqrD[pointI] = magSqr(d[pointI]); }
Foam::treeBoundBox::treeBoundBox ( const UList<point>& points, const FixedList<label, Size>& indices ) : boundBox(points, indices, false) { // points may be empty, but a FixedList is never empty if (points.empty()) { WarningInFunction << "cannot find bounding box for zero-sized pointField, " << "returning zero" << endl; return; } }
Foam::boundBox::boundBox ( const UList<point>& points, const labelUList& indices, const bool doReduce ) : min_(Zero), max_(Zero) { if (points.empty() || indices.empty()) { if (doReduce && Pstream::parRun()) { // Use values that get overwritten by reduce minOp, maxOp below min_ = point(VGREAT, VGREAT, VGREAT); max_ = point(-VGREAT, -VGREAT, -VGREAT); } } else { min_ = points[indices[0]]; max_ = points[indices[0]]; for (label i=1; i < indices.size(); ++i) { min_ = ::Foam::min(min_, points[indices[i]]); max_ = ::Foam::max(max_, points[indices[i]]); } } // Reduce parallel information if (doReduce) { reduce(min_, minOp<point>()); reduce(max_, maxOp<point>()); } }
bool Foam::mergePoints ( const UList<point>& points, const scalar mergeTol, const bool verbose, labelList& pointMap, List<point>& newPoints, const point& origin ) { point compareOrigin = origin; if (origin == point(VGREAT, VGREAT, VGREAT)) { if (points.size()) { compareOrigin = sum(points)/points.size(); } } // Create a old to new point mapping array pointMap.setSize(points.size()); pointMap = -1; // Storage for merged points newPoints.setSize(points.size()); if (points.empty()) { return false; } const scalar mergeTolSqr = sqr(mergeTol); // Sort points by magSqr SortableList<scalar> sortedMagSqr(magSqr(points - compareOrigin)); bool hasMerged = false; label newPointI = 0; // Handle 0th point separately (is always unique) label pointI = sortedMagSqr.indices()[0]; pointMap[pointI] = newPointI; newPoints[newPointI++] = points[pointI]; for (label sortI = 1; sortI < sortedMagSqr.size(); sortI++) { // Get original point index label pointI = sortedMagSqr.indices()[sortI]; // Compare to previous points to find equal one. label equalPointI = -1; for ( label prevSortI = sortI - 1; prevSortI >= 0 && mag ( sortedMagSqr[prevSortI] - sortedMagSqr[sortI] ) <= mergeTolSqr; prevSortI-- ) { label prevPointI = sortedMagSqr.indices()[prevSortI]; if (magSqr(points[pointI] - points[prevPointI]) <= mergeTolSqr) { // Found match. equalPointI = prevPointI; break; } } if (equalPointI != -1) { // Same coordinate as equalPointI. Map to same new point. pointMap[pointI] = pointMap[equalPointI]; hasMerged = true; if (verbose) { Pout<< "Foam::mergePoints : Merging points " << pointI << " and " << equalPointI << " with coordinates:" << points[pointI] << " and " << points[equalPointI] << endl; } } else { // Differs. Store new point. pointMap[pointI] = newPointI; newPoints[newPointI++] = points[pointI]; } } newPoints.setSize(newPointI); return hasMerged; }