Foam::point Foam::directionInfo::eMid ( const primitiveMesh& mesh, const label edgeI ) { const edge& e = mesh.edges()[edgeI]; return 0.5 * (mesh.points()[e.start()] + mesh.points()[e.end()]); }
// Determine for each edge the intersection point. Calculates // - cutPoints_ : coordinates of all intersection points // - edgePoint : per edge -1 or the index into cutPoints void Foam::cuttingPlane::intersectEdges ( const primitiveMesh& mesh, const scalarField& dotProducts, List<label>& edgePoint ) { // Use the dotProducts to find out the cut edges. const edgeList& edges = mesh.edges(); const pointField& points = mesh.points(); // Per edge -1 or the label of the intersection point edgePoint.setSize(edges.size()); DynamicList<point> dynCuttingPoints(4*cutCells_.size()); forAll(edges, edgeI) { const edge& e = edges[edgeI]; if ( (dotProducts[e[0]] < zeroish && dotProducts[e[1]] > positive) || (dotProducts[e[1]] < zeroish && dotProducts[e[0]] > positive) ) { // Edge is cut edgePoint[edgeI] = dynCuttingPoints.size(); const point& p0 = points[e[0]]; const point& p1 = points[e[1]]; scalar alpha = lineIntersect(linePointRef(p0, p1)); if (alpha < zeroish) { dynCuttingPoints.append(p0); } else if (alpha >= 1.0) { dynCuttingPoints.append(p1); } else { dynCuttingPoints.append((1-alpha)*p0 + alpha*p1); } } else { edgePoint[edgeI] = -1; } } this->storedPoints().transfer(dynCuttingPoints); }
// Calculate some edge statistics on mesh. Return min. edge length over all // directions but exclude component (0=x, 1=y, 2=z, other=none) scalar getEdgeStats(const primitiveMesh& mesh, const direction excludeCmpt) { label nX = 0; label nY = 0; label nZ = 0; scalar minX = GREAT; scalar maxX = -GREAT; vector x(1, 0, 0); scalar minY = GREAT; scalar maxY = -GREAT; vector y(0, 1, 0); scalar minZ = GREAT; scalar maxZ = -GREAT; vector z(0, 0, 1); scalar minOther = GREAT; scalar maxOther = -GREAT; const edgeList& edges = mesh.edges(); forAll(edges, edgeI) { const edge& e = edges[edgeI]; vector eVec(e.vec(mesh.points())); scalar eMag = mag(eVec); eVec /= eMag; if (mag(eVec & x) > 1-edgeTol) { minX = min(minX, eMag); maxX = max(maxX, eMag); nX++; } else if (mag(eVec & y) > 1-edgeTol) { minY = min(minY, eMag); maxY = max(maxY, eMag); nY++; } else if (mag(eVec & z) > 1-edgeTol) { minZ = min(minZ, eMag); maxZ = max(maxZ, eMag); nZ++; } else { minOther = min(minOther, eMag); maxOther = max(maxOther, eMag); } } Info<< "Mesh bounding box:" << boundBox(mesh.points()) << nl << nl << "Mesh edge statistics:" << nl << " x aligned : number:" << nX << "\tminLen:" << minX << "\tmaxLen:" << maxX << nl << " y aligned : number:" << nY << "\tminLen:" << minY << "\tmaxLen:" << maxY << nl << " z aligned : number:" << nZ << "\tminLen:" << minZ << "\tmaxLen:" << maxZ << nl << " other : number:" << mesh.nEdges() - nX - nY - nZ << "\tminLen:" << minOther << "\tmaxLen:" << maxOther << nl << endl; if (excludeCmpt == 0) { return min(minY, min(minZ, minOther)); } else if (excludeCmpt == 1) { return min(minX, min(minZ, minOther)); } else if (excludeCmpt == 2) { return min(minX, min(minY, minOther)); } else { return min(minX, min(minY, min(minZ, minOther))); } }
void writePointSet ( const bool binary, const primitiveMesh& mesh, const topoSet& set, const fileName& fileName ) { std::ofstream pStream(fileName.c_str()); pStream << "# vtk DataFile Version 2.0" << std::endl << set.name() << std::endl; if (binary) { pStream << "BINARY" << std::endl; } else { pStream << "ASCII" << std::endl; } pStream << "DATASET POLYDATA" << std::endl; //------------------------------------------------------------------ // // Write topology // //------------------------------------------------------------------ labelList pointLabels(set.toc()); pointField setPoints(mesh.points(), pointLabels); // Write points pStream << "POINTS " << pointLabels.size() << " float" << std::endl; DynamicList<floatScalar> ptField(3*pointLabels.size()); writeFuns::insert(setPoints, ptField); writeFuns::write(pStream, binary, ptField); //----------------------------------------------------------------- // // Write data // //----------------------------------------------------------------- // Write pointID pStream << "POINT_DATA " << pointLabels.size() << std::endl << "FIELD attributes 1" << std::endl; // Cell ids first pStream << "pointID 1 " << pointLabels.size() << " int" << std::endl; writeFuns::write(pStream, binary, pointLabels); }
// Calculate some edge statistics on mesh. void printEdgeStats(const primitiveMesh& mesh) { label nX = 0; label nY = 0; label nZ = 0; scalar minX = GREAT; scalar maxX = -GREAT; vector x(1, 0, 0); scalar minY = GREAT; scalar maxY = -GREAT; vector y(0, 1, 0); scalar minZ = GREAT; scalar maxZ = -GREAT; vector z(0, 0, 1); scalar minOther = GREAT; scalar maxOther = -GREAT; const edgeList& edges = mesh.edges(); forAll (edges, edgeI) { const edge& e = edges[edgeI]; vector eVec(e.vec(mesh.points())); scalar eMag = mag(eVec); eVec /= eMag; if (mag(eVec & x) > 1 - edgeTol) { minX = min(minX, eMag); maxX = max(maxX, eMag); nX++; } else if (mag(eVec & y) > 1 - edgeTol) { minY = min(minY, eMag); maxY = max(maxY, eMag); nY++; } else if (mag(eVec & z) > 1 - edgeTol) { minZ = min(minZ, eMag); maxZ = max(maxZ, eMag); nZ++; } else { minOther = min(minOther, eMag); maxOther = max(maxOther, eMag); } } Pout<< "Mesh edge statistics:" << endl << " x aligned : number:" << nX << "\tminLen:" << minX << "\tmaxLen:" << maxX << endl << " y aligned : number:" << nY << "\tminLen:" << minY << "\tmaxLen:" << maxY << endl << " z aligned : number:" << nZ << "\tminLen:" << minZ << "\tmaxLen:" << maxZ << endl << " other : number:" << mesh.nEdges() - nX - nY - nZ << "\tminLen:" << minOther << "\tmaxLen:" << maxOther << endl << endl; }