// Step across point to other edge on face Foam::label Foam::regionSide::otherEdge ( const primitiveMesh& mesh, const label faceI, const label edgeI, const label pointI ) { const edge& e = mesh.edges()[edgeI]; // Get other point on edge. label freePointI = e.otherVertex(pointI); const labelList& fEdges = mesh.faceEdges()[faceI]; forAll(fEdges, fEdgeI) { const label otherEdgeI = fEdges[fEdgeI]; const edge& otherE = mesh.edges()[otherEdgeI]; if ( ( otherE.start() == pointI && otherE.end() != freePointI ) || ( otherE.end() == pointI && otherE.start() != freePointI ) ) { // otherE shares one (but not two) points with e. return otherEdgeI; } } FatalErrorIn ( "regionSide::otherEdge(const primitiveMesh&, const label, const label" ", const label)" ) << "Cannot find other edge on face " << faceI << " that uses point " << pointI << " but not point " << freePointI << endl << "Edges on face:" << fEdges << " verts:" << UIndirectList<edge>(mesh.edges(), fEdges)() << " Vertices on face:" << mesh.faces()[faceI] << " Vertices on original edge:" << e << abort(FatalError); return -1; }
void Foam::cuttingPlane::calcCutCells ( const primitiveMesh& mesh, const scalarField& dotProducts, const labelUList& cellIdLabels ) { const labelListList& cellEdges = mesh.cellEdges(); const edgeList& edges = mesh.edges(); label listSize = cellEdges.size(); if (notNull(cellIdLabels)) { listSize = cellIdLabels.size(); } cutCells_.setSize(listSize); label cutcellI(0); // Find the cut cells by detecting any cell that uses points with // opposing dotProducts. for (label listI = 0; listI < listSize; ++listI) { label cellI = listI; if (notNull(cellIdLabels)) { cellI = cellIdLabels[listI]; } const labelList& cEdges = cellEdges[cellI]; label nCutEdges = 0; forAll(cEdges, i) { const edge& e = edges[cEdges[i]]; if ( (dotProducts[e[0]] < zeroish && dotProducts[e[1]] > positive) || (dotProducts[e[1]] < zeroish && dotProducts[e[0]] > positive) ) { nCutEdges++; if (nCutEdges > 2) { cutCells_[cutcellI++] = cellI; break; } } } } // Set correct list size cutCells_.setSize(cutcellI); }
// 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); }
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()]); }
// Step across point to other edge on face Foam::label Foam::regionSide::otherEdge ( const primitiveMesh& mesh, const label faceI, const label edgeI, const label pointI ) { const edge& e = mesh.edges()[edgeI]; // Get other point on edge. label freePointI = e.otherVertex(pointI); const labelList& fEdges = mesh.faceEdges()[faceI]; forAll(fEdges, fEdgeI) { label otherEdgeI = fEdges[fEdgeI]; const edge& otherE = mesh.edges()[otherEdgeI]; if ( ( otherE.start() == pointI && otherE.end() != freePointI ) || ( otherE.end() == pointI && otherE.start() != freePointI ) ) { // otherE shares one (but not two) points with e. return otherEdgeI; } }
// Find edge between points v0 and v1. label findEdge(const primitiveMesh& mesh, const label v0, const label v1) { const labelList& pEdges = mesh.pointEdges()[v0]; forAll(pEdges, pEdgeI) { label edgeI = pEdges[pEdgeI]; const edge& e = mesh.edges()[edgeI]; if (e.otherVertex(v0) == v1) { return edgeI; } }
// 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))); } }
// 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; }