QgsGeometry QgsInternalGeometryEngine::densifyByDistance( double distance ) const { if ( !mGeometry ) { return QgsGeometry(); } if ( QgsWkbTypes::geometryType( mGeometry->wkbType() ) == QgsWkbTypes::PointGeometry ) { return QgsGeometry( mGeometry->clone() ); // point geometry, nothing to do } if ( const QgsGeometryCollection *gc = qgsgeometry_cast< const QgsGeometryCollection *>( mGeometry ) ) { int numGeom = gc->numGeometries(); QVector< QgsAbstractGeometry * > geometryList; geometryList.reserve( numGeom ); for ( int i = 0; i < numGeom; ++i ) { geometryList << densifyGeometry( gc->geometryN( i ), -1, distance ); } QgsGeometry first = QgsGeometry( geometryList.takeAt( 0 ) ); for ( QgsAbstractGeometry *g : qgis::as_const( geometryList ) ) { first.addPart( g ); } return first; } else { return QgsGeometry( densifyGeometry( mGeometry, -1, distance ) ); } }
QgsGeometry QgsInternalGeometryEngine::orthogonalize( double tolerance, int maxIterations, double angleThreshold ) const { if ( !mGeometry || ( QgsWkbTypes::geometryType( mGeometry->wkbType() ) != QgsWkbTypes::LineGeometry && QgsWkbTypes::geometryType( mGeometry->wkbType() ) != QgsWkbTypes::PolygonGeometry ) ) { return QgsGeometry(); } double lowerThreshold = std::cos( ( 90 - angleThreshold ) * M_PI / 180.00 ); double upperThreshold = std::cos( angleThreshold * M_PI / 180.0 ); if ( const QgsGeometryCollection *gc = qgsgeometry_cast< const QgsGeometryCollection *>( mGeometry ) ) { int numGeom = gc->numGeometries(); QVector< QgsAbstractGeometry * > geometryList; geometryList.reserve( numGeom ); for ( int i = 0; i < numGeom; ++i ) { geometryList << orthogonalizeGeom( gc->geometryN( i ), maxIterations, tolerance, lowerThreshold, upperThreshold ); } QgsGeometry first = QgsGeometry( geometryList.takeAt( 0 ) ); for ( QgsAbstractGeometry *g : qgis::as_const( geometryList ) ) { first.addPart( g ); } return first; } else { return QgsGeometry( orthogonalizeGeom( mGeometry, maxIterations, tolerance, lowerThreshold, upperThreshold ) ); } }