void Mesh::elementCentroid(int elemIndex, double& cx, double& cy) const { const Element& e = mElems[elemIndex]; if (e.eType() == Element::ENP) { const Node* nodes = projectedNodes(); QPolygonF pX(e.nodeCount()); for (int i=0; i<e.nodeCount(); i++) { pX[i] = nodes[e.p(i)].toPointF(); } ENP_centroid(pX, cx, cy); } else if (e.eType() == Element::E4Q) { int e4qIndex = mE4QtmpIndex[elemIndex]; E4Qtmp& e4q = mE4Qtmp[e4qIndex]; E4Q_centroid(e4q, cx, cy, *mE4Qnorm); } else if (e.eType() == Element::E3T) { const Node* nodes = projectedNodes(); E3T_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), nodes[e.p(2)].toPointF(), cx, cy); } else if (e.eType() == Element::E2L) { const Node* nodes = projectedNodes(); E2L_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), cx, cy); } else Q_ASSERT(0 && "element not supported"); }
void QgsTriangularMesh::update( QgsMesh *nativeMesh, QgsRenderContext *context ) { Q_ASSERT( nativeMesh ); Q_ASSERT( context ); // FIND OUT IF UPDATE IS NEEDED if ( mTriangularMesh.vertices.size() >= nativeMesh->vertices.size() && mTriangularMesh.faces.size() >= nativeMesh->faces.size() && mCoordinateTransform.sourceCrs() == context->coordinateTransform().sourceCrs() && mCoordinateTransform.destinationCrs() == context->coordinateTransform().destinationCrs() ) return; // CLEAN-UP mTriangularMesh.vertices.clear(); mTriangularMesh.faces.clear(); mTrianglesToNativeFaces.clear(); mNativeMeshFaceCentroids.clear(); // TRANSFORM VERTICES mCoordinateTransform = context->coordinateTransform(); mTriangularMesh.vertices.resize( nativeMesh->vertices.size() ); for ( int i = 0; i < nativeMesh->vertices.size(); ++i ) { const QgsMeshVertex &vertex = nativeMesh->vertices.at( i ); if ( mCoordinateTransform.isValid() ) { try { QgsPointXY mapPoint = mCoordinateTransform.transform( QgsPointXY( vertex.x(), vertex.y() ) ); QgsMeshVertex mapVertex( mapPoint ); mapVertex.addZValue( vertex.z() ); mapVertex.setM( vertex.m() ); mTriangularMesh.vertices[i] = mapVertex; } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QStringLiteral( "Caught CRS exception %1" ).arg( cse.what() ) ); mTriangularMesh.vertices[i] = vertex; } } else { mTriangularMesh.vertices[i] = vertex; } } // CREATE TRIANGULAR MESH for ( int i = 0; i < nativeMesh->faces.size(); ++i ) { const QgsMeshFace &face = nativeMesh->faces.at( i ) ; triangulate( face, i ); } // CALCULATE CENTROIDS mNativeMeshFaceCentroids.resize( nativeMesh->faces.size() ); for ( int i = 0; i < nativeMesh->faces.size(); ++i ) { const QgsMeshFace &face = nativeMesh->faces.at( i ) ; QVector<QPointF> points; points.reserve( face.size() ); for ( int j = 0; j < face.size(); ++j ) { int index = face.at( j ); const QgsMeshVertex &vertex = mTriangularMesh.vertices[index]; // we need projected vertices points.push_back( vertex.toQPointF() ); } QPolygonF poly( points ); double cx, cy; ENP_centroid( poly, cx, cy ); mNativeMeshFaceCentroids[i] = QgsMeshVertex( cx, cy ); } // CALCULATE SPATIAL INDEX mSpatialIndex = QgsMeshSpatialIndex( mTriangularMesh ); }