QgsAbstractGeometry *orthogonalizeGeom( const QgsAbstractGeometry *geom, int maxIterations, double tolerance, double lowerThreshold, double upperThreshold ) { std::unique_ptr< QgsAbstractGeometry > segmentizedCopy; if ( QgsWkbTypes::isCurvedType( geom->wkbType() ) ) { segmentizedCopy.reset( geom->segmentize() ); geom = segmentizedCopy.get(); } if ( QgsWkbTypes::geometryType( geom->wkbType() ) == QgsWkbTypes::LineGeometry ) { return doOrthogonalize( static_cast< QgsLineString * >( geom->clone() ), maxIterations, tolerance, lowerThreshold, upperThreshold ); } else { // polygon const QgsPolygon *polygon = static_cast< const QgsPolygon * >( geom ); QgsPolygon *result = new QgsPolygon(); result->setExteriorRing( doOrthogonalize( static_cast< QgsLineString * >( polygon->exteriorRing()->clone() ), maxIterations, tolerance, lowerThreshold, upperThreshold ) ); for ( int i = 0; i < polygon->numInteriorRings(); ++i ) { result->addInteriorRing( doOrthogonalize( static_cast< QgsLineString * >( polygon->interiorRing( i )->clone() ), maxIterations, tolerance, lowerThreshold, upperThreshold ) ); } return result; } }
QgsAbstractGeometry *densifyGeometry( const QgsAbstractGeometry *geom, int extraNodesPerSegment = 1, double distance = 1 ) { std::unique_ptr< QgsAbstractGeometry > segmentizedCopy; if ( QgsWkbTypes::isCurvedType( geom->wkbType() ) ) { segmentizedCopy.reset( geom->segmentize() ); geom = segmentizedCopy.get(); } if ( QgsWkbTypes::geometryType( geom->wkbType() ) == QgsWkbTypes::LineGeometry ) { return doDensify( static_cast< const QgsLineString * >( geom ), extraNodesPerSegment, distance ); } else { // polygon const QgsPolygon *polygon = static_cast< const QgsPolygon * >( geom ); QgsPolygon *result = new QgsPolygon(); result->setExteriorRing( doDensify( static_cast< const QgsLineString * >( polygon->exteriorRing() ), extraNodesPerSegment, distance ) ); for ( int i = 0; i < polygon->numInteriorRings(); ++i ) { result->addInteriorRing( doDensify( static_cast< const QgsLineString * >( polygon->interiorRing( i ) ), extraNodesPerSegment, distance ) ); } return result; } }
static QgsPolygon *_transform_polygon_to_new_base( const QgsPolygon &polygon, const QgsPoint &pt0, const QMatrix4x4 *toNewBase ) { QgsPolygon *p = new QgsPolygon; p->setExteriorRing( _transform_ring_to_new_base( *polygon.exteriorRing(), pt0, toNewBase ) ); for ( int i = 0; i < polygon.numInteriorRings(); ++i ) p->addInteriorRing( _transform_ring_to_new_base( *polygon.interiorRing( i ), pt0, toNewBase ) ); return p; }