QgsPointV2 QgsLineStringV2::startPoint() const { if ( numPoints() < 1 ) { return QgsPointV2(); } return pointN( 0 ); }
QgsPointV2 QgsLineString::endPoint() const { if ( numPoints() < 1 ) { return QgsPointV2(); } return pointN( numPoints() - 1 ); }
QgsPointV2 QgsCircularStringV2::endPoint() const { if ( numPoints() < 1 ) { return QgsPointV2(); } return pointN( numPoints() - 1 ); }
QgsPointV2 QgsCircularString::startPoint() const { if ( numPoints() < 1 ) { return QgsPointV2(); } return pointN( 0 ); }
void QgsLineStringV2::points( QList<QgsPointV2>& pts ) const { pts.clear(); int nPoints = numPoints(); for ( int i = 0; i < nPoints; ++i ) { pts.push_back( pointN( i ) ); } }
void QgsCircularString::points( QgsPointSequence &pts ) const { pts.clear(); int nPts = numPoints(); for ( int i = 0; i < nPts; ++i ) { pts.push_back( pointN( i ) ); } }
bool QgsLineStringV2::pointAt( int node, QgsPointV2& point, QgsVertexId::VertexType& type ) const { if ( node < 0 || node >= numPoints() ) { return false; } point = pointN( node ); type = QgsVertexId::SegmentVertex; return true; }
bool QgsCircularString::pointAt( int node, QgsPointV2 &point, QgsVertexId::VertexType &type ) const { if ( node >= numPoints() ) { return false; } point = pointN( node ); type = ( node % 2 == 0 ) ? QgsVertexId::SegmentVertex : QgsVertexId::CurveVertex; return true; }
bool QgsLineStringV2::pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const { if ( i >= numPoints() ) { return false; } vertex = pointN( i ); type = QgsVertexId::SegmentVertex; return true; }
double QgsLineStringV2::closestSegment( const QgsPointV2& pt, QgsPointV2& segmentPt, QgsVertexId& vertexAfter, bool* leftOf, double epsilon ) const { double sqrDist = std::numeric_limits<double>::max(); double testDist = 0; double segmentPtX, segmentPtY; int size = mX.size(); if ( size == 0 ) { vertexAfter = QgsVertexId( 0, 0, 0 ); return sqrDist; } else if ( size == 1 ) { segmentPt = pointN( 0 ); vertexAfter = QgsVertexId( 0, 0, 1 ); return QgsGeometryUtils::sqrDistance2D( pt, segmentPt ); } for ( int i = 1; i < size; ++i ) { double prevX = mX.at( i - 1 ); double prevY = mY.at( i - 1 ); double currentX = mX.at( i ); double currentY = mY.at( i ); testDist = QgsGeometryUtils::sqrDistToLine( pt.x(), pt.y(), prevX, prevY, currentX, currentY, segmentPtX, segmentPtY, epsilon ); if ( testDist < sqrDist ) { sqrDist = testDist; segmentPt.setX( segmentPtX ); segmentPt.setY( segmentPtY ); if ( leftOf ) { *leftOf = ( QgsGeometryUtils::leftOfLine( pt.x(), pt.y(), prevX, prevY, currentX, currentY ) < 0 ); } vertexAfter.part = 0; vertexAfter.ring = 0; vertexAfter.vertex = i; } } return sqrDist; }