Skip to content

Commit

Permalink
Handle curved geometries (line/polygon 3d symbol) and repeated vertices
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Sep 15, 2017
1 parent b234fc5 commit 81c591c
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 12 deletions.
8 changes: 7 additions & 1 deletion src/3d/lineentity.cpp
Expand Up @@ -93,7 +93,13 @@ Qt3DRender::QGeometryRenderer *LineEntityNode::renderer( const Map3D &map, const
if ( f.geometry().isNull() )
continue;

QgsAbstractGeometry *g = f.geometry().geometry();
QgsGeometry geom = f.geometry();

// segmentize curved geometries if necessary
if ( QgsWkbTypes::isCurvedType( geom.geometry()->wkbType() ) )
geom = QgsGeometry( geom.geometry()->segmentize() );

QgsAbstractGeometry *g = geom.geometry();

QgsGeos engine( g );
QgsAbstractGeometry *buffered = engine.buffer( symbol.width / 2., nSegments, endCapStyle, joinStyle, mitreLimit ); // factory
Expand Down
8 changes: 7 additions & 1 deletion src/3d/polygonentity.cpp
Expand Up @@ -96,7 +96,13 @@ Qt3DRender::QGeometryRenderer *PolygonEntityNode::renderer( const Map3D &map, co
if ( f.geometry().isNull() )
continue;

QgsAbstractGeometry *g = f.geometry().geometry();
QgsGeometry geom = f.geometry();

// segmentize curved geometries if necessary
if ( QgsWkbTypes::isCurvedType( geom.geometry()->wkbType() ) )
geom = QgsGeometry( geom.geometry()->segmentize() );

QgsAbstractGeometry *g = geom.geometry();

if ( QgsWkbTypes::flatType( g->wkbType() ) == QgsWkbTypes::Polygon )
{
Expand Down
28 changes: 18 additions & 10 deletions src/3d/tessellator.cpp
Expand Up @@ -105,15 +105,19 @@ void Tessellator::addPolygon( const QgsPolygonV2 &polygon, float extrusionHeight
polyline.reserve( exterior->numPoints() );

QgsVertexId::VertexType vt;
QgsPoint pt;
QgsPoint pt, ptPrev;

for ( int i = 0; i < exterior->numPoints() - 1; ++i )
{
exterior->pointAt( i, pt, vt );
p2t::Point *pt2 = new p2t::Point( pt.x() - originX, pt.y() - originY );
polyline.push_back( pt2 );
float zPt = qIsNaN( pt.z() ) ? 0 : pt.z();
z[pt2] = zPt;
if ( i == 0 || pt != ptPrev )
{
p2t::Point *pt2 = new p2t::Point( pt.x() - originX, pt.y() - originY );
polyline.push_back( pt2 );
float zPt = qIsNaN( pt.z() ) ? 0 : pt.z();
z[pt2] = zPt;
}
ptPrev = pt;
}
polylinesToDelete << polyline;

Expand All @@ -128,16 +132,20 @@ void Tessellator::addPolygon( const QgsPolygonV2 &polygon, float extrusionHeight
for ( int j = 0; j < hole->numPoints() - 1; ++j )
{
hole->pointAt( j, pt, vt );
p2t::Point *pt2 = new p2t::Point( pt.x() - originX, pt.y() - originY );
holePolyline.push_back( pt2 );
float zPt = qIsNaN( pt.z() ) ? 0 : pt.z();
z[pt2] = zPt;
if ( j == 0 || pt != ptPrev )
{
p2t::Point *pt2 = new p2t::Point( pt.x() - originX, pt.y() - originY );
holePolyline.push_back( pt2 );
float zPt = qIsNaN( pt.z() ) ? 0 : pt.z();
z[pt2] = zPt;
}
ptPrev = pt;
}
cdt->AddHole( holePolyline );
polylinesToDelete << holePolyline;
}

// TODO: robustness (no duplicate / nearly duplicate points, ...)
// TODO: robustness (no nearly duplicate points, invalid geometries ...)

cdt->Triangulate();

Expand Down

0 comments on commit 81c591c

Please sign in to comment.