@@ -164,7 +164,14 @@ function makeCompass(plotId, action){
164
164
var zf = cc . zoomFactor || 1 ;
165
165
var wpt2 = makeWorldPt ( wpStart . getLon ( ) , wpStart . getLat ( ) + ( Math . abs ( cdelt1 ) / zf ) * ( px ) , CoordinateSys . EQ_J2000 ) ;
166
166
var spt2 = cc . getScreenCoords ( wpt2 ) ;
167
- var sptE2 = getEastFromNorthOnScreen ( cc , sptStart , spt2 , Math . PI / 2 ) ;
167
+ var wpt3 = makeWorldPt ( wpStart . getLon ( ) + ( Math . abs ( cdelt1 ) / ( Math . cos ( wpStart . getLat ( ) * Math . PI / 180. ) * zf ) ) * ( px ) ,
168
+ wpStart . getLat ( ) , CoordinateSys . EQ_J2000 ) ;
169
+ var spt3 = cc . getScreenCoords ( wpt3 ) ;
170
+ // don't use spt3 because of funny effects near the celestial poles
171
+ // the sign of the cross product of compass vectors tells us if the image is mirror-reversed from the sky
172
+ var cross_product = ( spt3 . x - sptStart . x ) * ( spt2 . y - sptStart . y ) -
173
+ ( spt3 . y - sptStart . y ) * ( spt2 . x - sptStart . x ) ;
174
+ var sptE2 = getEastFromNorthOnScreen ( cc , sptStart , spt2 , Math . sign ( cross_product ) ) ;
168
175
169
176
if ( sptStart === null || spt2 === null || sptE2 === null ) {
170
177
return null ;
@@ -176,12 +183,12 @@ function makeCompass(plotId, action){
176
183
return [ dataE , dataN ] ;
177
184
}
178
185
179
- function getEastFromNorthOnScreen ( cc , origin , nVec ) {
186
+ function getEastFromNorthOnScreen ( cc , origin , nVec , sign ) {
180
187
var originSpt = cc . getScreenCoords ( origin ) ;
181
188
var vec1Spt = cc . getScreenCoords ( nVec ) ;
182
189
183
- var x2 = ( vec1Spt . y - originSpt . y ) + originSpt . x ;
184
- var y2 = - ( vec1Spt . x - originSpt . x ) + originSpt . y ;
190
+ var x2 = sign * ( vec1Spt . y - originSpt . y ) + originSpt . x ;
191
+ var y2 = - sign * ( vec1Spt . x - originSpt . x ) + originSpt . y ;
185
192
186
193
return makeScreenPt ( x2 , y2 ) ;
187
194
}
0 commit comments