summaryrefslogtreecommitdiffstats
path: root/tksao/frame/frmap.C
diff options
context:
space:
mode:
Diffstat (limited to 'tksao/frame/frmap.C')
-rw-r--r--tksao/frame/frmap.C161
1 files changed, 161 insertions, 0 deletions
diff --git a/tksao/frame/frmap.C b/tksao/frame/frmap.C
new file mode 100644
index 0000000..feb267a
--- /dev/null
+++ b/tksao/frame/frmap.C
@@ -0,0 +1,161 @@
+// Copyright (C) 1999-2016
+// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+// For conditions of distribution and use, see copyright notice in "copyright"
+
+#include "context.h"
+#include "framebase.h"
+#include "fitsimage.h"
+
+double Base::mapAngleFromRef(double angle, Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ double rr = angle;
+ FitsImage* ptr = currentContext->cfits;
+ if (!ptr)
+ return 0;
+
+ switch (sys) {
+ case Coord::IMAGE:
+ case Coord::PHYSICAL:
+ case Coord::DETECTOR:
+ case Coord::AMPLIFIER:
+ break;
+ default:
+ switch (ptr->getWCSOrientation(sys,sky)) {
+ case Coord::NORMAL:
+ rr += ptr->getWCSRotation(sys,sky);
+ break;
+ case Coord::XX:
+ rr = -(angle + ptr->getWCSRotation(sys,sky) + M_PI);
+ break;
+ case Coord::YY:
+ case Coord::XY:
+ break;
+ }
+ }
+
+ return zeroTWOPI(rr);
+}
+
+double Base::mapAngleToRef(double angle, Coord::CoordSystem sys, Coord::SkyFrame sky)
+{
+ double rr = angle;
+ FitsImage* ptr = currentContext->cfits;
+ if (!ptr)
+ return 0;
+
+ switch (sys) {
+ case Coord::IMAGE:
+ case Coord::PHYSICAL:
+ case Coord::DETECTOR:
+ case Coord::AMPLIFIER:
+ break;
+ default:
+ switch (ptr->getWCSOrientation(sys,sky)) {
+ case Coord::NORMAL:
+ rr -= ptr->getWCSRotation(sys,sky);
+ break;
+ case Coord::XX:
+ rr = -(angle + ptr->getWCSRotation(sys,sky) + M_PI);
+ break;
+ case Coord::YY:
+ case Coord::XY:
+ break;
+ }
+ }
+
+ return zeroTWOPI(rr);
+}
+
+double Base::mapDistFromRef(const Vector& v1, const Vector& v2,
+ Coord::InternalSystem sys)
+{
+ switch (sys) {
+ case Coord::CANVAS:
+ return (v2*refToCanvas - v1*refToCanvas).length();
+ case Coord::PANNER:
+ return (v2*refToPanner - v1*refToPanner).length();
+ default:
+ // na
+ return 0;
+ }
+}
+
+double Base::mapLenFromRef(double d, Coord::InternalSystem sys)
+{
+ Vector r = mapLenFromRef(Vector(d,0),sys);
+ return r[0];
+}
+
+Vector Base::mapLenFromRef(const Vector& v, Coord::InternalSystem sys)
+{
+ switch (sys) {
+ case Coord::CANVAS:
+ return mapLen(v,refToCanvas);
+ case Coord::PANNER:
+ return mapLen(v,refToPanner);
+ default:
+ return Vector();
+ }
+}
+
+double Base::mapLenToRef(double d, Coord::InternalSystem sys)
+{
+ Vector r = mapLenToRef(Vector(d,0),sys);
+ return r[0];
+}
+
+Vector Base::mapLenToRef(const Vector& v, Coord::InternalSystem sys)
+{
+ switch (sys) {
+ case Coord::CANVAS:
+ return mapLen(v,canvasToRef);
+ case Coord::PANNER:
+ return mapLen(v,pannerToRef);
+ default:
+ return Vector();
+ }
+}
+
+Vector FrameBase::mapFromRef(const Vector& vv, Coord::InternalSystem sys)
+{
+ switch (sys) {
+ case Coord::REF:
+ return vv;
+ case Coord::USER:
+ return vv * refToUser;
+ case Coord::WIDGET:
+ return vv * refToWidget;
+ case Coord::CANVAS:
+ return vv * refToCanvas;
+ case Coord::WINDOW:
+ return vv * refToWindow;
+ case Coord::PANNER:
+ return vv * refToPanner;
+ case Coord::MAGNIFIER:
+ return vv * refToMagnifier;
+ default:
+ return Vector();
+ }
+}
+
+Vector FrameBase::mapToRef(const Vector& vv, Coord::InternalSystem sys)
+{
+ switch (sys) {
+ case Coord::REF:
+ return vv;
+ case Coord::USER:
+ return vv * userToRef;
+ case Coord::WIDGET:
+ return vv * widgetToRef;
+ case Coord::CANVAS:
+ return vv * canvasToRef;
+ case Coord::WINDOW:
+ return vv * windowToRef;
+ case Coord::PANNER:
+ return vv * pannerToRef;
+ case Coord::MAGNIFIER:
+ return vv * magnifierToRef;
+ default:
+ return Vector();
+ }
+}