Commit 94f5193c0e6cde30def2f29b57bd0634d0046f26
1 parent
e23ca974
implement dir2xy and xy2dir methods
Showing
2 changed files
with
83 additions
and
26 deletions
include/GWcsCAR.hpp
| ... | ... | @@ -20,6 +20,9 @@ |
| 20 | 20 | #define GWCSCAR_HPP |
| 21 | 21 | |
| 22 | 22 | /* __ Includes ___________________________________________________________ */ |
| 23 | +#ifdef HAVE_CONFIG_H | |
| 24 | +#include <config.h> | |
| 25 | +#endif | |
| 23 | 26 | #include "GWcs.hpp" |
| 24 | 27 | #include "GSkyDir.hpp" |
| 25 | 28 | #include "GSkyPixel.hpp" |
| ... | ... | @@ -66,10 +69,6 @@ private: |
| 66 | 69 | void free_members(void); |
| 67 | 70 | GWcsCAR* clone(void) const; |
| 68 | 71 | |
| 69 | - // Implemented pure virtual private methods | |
| 70 | - void wcsxy2sph(const double& x, const double& y, double* lon, double* lat) const; | |
| 71 | - void wcssph2xy(const double& lon, const double& lat, double* x, double* y) const; | |
| 72 | - | |
| 73 | 72 | // Private data area |
| 74 | 73 | }; |
| 75 | 74 | ... | ... |
src/sky/GWcsCAR.cpp
| ... | ... | @@ -18,7 +18,11 @@ |
| 18 | 18 | */ |
| 19 | 19 | |
| 20 | 20 | /* __ Includes ___________________________________________________________ */ |
| 21 | +#ifdef HAVE_CONFIG_H | |
| 22 | +#include <config.h> | |
| 23 | +#endif | |
| 21 | 24 | #include "GException.hpp" |
| 25 | +#include "GTools.hpp" | |
| 22 | 26 | #include "GWcsCAR.hpp" |
| 23 | 27 | |
| 24 | 28 | /* __ Method name definitions ____________________________________________ */ |
| ... | ... | @@ -30,6 +34,8 @@ |
| 30 | 34 | /* __ Coding definitions _________________________________________________ */ |
| 31 | 35 | |
| 32 | 36 | /* __ Debug definitions __________________________________________________ */ |
| 37 | +#define G_DIR2XY_DEBUG // Debug dir2xy | |
| 38 | +#define G_XY2DIR_DEBUG // Debug xy2dir | |
| 33 | 39 | |
| 34 | 40 | /* __ Local prototypes ___________________________________________________ */ |
| 35 | 41 | |
| ... | ... | @@ -81,6 +87,12 @@ GWcsCAR::GWcsCAR(const std::string& coords, |
| 81 | 87 | // Initialise class members |
| 82 | 88 | init_members(); |
| 83 | 89 | |
| 90 | + // Derive projection parameters | |
| 91 | + m_theta0 = 0.0; | |
| 92 | + m_native_pole = wcs_getpole(m_theta0); | |
| 93 | + m_rot = wcs_get_rot(); | |
| 94 | + m_trot = transpose(m_rot); | |
| 95 | + | |
| 84 | 96 | // Return |
| 85 | 97 | return; |
| 86 | 98 | } |
| ... | ... | @@ -194,7 +206,14 @@ std::string GWcsCAR::type(void) const |
| 194 | 206 | GSkyDir GWcsCAR::pix2dir(const int& pix) |
| 195 | 207 | { |
| 196 | 208 | // Throw error |
| 197 | - throw GException::wcs(G_XY2DIR, "WCS method not defined for CAR projection."); | |
| 209 | + throw GException::wcs(G_XY2DIR, | |
| 210 | + "WCS method not defined for CAR projection."); | |
| 211 | + | |
| 212 | + // Define constant direction | |
| 213 | + const GSkyDir dir; | |
| 214 | + | |
| 215 | + // Return | |
| 216 | + return dir; | |
| 198 | 217 | } |
| 199 | 218 | |
| 200 | 219 | |
| ... | ... | @@ -202,14 +221,36 @@ GSkyDir GWcsCAR::pix2dir(const int& pix) |
| 202 | 221 | * @brief Returns sky direction of pixel |
| 203 | 222 | * |
| 204 | 223 | * @param[in] pix Sky pixel. |
| 224 | + * | |
| 225 | + * Note that pixel indices start from 0. | |
| 205 | 226 | ***************************************************************************/ |
| 206 | 227 | GSkyDir GWcsCAR::xy2dir(const GSkyPixel& pix) |
| 207 | 228 | { |
| 208 | - // Allocate sky direction | |
| 209 | - GSkyDir dir; | |
| 210 | - | |
| 211 | - //TODO: Implement | |
| 229 | + // Set constants | |
| 230 | + const int __permutation[2] = {1,0}; | |
| 231 | + | |
| 232 | + // Determine offset | |
| 233 | + GVector offset = GVector(pix.x(), pix.y()); | |
| 234 | + | |
| 235 | + // Determine xy | |
| 236 | + GVector xy = m_cd * (offset - m_refpix); | |
| 237 | + | |
| 238 | + // Swap result if coordinates are reversed | |
| 239 | + if (m_reverse) | |
| 240 | + xy = perm(xy, __permutation); | |
| 241 | + | |
| 242 | + // Perform CAR map projection | |
| 243 | + GVector native = xy * deg2rad; | |
| 244 | + | |
| 245 | + // Get sky direction for native coordinates | |
| 246 | + GSkyDir dir = wcs_native2dir(native); | |
| 212 | 247 | |
| 248 | + // Debug: Dump transformation steps | |
| 249 | + #if defined(G_XY2DIR_DEBUG) | |
| 250 | + std::cout << "xy2dir: pixel=" << offset << " xy=" << xy | |
| 251 | + << " native=" << native << " dir=" << dir << std::endl; | |
| 252 | + #endif | |
| 253 | + | |
| 213 | 254 | // Return |
| 214 | 255 | return dir; |
| 215 | 256 | } |
| ... | ... | @@ -223,7 +264,11 @@ GSkyDir GWcsCAR::xy2dir(const GSkyPixel& pix) |
| 223 | 264 | int GWcsCAR::dir2pix(GSkyDir dir) const |
| 224 | 265 | { |
| 225 | 266 | // Throw error |
| 226 | - throw GException::wcs(G_DIR2XY, "WCS method not defined for CAR projection."); | |
| 267 | + throw GException::wcs(G_DIR2XY, | |
| 268 | + "WCS method not defined for CAR projection."); | |
| 269 | + | |
| 270 | + // Return | |
| 271 | + return 0; | |
| 227 | 272 | } |
| 228 | 273 | |
| 229 | 274 | |
| ... | ... | @@ -231,15 +276,37 @@ int GWcsCAR::dir2pix(GSkyDir dir) const |
| 231 | 276 | * @brief Returns pixel of sky direction |
| 232 | 277 | * |
| 233 | 278 | * @param[in] dir Sky direction. |
| 279 | + * | |
| 280 | + * Note that pixel indices start from 0. | |
| 234 | 281 | ***************************************************************************/ |
| 235 | 282 | GSkyPixel GWcsCAR::dir2xy(GSkyDir dir) const |
| 236 | 283 | { |
| 237 | - // Allocate sky pixel | |
| 238 | - GSkyPixel pixel; | |
| 284 | + // Set constants | |
| 285 | + const int __permutation[2] = {1,0}; | |
| 286 | + | |
| 287 | + // Get native coordinates for sky direction in radians | |
| 288 | + GVector native = wcs_dir2native(dir); | |
| 239 | 289 | |
| 240 | - //TODO: Implement | |
| 290 | + // Perform CAR map projection | |
| 291 | + GVector xy = native * rad2deg; | |
| 241 | 292 | |
| 242 | - // Return | |
| 293 | + // Swap result if coordinates are reversed | |
| 294 | + if (m_reverse) | |
| 295 | + xy = perm(xy, __permutation); | |
| 296 | + | |
| 297 | + // Determine pixel offset | |
| 298 | + GVector offset = m_invcd * xy + m_refpix; | |
| 299 | + | |
| 300 | + // Set sky pixel | |
| 301 | + GSkyPixel pixel(offset(0), offset(1)); | |
| 302 | + | |
| 303 | + // Debug: Dump transformation steps | |
| 304 | + #if defined(G_DIR2XY_DEBUG) | |
| 305 | + std::cout << "dir2xy: dir=" << dir << " native=" << native | |
| 306 | + << " xy=" << xy << " pixel=" << offset << std::endl; | |
| 307 | + #endif | |
| 308 | + | |
| 309 | + // Return sky pixel | |
| 243 | 310 | return pixel; |
| 244 | 311 | } |
| 245 | 312 | |
| ... | ... | @@ -323,17 +390,6 @@ GWcsCAR* GWcsCAR::clone(void) const |
| 323 | 390 | } |
| 324 | 391 | |
| 325 | 392 | |
| 326 | -/***********************************************************************//** | |
| 327 | - * @brief Clone instance | |
| 328 | - ***************************************************************************/ | |
| 329 | -void GWcsCAR::wcsxy2sph(const double& x, const double& y, double* lon, double* lat) const | |
| 330 | -{ | |
| 331 | -} | |
| 332 | -void GWcsCAR::wcssph2xy(const double& lon, const double& lat, double* x, double* y) const | |
| 333 | -{ | |
| 334 | -} | |
| 335 | - | |
| 336 | - | |
| 337 | 393 | /*========================================================================== |
| 338 | 394 | = = |
| 339 | 395 | = GWcsCAR friends = |
| ... | ... | @@ -350,7 +406,9 @@ std::ostream& operator<< (std::ostream& os, const GWcsCAR& wcs) |
| 350 | 406 | { |
| 351 | 407 | // Put header in stream |
| 352 | 408 | os << "=== GWcsCAR ===" << std::endl; |
| 353 | - os << " Coordinate system .........: " << wcs.coordsys(); | |
| 409 | + | |
| 410 | + // Add WCS information | |
| 411 | + wcs.dump_wcs(os); | |
| 354 | 412 | |
| 355 | 413 | // Return output stream |
| 356 | 414 | return os; | ... | ... |