Draw direction indicator triangle only when GPS location item is not visible
[situare] / src / coordinates / scenecoordinate.h
1 /*
2     Situare - A location system for Facebook
3     Copyright (C) 2010  Ixonos Plc. Authors:
4
5         Sami Rämö - sami.ramo@ixonos.com
6
7     Situare is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License
9     version 2 as published by the Free Software Foundation.
10
11     Situare is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with Situare; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
19     USA.
20 */
21
22
23 #ifndef SCENECOORDINATE_H
24 #define SCENECOORDINATE_H
25
26 #include <QDebug>
27 #include <QMetaType>
28
29 class GeoCoordinate;
30
31 /**
32 * @brief Scene coordinate
33 *
34 * @author Sami Rämö - sami.ramo@ixonos.com
35 */
36 class SceneCoordinate
37 {
38 public:
39     /**
40     * @brief Constructs a null coordinate
41     */
42     SceneCoordinate();
43
44     /**
45     * @brief Constructs a coordinate with given x and y
46     *
47     * @param x X value
48     * @param y Y value
49     */
50     SceneCoordinate(double x, double y);
51
52     /**
53     * @brief Constructs a coordinate with values converted from the given GeoCoordinate
54     *
55     * Uses convertFrom() method.
56     *
57     * @param coordinate Geological coordinate
58     */
59     SceneCoordinate(const GeoCoordinate &coordinate);
60
61 /*******************************************************************************
62  * MEMBER FUNCTIONS AND SLOTS
63  ******************************************************************************/
64 public:
65     /**
66     * @brief Returns the azimuth from this coordinate to other coordinate
67     *
68     * @param to Target coordinate
69     * @returns Azimuth in degrees
70     */
71     qreal azimuthTo(const SceneCoordinate &to) const;
72
73     /**
74     * @brief Check if coordinate is (0.0, 0.0)
75     *
76     * @returns True if both X and Y are 0.0, otherwise false
77     */
78     bool isNull() const;
79
80     /**
81     * @brief Sets the latitude
82     *
83     * @param x X value
84     */
85     void setX(double x);
86
87     /**
88     * @brief Sets the longitude
89     *
90     * @param y Y value
91     */
92     void setY(double y);
93
94     /**
95     * @brief Convert to QPointF
96     *
97     * @returns a QPointF object
98     */
99     QPointF toPointF() const;
100
101     /**
102     * @brief Returns the x value
103     *
104     * @returns x
105     */
106     double x() const;
107
108     /**
109     * @brief Returns the y value
110     *
111     * @returns y
112     */
113     double y() const;
114
115 private:
116     /**
117      * @brief Convert values from GeoCoordinate
118      *
119      * Does run normalize() for the x value after the conversion to make sure that the result
120      * is inside the allowed map pixel values.
121      *
122      * In horizontal direction:
123      *    -180º equals scene pixel 0 (first scene pixel)
124      *    +180º equals -180º
125      *
126      *    scene has 2^18 * 256 - 1 = 67108864 pixels per side
127      *    one pixel width is 360º / 67108864 = 0.00000536441802978516º
128      *    so the last scene pixel is 180º - 0.00000536441802978516º = 179.99999463558197021484º
129      *
130      * @param coordinate Geological coordinate
131      */
132     void convertFrom(const GeoCoordinate &coordinate);
133
134     /**
135      * @brief Translate integer part of the given value between min and max
136      *
137      * If given value is not inside the given range (min <= value <= max), then the allowed range
138      * is adder or subtracted until the value does fit in the range. Only integer part is compared.
139      *
140      * @param value Value to be normalized
141      * @param min Minimum allowed value
142      * @param max Maximum allowed value
143      */
144     void normalize(double &value, int min, int max);
145
146 /*******************************************************************************
147  * DATA MEMBERS
148  ******************************************************************************/
149 private:
150     double m_x;         ///< X value
151     double m_y;         ///< Y value
152
153 /*******************************************************************************
154  * OPERATORS
155  ******************************************************************************/
156 public:
157     /**
158     * @brief Operator for creating QVariant
159     */
160     operator QVariant() const;
161
162     /**
163     * @brief Multiplies this coordinate's values by the given factor, and returns a reference
164     *        to this coordinate.
165     */
166     SceneCoordinate & operator*=(double factor);
167
168     /**
169     * @brief Adds the given coordinate to this coordinate and returns a reference to this
170              coordinate
171     */
172     SceneCoordinate & operator+=(const SceneCoordinate &coordinate);
173
174     /**
175     * @brief Subtracts the given coordinate from this coordinate and returns a reference to this
176              coordinate.
177     */
178     SceneCoordinate & operator-=(const SceneCoordinate &coordinate);
179
180     /**
181     * @brief Returns a SceneCoordinate object that is the sum of the coordinates.
182     */
183     const SceneCoordinate operator+(const SceneCoordinate &other) const;
184
185     /**
186     * @brief Returns a SceneCoordinate object that is formed by subtracting the coordinates.
187     */
188     const SceneCoordinate operator-(const SceneCoordinate &other) const;
189 };
190
191 /**
192 * @brief Operator for writing the coordinate to QDebug stream.
193 */
194 QDebug operator<<(QDebug dbg, const SceneCoordinate &coordinate);
195
196 /**
197 * @brief Returns a SceneCoordinate object that is multiplied by the given factor.
198 */
199 const SceneCoordinate operator*(double factor, const SceneCoordinate &coordinate);
200
201 Q_DECLARE_METATYPE(SceneCoordinate)
202
203 #endif // SCENECOORDINATE_H