LCOV - code coverage report
Current view: top level - core - qgspointxy.cpp (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 18 68 26.5 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                           qgspoint.cpp -  description
       3                 :            :                              -------------------
       4                 :            :     begin                : Sat Jun 22 2002
       5                 :            :     copyright            : (C) 2002 by Gary E.Sherman
       6                 :            :     email                : sherman at mrcc.com
       7                 :            :  ***************************************************************************/
       8                 :            : 
       9                 :            : /***************************************************************************
      10                 :            :  *                                                                         *
      11                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      12                 :            :  *   it under the terms of the GNU General Public License as published by  *
      13                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      14                 :            :  *   (at your option) any later version.                                   *
      15                 :            :  *                                                                         *
      16                 :            :  ***************************************************************************/
      17                 :            : 
      18                 :            : 
      19                 :            : #include "qgspointxy.h"
      20                 :            : #include "qgspoint.h"
      21                 :            : 
      22                 :            : #include <cmath>
      23                 :            : #include <QTextStream>
      24                 :            : #include <QObject> // for tr()
      25                 :            : 
      26                 :            : #include "qgsexception.h"
      27                 :            : 
      28                 :      31635 : QgsPointXY::QgsPointXY( const QgsPointXY &p )
      29                 :      31635 :   : mX( p.x() )
      30                 :      31635 :   , mY( p.y() )
      31                 :      31635 :   , mIsEmpty( p.isEmpty() )
      32                 :            : {
      33                 :      31635 : }
      34                 :            : 
      35                 :        182 : QgsPointXY::QgsPointXY( const QgsPoint &point )
      36                 :            : {
      37                 :        182 :   if ( point.isEmpty() )
      38                 :            :   {
      39                 :          5 :     mX = 0.0;
      40                 :          5 :     mY = 0.0;
      41                 :          5 :     mIsEmpty = true;
      42                 :          5 :   }
      43                 :            :   else
      44                 :            :   {
      45                 :        177 :     mX = point.x();
      46                 :        177 :     mY = point.y();
      47                 :        177 :     mIsEmpty = false;
      48                 :            :   }
      49                 :        182 : }
      50                 :            : 
      51                 :          0 : QString QgsPointXY::toString( int precision ) const
      52                 :            : {
      53                 :          0 :   if ( precision < 0 )
      54                 :            :   {
      55                 :          0 :     QString rep;
      56                 :          0 :     QTextStream ot( &rep );
      57                 :          0 :     ot.setRealNumberPrecision( 12 );
      58                 :          0 :     ot << mX << ", " << mY;
      59                 :          0 :     return rep;
      60                 :          0 :   }
      61                 :            :   else
      62                 :            :   {
      63                 :          0 :     QString x = std::isfinite( mX ) ? QString::number( mX, 'f', precision ) : QObject::tr( "infinite" );
      64                 :          0 :     QString y = std::isfinite( mY ) ? QString::number( mY, 'f', precision ) : QObject::tr( "infinite" );
      65                 :          0 :     return QStringLiteral( "%1,%2" ).arg( x, y );
      66                 :          0 :   }
      67                 :          0 : }
      68                 :            : 
      69                 :          0 : QString QgsPointXY::asWkt() const
      70                 :            : {
      71                 :          0 :   QString wkt = QStringLiteral( "POINT" );
      72                 :          0 :   if ( isEmpty() )
      73                 :          0 :     wkt += QLatin1String( " EMPTY" );
      74                 :            :   else
      75                 :          0 :     wkt += QStringLiteral( "(%1 %2)" ).arg( qgsDoubleToString( mX ), qgsDoubleToString( mY ) );
      76                 :            : 
      77                 :          0 :   return wkt;
      78                 :          0 : }
      79                 :            : 
      80                 :          0 : double QgsPointXY::azimuth( const QgsPointXY &other ) const
      81                 :            : {
      82                 :          0 :   double dx = other.x() - mX;
      83                 :          0 :   double dy = other.y() - mY;
      84                 :          0 :   return ( std::atan2( dx, dy ) * 180.0 / M_PI );
      85                 :            : }
      86                 :            : 
      87                 :          0 : QgsPointXY QgsPointXY::project( double distance, double bearing ) const
      88                 :            : {
      89                 :          0 :   double rads = bearing * M_PI / 180.0;
      90                 :          0 :   double dx = distance * std::sin( rads );
      91                 :          0 :   double dy = distance * std::cos( rads );
      92                 :          0 :   return QgsPointXY( mX + dx, mY + dy );
      93                 :            : }
      94                 :            : 
      95                 :          0 : double QgsPointXY::sqrDistToSegment( double x1, double y1, double x2, double y2, QgsPointXY &minDistPoint, double epsilon ) const
      96                 :            : {
      97                 :            :   double nx, ny; //normal vector
      98                 :            : 
      99                 :          0 :   nx = y2 - y1;
     100                 :          0 :   ny = -( x2 - x1 );
     101                 :            : 
     102                 :            :   double t;
     103                 :          0 :   t = ( mX * ny - mY * nx - x1 * ny + y1 * nx ) / ( ( x2 - x1 ) * ny - ( y2 - y1 ) * nx );
     104                 :            : 
     105                 :          0 :   if ( t < 0.0 )
     106                 :            :   {
     107                 :          0 :     minDistPoint.setX( x1 );
     108                 :          0 :     minDistPoint.setY( y1 );
     109                 :          0 :   }
     110                 :          0 :   else if ( t > 1.0 )
     111                 :            :   {
     112                 :          0 :     minDistPoint.setX( x2 );
     113                 :          0 :     minDistPoint.setY( y2 );
     114                 :          0 :   }
     115                 :            :   else
     116                 :            :   {
     117                 :          0 :     minDistPoint.setX( x1 + t * ( x2 - x1 ) );
     118                 :          0 :     minDistPoint.setY( y1 + t * ( y2 - y1 ) );
     119                 :            :   }
     120                 :            : 
     121                 :          0 :   double dist = sqrDist( minDistPoint );
     122                 :            :   //prevent rounding errors if the point is directly on the segment
     123                 :          0 :   if ( qgsDoubleNear( dist, 0.0, epsilon ) )
     124                 :            :   {
     125                 :          0 :     minDistPoint.setX( mX );
     126                 :          0 :     minDistPoint.setY( mY );
     127                 :          0 :     return 0.0;
     128                 :            :   }
     129                 :          0 :   return dist;
     130                 :          0 : }

Generated by: LCOV version 1.14