QGIS API Documentation  2.6.0-Brighton
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgspoint.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgspoint.h - 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 #ifndef QGSPOINT_H
19 #define QGSPOINT_H
20 
21 #include <qgis.h>
22 
23 #include <iostream>
24 #include <QString>
25 #include <QPoint>
26 
32 class CORE_EXPORT QgsVector
33 {
34  double m_x, m_y;
35 
36  public:
37  QgsVector();
38  QgsVector( double x, double y );
39 
40  QgsVector operator-( void ) const;
41  QgsVector operator*( double scalar ) const;
42  QgsVector operator/( double scalar ) const;
43  double operator*( QgsVector v ) const;
44  double length() const;
45 
46  double x() const;
47  double y() const;
48 
49  // perpendicular vector (rotated 90� counter-clockwise)
50  QgsVector perpVector() const;
51 
52  double angle( void ) const;
53  double angle( QgsVector v ) const;
54  QgsVector rotateBy( double rot ) const;
55  QgsVector normal() const;
56 
57 };
58 
63 class CORE_EXPORT QgsPoint
64 {
65  public:
67  QgsPoint() : m_x( 0.0 ), m_y( 0.0 )
68  {}
69 
71  QgsPoint( const QgsPoint& p );
72 
77  QgsPoint( double x, double y )
78  : m_x( x ), m_y( y )
79  {}
80 
82  {}
83 
87  void setX( double x )
88  {
89  m_x = x;
90  }
91 
95  void setY( double y )
96  {
97  m_y = y;
98  }
99 
101  void set( double x, double y )
102  {
103  m_x = x;
104  m_y = y;
105  }
106 
110  double x() const
111  {
112  return m_x;
113  }
114 
118  double y() const
119  {
120  return m_y;
121  }
122 
124  QString toString() const;
125 
127  QString toString( int thePrecision ) const;
128 
138  QString toDegreesMinutesSeconds( int thePrecision, const bool useSuffix = true, const bool padded = false ) const;
139 
149  QString toDegreesMinutes( int thePrecision, const bool useSuffix = true, const bool padded = false ) const;
150 
151 
156  QString wellKnownText() const;
157 
159  double sqrDist( double x, double y ) const;
160 
162  double sqrDist( const QgsPoint& other ) const;
163 
165  double sqrDistToSegment( double x1, double y1, double x2, double y2, QgsPoint& minDistPoint, double epsilon = DEFAULT_SEGMENT_EPSILON ) const;
166 
168  double azimuth( const QgsPoint& other );
169 
171  bool operator==( const QgsPoint &other );
172 
174  bool operator!=( const QgsPoint &other ) const;
175 
177  void multiply( const double& scalar );
178 
183  int onSegment( const QgsPoint& a, const QgsPoint& b ) const;
184 
186  QgsPoint & operator=( const QgsPoint &other );
187 
188  QgsVector operator-( QgsPoint p ) const { return QgsVector( m_x - p.m_x, m_y - p.m_y ); }
189  QgsPoint &operator+=( const QgsVector &v ) { *this = *this + v; return *this; }
190  QgsPoint &operator-=( const QgsVector &v ) { *this = *this - v; return *this; }
191  QgsPoint operator+( const QgsVector &v ) const { return QgsPoint( m_x + v.x(), m_y + v.y() ); }
192  QgsPoint operator-( const QgsVector &v ) const { return QgsPoint( m_x - v.x(), m_y - v.y() ); }
193 
194  private:
195 
197  double m_x;
198 
200  double m_y;
201 
202  friend uint qHash( const QgsPoint& pnt );
203 
204 }; // class QgsPoint
205 
206 
207 inline bool operator==( const QgsPoint &p1, const QgsPoint &p2 )
208 {
209  if (( p1.x() == p2.x() ) && ( p1.y() == p2.y() ) )
210  { return true; }
211  else
212  { return false; }
213 }
214 
215 inline std::ostream& operator << ( std::ostream& os, const QgsPoint &p )
216 {
217  // Use Local8Bit for printouts
218  os << p.toString().toLocal8Bit().data();
219  return os;
220 }
221 
222 inline uint qHash( const QgsPoint& p )
223 {
224  uint hash;
225  uint h1 = qHash(( quint64 )p.m_x );
226  uint h2 = qHash(( quint64 )p.m_y );
227  hash = h1 ^( h2 << 1 );
228  return hash;
229 }
230 
231 #endif //QGSPOINT_H