Example #1
0
QgsPointV2 QgsLineStringV2::startPoint() const
{
  if ( numPoints() < 1 )
  {
    return QgsPointV2();
  }
  return pointN( 0 );
}
Example #2
0
QgsPointV2 QgsLineString::endPoint() const
{
  if ( numPoints() < 1 )
  {
    return QgsPointV2();
  }
  return pointN( numPoints() - 1 );
}
Example #3
0
QgsPointV2 QgsCircularStringV2::endPoint() const
{
  if ( numPoints() < 1 )
  {
    return QgsPointV2();
  }
  return pointN( numPoints() - 1 );
}
Example #4
0
QgsPointV2 QgsCircularString::startPoint() const
{
  if ( numPoints() < 1 )
  {
    return QgsPointV2();
  }
  return pointN( 0 );
}
Example #5
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 ) );
  }
}
Example #6
0
void QgsCircularString::points( QgsPointSequence &pts ) const
{
  pts.clear();
  int nPts = numPoints();
  for ( int i = 0; i < nPts; ++i )
  {
    pts.push_back( pointN( i ) );
  }
}
Example #7
0
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;
}
Example #8
0
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;
}
Example #9
0
bool QgsLineStringV2::pointAt( int i, QgsPointV2& vertex, QgsVertexId::VertexType& type ) const
{
  if ( i >= numPoints() )
  {
    return false;
  }
  vertex = pointN( i );
  type = QgsVertexId::SegmentVertex;
  return true;
}
Example #10
0
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;
}