Re-factored the source to use the new coordinate classes
[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 Check if coordinate is (0.0, 0.0)
67     *
68     * @returns True if both X and Y are 0.0, otherwise false
69     */
70     bool isNull() const;
71
72     /**
73     * @brief Sets the latitude
74     *
75     * @param x X value
76     */
77     void setX(double x);
78
79     /**
80     * @brief Sets the longitude
81     *
82     * @param y Y value
83     */
84     void setY(double y);
85
86     QPointF toPointF() const;
87
88     /**
89     * @brief Returns the x value
90     *
91     * @returns x
92     */
93     double x() const;
94
95     /**
96     * @brief Returns the y value
97     *
98     * @returns y
99     */
100     double y() const;
101
102 private:
103     /**
104      * @brief Convert values from GeoCoordinate
105      *
106      * Does run normalize() for the x value after the conversion to make sure that the result
107      * is inside the allowed map pixel values.
108      *
109      * In horizontal direction:
110      *    -180º equals scene pixel 0 (first scene pixel)
111      *    +180º equals -180º
112      *
113      *    scene has 2^18 * 256 - 1 = 67108864 pixels per side
114      *    one pixel width is 360º / 67108864 = 0.00000536441802978516º
115      *    so the last scene pixel is 180º - 0.00000536441802978516º = 179.99999463558197021484º     *
116      *
117      * @param coordinate Geological coordinate
118      */
119     void convertFrom(const GeoCoordinate &coordinate);
120
121     /**
122      * @brief Translate integer part of the given value between min and max
123      *
124      * If given value is not inside the given range (min <= value <= max), then the allowed range
125      * is adder or subtracted until the value does fit in the range. Only integer part is compared.
126      *
127      * @param value Value to be normalized
128      * @param min Minimum allowed value
129      * @param max Maximum allowed value
130      */
131     void normalize(double &value, int min, int max);
132
133 /*******************************************************************************
134  * DATA MEMBERS
135  ******************************************************************************/
136 private:
137     double m_x;         ///< X value
138     double m_y;         ///< Y value
139 };
140
141 QDebug operator<<(QDebug dbg, const SceneCoordinate &c);
142
143 Q_DECLARE_METATYPE(SceneCoordinate)
144
145 #endif // SCENECOORDINATE_H