From 33b8f9fd852477630addbf48a59d01849df5a096 Mon Sep 17 00:00:00 2001 From: William Joye Date: Thu, 16 Aug 2018 12:52:55 -0400 Subject: simplify wcs code --- tksao/frame/basecommand.C | 10 ++++++ tksao/frame/fitsimage.C | 20 +++++------- tksao/frame/fitsmap.C | 35 +++++++++++++++----- tksao/vector/vectorstr.C | 83 ++++++++++++++++++++++++++++++++++++++++------- tksao/vector/vectorstr.h | 8 +++-- 5 files changed, 123 insertions(+), 33 deletions(-) diff --git a/tksao/frame/basecommand.C b/tksao/frame/basecommand.C index 2c60ee9..b3ad310 100644 --- a/tksao/frame/basecommand.C +++ b/tksao/frame/basecommand.C @@ -1783,6 +1783,16 @@ void Base::getFitsSliceCmd(int id, Coord::CoordSystem sys) { if (currentContext->fits) { int ss = currentContext->slice(id); + /* + FitsImage* ptr = currentContext->fits; + Vector cc = ptr->center(); + Vector3d dd = Vector3d(cc,ss) * Translate3d(-.5,-.5,-.5); + cerr << ptr->mapFromRef(dd,sys,Coord::FK5,Coord::SEXAGESIMAL) + << '=' + << ptr->mapFromRef(dd,sys) + << '=' + << ptr->mapFromImage3d(ss,sys) << endl; + */ printDouble(currentContext->fits->mapFromImage3d(ss,sys)); } else diff --git a/tksao/frame/fitsimage.C b/tksao/frame/fitsimage.C index 984b21a..23d8e40 100644 --- a/tksao/frame/fitsimage.C +++ b/tksao/frame/fitsimage.C @@ -2763,23 +2763,22 @@ const char* FitsImage::getWCSAxisSymbol(Coord::CoordSystem sys, int axis) Vector FitsImage::pix2wcs(const Vector& in, Coord::CoordSystem sys, Coord::SkyFrame sky) { - astClearStatus; // just to make sure - astBegin; // start memory management - if (!hasWCS(sys)) return Vector(); + astClearStatus; // just to make sure + astBegin; // start memory management + setWCSSystem(sys); setWCSSkyFrame(sky); Vector out = wcsTran(ast_, in, 1); + if (!astOK || !checkWCS(out)) + return Vector(); astEnd; - if (astOK && checkWCS(out)) - return hasWCSCel(sys) ? zero360(radToDeg(out)) : out; - - return Vector(); + return hasWCSCel(sys) ? zero360(radToDeg(out)) : out; } VectorStr FitsImage::pix2wcs(const Vector& in, Coord::CoordSystem sys, @@ -2818,13 +2817,12 @@ Vector3d FitsImage::pix2wcs(const Vector3d& in, Coord::CoordSystem sys, setWCSSkyFrame(sky); Vector3d out = wcsTran(ast_, in, 1); + if (!astOK || !checkWCS(out)) + return Vector3d(); astEnd; - if (astOK && checkWCS(out)) - return hasWCSCel(sys) ? zero360(radToDeg(out)) : out; - else - return Vector3d(); + return hasWCSCel(sys) ? zero360(radToDeg(out)) : out; } VectorStr3d FitsImage::pix2wcs(const Vector3d& in, Coord::CoordSystem sys, diff --git a/tksao/frame/fitsmap.C b/tksao/frame/fitsmap.C index 53903ec..97708ac 100644 --- a/tksao/frame/fitsmap.C +++ b/tksao/frame/fitsmap.C @@ -30,10 +30,21 @@ Vector FitsImage::mapFromRef(const Vector& vv, Coord::CoordSystem out, VectorStr FitsImage::mapFromRef(const Vector& vv, Coord::CoordSystem out, Coord::SkyFrame sky, Coord::SkyFormat format) { - if (hasWCS(out)) - return pix2wcs(vv * refToImage, out, sky, format); - else - return VectorStr(); + switch (out) { + case Coord::IMAGE: + return VectorStr(vv * refToImage); + case Coord::PHYSICAL: + return VectorStr(vv * refToPhysical); + case Coord::AMPLIFIER: + return VectorStr(vv * refToAmplifier); + case Coord::DETECTOR: + return VectorStr(vv * refToDetector); + default: + if (hasWCS(out)) + return pix2wcs(vv * refToImage, out, sky, format); + } + + return VectorStr(); } Vector3d FitsImage::mapFromRef(const Vector3d& vv, Coord::CoordSystem out, @@ -56,10 +67,18 @@ Vector3d FitsImage::mapFromRef(const Vector3d& vv, Coord::CoordSystem out, VectorStr3d FitsImage::mapFromRef(const Vector3d& vv, Coord::CoordSystem out, Coord::SkyFrame sky, Coord::SkyFormat format) { - if (hasWCS(out)) - return pix2wcs(vv * refToImage3d, out, sky, format); - else - return VectorStr3d(); + switch (out) { + case Coord::IMAGE: + case Coord::PHYSICAL: + case Coord::AMPLIFIER: + case Coord::DETECTOR: + return VectorStr3d(vv * refToImage3d); + default: + if (hasWCS(out)) + return pix2wcs(vv * refToImage3d, out, sky, format); + } + + return VectorStr3d(); } Vector FitsImage::mapToRef(const Vector& vv, Coord::CoordSystem in, diff --git a/tksao/vector/vectorstr.C b/tksao/vector/vectorstr.C index c77ef16..7d0576c 100644 --- a/tksao/vector/vectorstr.C +++ b/tksao/vector/vectorstr.C @@ -28,14 +28,44 @@ VectorStr::VectorStr(const VectorStr& vv) c[1] = dupstr(vv.c[1]); } +VectorStr::VectorStr(const Vector& vv) +{ + ostringstream str0; + str0 << vv[0]; + c[0] = dupstr(str0.str().c_str()); + + ostringstream str1; + str1 << vv[1]; + c[1] = dupstr(str1.str().c_str()); +} + VectorStr& VectorStr::operator=(const VectorStr& vv) { if (c[0]) delete [] c[0]; c[0]=dupstr(vv.c[0]); + if (c[1]) delete [] c[1]; c[1]=dupstr(vv.c[1]); + + return *this; +} + +VectorStr& VectorStr::operator=(const Vector& vv) +{ + if (c[0]) + delete [] c[0]; + ostringstream str0; + str0 << vv[0]; + c[0] = dupstr(str0.str().c_str()); + + if (c[1]) + delete [] c[1]; + ostringstream str1; + str1 << vv[1]; + c[1] = dupstr(str1.str().c_str()); + return *this; } @@ -57,12 +87,6 @@ ostream& operator<<(ostream& os, const VectorStr& vv) return os; } -istream& operator>>(istream& ss, VectorStr& vv) -{ - ss >> vv.c[0] >> vv.c[1]; - return ss; -} - // VectorStr3d VectorStr3d::~VectorStr3d() @@ -89,17 +113,58 @@ VectorStr3d::VectorStr3d(const VectorStr3d& vv) c[2] = dupstr(vv.c[2]); } +VectorStr3d::VectorStr3d(const Vector3d& vv) +{ + ostringstream str0; + str0 << vv[0]; + c[0] = dupstr(str0.str().c_str()); + + ostringstream str1; + str1 << vv[1]; + c[1] = dupstr(str1.str().c_str()); + + ostringstream str2; + str2 << vv[2]; + c[2] = dupstr(str2.str().c_str()); +} + VectorStr3d& VectorStr3d::operator=(const VectorStr3d& vv) { if (c[0]) delete [] c[0]; c[0]=dupstr(vv.c[0]); + if (c[1]) delete [] c[1]; c[1]=dupstr(vv.c[1]); + if (c[2]) delete [] c[2]; c[2]=dupstr(vv.c[2]); + + return *this; +} + +VectorStr3d& VectorStr3d::operator=(const Vector3d& vv) +{ + if (c[0]) + delete [] c[0]; + ostringstream str0; + str0 << vv[0]; + c[0] = dupstr(str0.str().c_str()); + + if (c[1]) + delete [] c[1]; + ostringstream str1; + str1 << vv[1]; + c[1] = dupstr(str1.str().c_str()); + + if (c[2]) + delete [] c[2]; + ostringstream str2; + str2 << vv[2]; + c[2] = dupstr(str2.str().c_str()); + return *this; } @@ -120,9 +185,3 @@ ostream& operator<<(ostream& os, const VectorStr3d& vv) return os; } - -istream& operator>>(istream& ss, VectorStr3d& vv) -{ - ss >> vv.c[0] >> vv.c[1] >> vv.c[2]; - return ss; -} diff --git a/tksao/vector/vectorstr.h b/tksao/vector/vectorstr.h index 36587ad..71181fb 100644 --- a/tksao/vector/vectorstr.h +++ b/tksao/vector/vectorstr.h @@ -5,6 +5,8 @@ #ifndef __vectorstr_h__ #define __vectorstr_h__ +#include "vector.h" + #include using namespace std; @@ -17,14 +19,15 @@ class VectorStr { ~VectorStr(); VectorStr(const char*, const char*); VectorStr(const VectorStr&); + VectorStr(const Vector&); VectorStr& operator=(const VectorStr&); + VectorStr& operator=(const Vector&); const char* operator[](int i) const {return c[i];} // return element char** cc() {return c;} // return vector }; ostream& operator<<(ostream&, const VectorStr&); -istream& operator>>(istream&, VectorStr&); class VectorStr3d { public: @@ -35,14 +38,15 @@ class VectorStr3d { ~VectorStr3d(); VectorStr3d(const char*, const char*, const char*); VectorStr3d(const VectorStr3d&); + VectorStr3d(const Vector3d&); VectorStr3d& operator=(const VectorStr3d&); + VectorStr3d& operator=(const Vector3d&); const char* operator[](int i) const {return c[i];} // return element char** cc() {return c;} // return vector }; ostream& operator<<(ostream&, const VectorStr3d&); -istream& operator>>(istream&, VectorStr3d&); #endif -- cgit v0.12