angunitvec.pro
2.72 KB
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
;+
; NAME:
; ANGUNITVEC
;
; AUTHOR:
; Craig B. Markwardt, NASA/GSFC Code 662, Greenbelt, MD 20770
; craigm@lheamail.gsfc.nasa.gov
; UPDATED VERSIONs can be found on my WEB PAGE:
; http://cow.physics.wisc.edu/~craigm/idl/idl.html
;
; PURPOSE:
; Convert longitude and (co)latitude (RA/Dec) to unit vector
;
; MAJOR TOPICS:
; Geometry
;
; CALLING SEQUENCE:
; U = ANGUNITVEC(LON, LAT, [/DEC])
;
; DESCRIPTION:
;
; The function ANGUNITVEC converts spherical polar angles into a
; unit vector.
;
; The inputs, LON and LAT, describes a point in spherical polar
; coordinates on the unit sphere. The output is that point as a
; unit 3-vector.
;
; LON is the longitude angle, measured in degrees from +X, with
; positive angles rotating through +Y. The range of LON is
; 0 (+X) through 90 (+Y) through 360.
;
; If DEC=0, LAT represents a colatitude angle, measured in
; degrees from +Z. The range of LAT is 0 (+Z) through
; 180 (-Z).
;
; If DEC=1, LAT represents a latitude angle ("declination"
; in astronomy), measured in degrees from the XY equator (positive
; toward +Z). The range of LAT is -90 (-Z) through +90 (+Z).
;
; ANGUNITVEC and UNITVECANG are functional inverses.
; UNITVECANG(ANGUNITVEC(LON,LAT)) should produce the same LONLAT
; pairs.
;
; INPUTS:
;
; LON - input longitude values, scalar or vector. See above.
; LAT - input (co)latitude, scalar or vector. See above.
;
; RETURNS:
;
; The resulting unit vector, either a 3-vector or a 3xN array for N
; unit vectors.
;
;
; KEYWORD PARAMETERS:
;
; DEC - if set, then the input LONLAT(1,*) component is latitude;
; if not set then LONLAT(1,*) is a colatitude.
;
; EXAMPLE:
;
; print, angunitvec([157.65924,80.052155])
; ==> [-9.1103345E-01,3.7439942E-01,1.7275169E-01]
; (compare to example in UNITVECANG)
;
; SEE ALSO
; UNITVECANG, ANGUNITVEC, CROSSP, QTNORMALIZE
;
; MODIFICATION HISTORY:
; Written, 1999, CM
; Documented, 2012-10-02, CM
;
; $Id: angunitvec.pro,v 1.2 2012/10/02 12:28:13 cmarkwar Exp $
;
;-
; Copyright (C) 1999, 2012, Craig Markwardt
; This software is provided as is without any warranty whatsoever.
; Permission to use, copy, modify, and distribute modified or
; unmodified copies is granted, provided this copyright and disclaimer
; are included unchanged.
;-
function angunitvec, a0, d0, declination=declination
dtor = !dpi/180D
n = min([n_elements(a0), n_elements(d0)])
unit = dblarr(3,n)
unit = reform(unit, 3, n, /overwrite)
if keyword_set(declination) then $
d = double(90D - d0)*dtor else d = double(d0)*dtor
a = a0*dtor
unit(0,*) = cos(a)*sin(d)
unit(1,*) = sin(a)*sin(d)
unit(2,*) = cos(d)
if n_elements(unit) EQ 3 then unit = unit(*) ;; Allow dimensions to relax
return, unit
end