function terminator_line, st, num=num
;; compute the the sunlit terminator line on the earth surface.
;; Returns an array of [radius, lat, lon] (degrees) of points in
;; instrument coordinates along the terminator. Instrument
;; coordinates use the st.axis for the north pole and st.phase to
;; determine 0 phase (i.e. 0 longitude or +x).
;; st is a structure containing the position and attitude state of the
;; spacecraft. Fields:
;; p - earth centered spacecraft position in km
;; c - coordinate structure containing fields:
;;
;; axis - direction of the spin axis ("north end")
;; phase - direction lying in the meridian of 0 phase clock angle
;; about spin axis (i.e. this determines the azimuth 0
;; reference for instrument coordinates). phase must be
;; linearly independent of axis.
;; sun - direction to sun
;;
;; All fields are 3 element vectors in the same rectangular coordinate
;; system. The units of the direction vectors are unimportant and
;; need not be normalized.
;; num - number of points along line. Num-1 is the number of points the
;; half circle of the terminator. A total of 2*Num-2 points will
;; be used for the full terminator circle.
if not keyword_set(num) then num = 500.
sun = unitv(st.c.sun)
axis = unitv(st.c.axis)
phase = unitv(st.c.phase)
;; Pick a +z direction that is perpendicular to st.sun.
if sun(0) eq 0 then z = [1., 0, 0] else z = [0., 1., 0]
z = unitv(z-dot(z, sun)*sun)
;; Terminator in lat,lon coordinates for this +z with 0 longitude at +x
nt = num
t_lat = findgen(nt)/(nt-1)*180.-90.
t_sph = [[t_lat, reverse(t_lat(1:nt-2))], [replicate(90., nt), replicate(270., nt-2)]]
d = transpose([[replicate(1., 2*nt-2)], [t_sph]])
num = nt*2-2
;; To instrument coordinates centered at earth
d = sphere2sphere(d, [[z], [sun]], $
[[axis], [phase]], /degree)
d = sphere_to_xyz(d, /degree)
;; Position to instrument coordinates (converted to Re from km)
p = sphere2sphere(st.p/6378., 0, [[axis], [phase]], /xyz)
;; To spacecraft centered
for i=0, 2 do d(i, *) = d(i, *)-p(i)
;; Spacecraft centered distance
r_sc = sqrt(total(d*d, 1))
dist = sqrt(total(p*p))
pe = -p/dist
rlimb = sqrt(dist^2-1.)
coslimb = rlimb/dist
;; Cosine of angle between point and earth direction
cosa = (transpose(pe) # d)/r_sc
;; Not hidden
ii = where((cosa le coslimb) or (r_sc le rlimb))
if ii(0) eq -1 then return, 0
;; instrument lat, lon coordinates.
s = xyz_to_sphere(d(*, ii), /degree)
return, s
end