1 /*!
2 * \file lib/raster/window.c
3 *
4 * \brief Raster Library - Window functions.
5 *
6 * (C) 2001-2009 by the GRASS Development Team
7 *
8 * This program is free software under the GNU General Public License
9 * (>=v2). Read the file COPYING that comes with GRASS for details.
10 *
11 * \author Original author CERL
12 */
13
14 #include <grass/gis.h>
15 #include <grass/raster.h>
16 #include <grass/glocale.h>
17
18 #include "R.h"
19
20 /*!
21 * \brief Read the current window
22 *
23 * \param window pointer to Cell_head
24 */
25
Rast_get_window(struct Cell_head * window)26 void Rast_get_window(struct Cell_head *window)
27 {
28 Rast__init_window();
29
30 if (R__.split_window)
31 G_fatal_error(_("Internal error: Rast_get_window() called with split window."
32 " Use Rast_get_input_window() or Rast_get_output_window() instead."));
33
34 *window = R__.wr_window;
35 }
36
37 /*!
38 * \brief Read the current input window
39 *
40 * \param window pointer to Cell_head
41 */
42
Rast_get_input_window(struct Cell_head * window)43 void Rast_get_input_window(struct Cell_head *window)
44 {
45 Rast__init_window();
46
47 *window = R__.rd_window;
48 }
49
50 /*!
51 * \brief Read the current output window
52 *
53 * \param window pointer to Cell_head
54 */
55
Rast_get_output_window(struct Cell_head * window)56 void Rast_get_output_window(struct Cell_head *window)
57 {
58 Rast__init_window();
59
60 *window = R__.wr_window;
61 }
62
63 /*!
64 * \brief Number of rows in active window.
65 *
66 * This routine returns the number of rows in the active module window.
67 * Before raster files can be read or written, it is necessary to
68 * known how many rows are in the active window. For example:
69 \code
70 int nrows, cols;
71 int row, col;
72
73 nrows = Rast_window_rows();
74 ncols = Rast_window_cols();
75 for (row = 0; row < nrows; row++) {
76 // read row ...
77 for (col = 0; col < ncols; col++) {
78 // process col ...
79 }
80 }
81 \endcode
82 *
83 * \return number of rows
84 */
Rast_window_rows(void)85 int Rast_window_rows(void)
86 {
87 Rast__init_window();
88
89 if (R__.split_window)
90 G_fatal_error(_("Internal error: Rast_window_rows() called with split window."
91 " Use Rast_input_window_rows() or Rast_output_window_rows() instead."));
92
93 return R__.wr_window.rows;
94 }
95
96 /*!
97 * \brief Number of columns in active window.
98 *
99 * These routines return the number of rows and columns (respectively)
100 * in the active module region. Before raster maps can be read or
101 * written, it is necessary to known how many rows and columns are in
102 * the active region. For example:
103 *
104 \code
105 int nrows, cols;
106 int row, col;
107
108 nrows = Rast_window_rows();
109 ncols = Rast_window_cols();
110 for (row = 0; row < nrows; row++) {
111 // read row ...
112 for (col = 0; col < ncols; col++) {
113 // process col ...
114 }
115 }
116 \endcode
117 *
118 * \return number of columns
119 */
Rast_window_cols(void)120 int Rast_window_cols(void)
121 {
122 Rast__init_window();
123
124 if (R__.split_window)
125 G_fatal_error(_("Internal error: Rast_window_cols() called with split window."
126 " Use Rast_input_window_cols() or Rast_output_window_cols() instead."));
127
128 return R__.wr_window.cols;
129 }
130
131 /*!
132 * \brief Number of rows in active input window.
133 *
134 * This routine returns the number of rows in the active input window.
135 *
136 * \return number of rows
137 */
Rast_input_window_rows(void)138 int Rast_input_window_rows(void)
139 {
140 Rast__init_window();
141
142 return R__.rd_window.rows;
143 }
144
145 /*!
146 * \brief Number of columns in active input window.
147 *
148 * This routine returns the number of columns in the active input window.
149 *
150 * \return number of columns
151 */
Rast_input_window_cols(void)152 int Rast_input_window_cols(void)
153 {
154 Rast__init_window();
155
156 return R__.rd_window.cols;
157 }
158
159 /*!
160 * \brief Number of rows in active output window.
161 *
162 * This routine returns the number of rows in the active output window.
163 *
164 * \return number of rows
165 */
Rast_output_window_rows(void)166 int Rast_output_window_rows(void)
167 {
168 Rast__init_window();
169
170 return R__.wr_window.rows;
171 }
172
173 /*!
174 * \brief Number of columns in active output window.
175 *
176 * This routine returns the number of columns in the active output window.
177 *
178 * \return number of columns
179 */
Rast_output_window_cols(void)180 int Rast_output_window_cols(void)
181 {
182 Rast__init_window();
183
184 return R__.wr_window.cols;
185 }
186
187 /*!
188 * \brief Northing to row.
189 *
190 * Converts a <i>north</i>ing relative to a <i>window</i> to a row.
191
192 * <b>Note:</b> The result is a double. Casting it to an integer will
193 * give the row number.
194 *
195 * \param north northing value
196 * \param window pointer to Cell_head
197 *
198 * \return row number
199 */
200
Rast_northing_to_row(double north,const struct Cell_head * window)201 double Rast_northing_to_row(double north, const struct Cell_head *window)
202 {
203 return (window->north - north) / window->ns_res;
204 }
205
206
207 /*!
208 * \brief Easting to column.
209 *
210 * Converts <i>east</i> relative to a <i>window</i> to a column.
211
212 * <b>Note:</b> The result is a <i>double</i>. Casting it to an
213 * <i>int</i> will give the column number.
214 *
215 * \param east east coordinate
216 * \param window pointer to Cell_head
217 *
218 * \return column number
219 */
220
Rast_easting_to_col(double east,const struct Cell_head * window)221 double Rast_easting_to_col(double east, const struct Cell_head *window)
222 {
223 east = G_adjust_easting(east, window);
224
225 return (east - window->west) / window->ew_res;
226 }
227
228 /*!
229 * \brief Row to northing.
230 *
231 * Converts a <i>row</i> relative to a <i>window</i> to a
232 * northing.
233
234 * <b>Note:</b> row is a double:
235 * - row+0.0 will return the northing for the northern edge of the row.
236 * - row+0.5 will return the northing for the center of the row.
237 * - row+1.0 will return the northing for the southern edge of the row.
238 *
239 * \param row row number
240 * \param[in] window pointer to Cell_head
241 *
242 * \return north coordinate
243 */
Rast_row_to_northing(double row,const struct Cell_head * window)244 double Rast_row_to_northing(double row, const struct Cell_head *window)
245 {
246 return window->north - row * window->ns_res;
247 }
248
249 /*!
250 * \brief Column to easting.
251 *
252 * Converts a <i>col</i> relative to a <i>window</i> to an easting.
253 *
254 * <b>Note:</b> <i>col</i> is a <i>double</i>:
255 * - col+0.0 will return the easting for the western edge of the column.
256 * - col+0.5 will return the easting for the center of the column.
257 * - col+1.0 will return the easting for the eastern edge of the column.
258 *
259 * \param col column number
260 * \param[in] window pointer to Cell_head
261 *
262 * \return east coordinate
263 */
Rast_col_to_easting(double col,const struct Cell_head * window)264 double Rast_col_to_easting(double col, const struct Cell_head *window)
265 {
266 return window->west + col * window->ew_res;
267 }
268
269