void QgsCircularStringV2::setPoints( const QgsPointSequenceV2 &points ) { clearCache(); if ( points.size() < 1 ) { mWkbType = QgsWKBTypes::Unknown; mX.clear(); mY.clear(); mZ.clear(); mM.clear(); return; } //get wkb type from first point const QgsPointV2& firstPt = points.at( 0 ); bool hasZ = firstPt.is3D(); bool hasM = firstPt.isMeasure(); setZMTypeFromSubGeometry( &firstPt, QgsWKBTypes::CircularString ); mX.resize( points.size() ); mY.resize( points.size() ); if ( hasZ ) { mZ.resize( points.size() ); } else { mZ.clear(); } if ( hasM ) { mM.resize( points.size() ); } else { mM.clear(); } for ( int i = 0; i < points.size(); ++i ) { mX[i] = points[i].x(); mY[i] = points[i].y(); if ( hasZ ) { mZ[i] = points[i].z(); } if ( hasM ) { mM[i] = points[i].m(); } } }
void QgsCircularStringV2::addToPainterPath( QPainterPath& path ) const { int nPoints = numPoints(); if ( nPoints < 1 ) { return; } if ( path.isEmpty() || path.currentPosition() != QPointF( mX[0], mY[0] ) ) { path.moveTo( QPointF( mX[0], mY[0] ) ); } for ( int i = 0; i < ( nPoints - 2 ) ; i += 2 ) { QgsPointSequenceV2 pt; segmentize( QgsPointV2( mX[i], mY[i] ), QgsPointV2( mX[i + 1], mY[i + 1] ), QgsPointV2( mX[i + 2], mY[i + 2] ), pt ); for ( int j = 1; j < pt.size(); ++j ) { path.lineTo( pt.at( j ).x(), pt.at( j ).y() ); } //arcTo( path, QPointF( mX[i], mY[i] ), QPointF( mX[i + 1], mY[i + 1] ), QPointF( mX[i + 2], mY[i + 2] ) ); } //if number of points is even, connect to last point with straight line (even though the circular string is not valid) if ( nPoints % 2 == 0 ) { path.lineTo( mX[ nPoints - 1 ], mY[ nPoints - 1 ] ); } }