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 : }