1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
// Copyright (C) 1999-2018
// Smithsonian Astrophysical Observatory, Cambridge, MA, USA
// For conditions of distribution and use, see copyright notice in "copyright"
#include "context.h"
#include "frame3dbase.h"
#include "fitsimage.h"
Vector3d Frame3dBase::mapFromRef3d(const Vector& vv, Coord::InternalSystem sys)
{
// context->slice() IMAGE (ranges 1-n)
double sl = keyContext->slice(2)-.5;
return mapFromRef3d(vv,sys,sl);
}
Vector3d Frame3dBase::mapFromRef3d(const Vector& vv, Coord::InternalSystem sys,
double sl)
{
// note: sl is in REF=DATA coordinates
Matrix3d mm;
switch (sys) {
case Coord::REF:
return Vector3d(vv,sl);
case Coord::USER:
mm = refToUser3d;
break;
case Coord::WIDGET:
mm = refToWidget3d;
break;
case Coord::CANVAS:
mm = refToCanvas3d;
break;
case Coord::WINDOW:
mm = refToWindow3d;
break;
case Coord::PANNER:
mm = refToPanner3d;
break;
case Coord::MAGNIFIER:
mm = refToMagnifier3d;
break;
default:
// na
break;
}
return Vector3d(vv,sl)*mm;
}
Vector3d Frame3dBase::mapToRef3d(const Vector& vv, Coord::InternalSystem sys)
{
// context->slice() IMAGE (ranges 1-n)
double sl = keyContext->slice(2)-.5;
return mapToRef3d(vv,sys,sl);
}
Vector3d Frame3dBase::mapToRef3d(const Vector& vv, Coord::InternalSystem sys,
double sl)
{
switch (sys) {
case Coord::REF:
return Vector3d(vv,sl);
case Coord::USER:
return Vector3d(vv,sl)*userToRef3d;
default:
break;
}
Vector ww;
switch (sys) {
case Coord::WIDGET:
ww = vv;
break;
case Coord::CANVAS:
ww = vv*canvasToWidget;
break;
case Coord::WINDOW:
ww = vv*windowToWidget;
break;
case Coord::PANNER:
ww = vv*pannerToWidget;
break;
case Coord::MAGNIFIER:
ww = vv*magnifierToWidget;
break;
default:
// should not happen
return Vector3d();
}
// note: sl is in REF=DATA coordinates
Vector3d xx = Vector3d(1,0,sl)*refToWidget3d;
Vector3d yy = Vector3d(0,1,sl)*refToWidget3d;
Vector3d oo = Vector3d(0,0,sl)*refToWidget3d;
Vector3d ii=xx-oo;
Vector3d jj=yy-oo;
Vector3d nn = cross(jj,ii).normalize();
double dd = -(nn*xx);
double zz = (-nn[0]*ww[0]-nn[1]*ww[1]-dd) / nn[2];
Vector3d rr = Vector3d(ww,zz)*widgetToRef3d;
// if othogonal, set to center
if (teq(az_,M_PI_2,.001) || teq(az_,3*M_PI_2,.001))
rr[0] = vp_[0];
if (teq(el_,M_PI_2,.001) || teq(el_,3*M_PI_2,.001))
rr[1] = vp_[1];
return rr;
}
|