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");
}
Exemplo n.º 2
0
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 );
}