fixed dependencies
This commit is contained in:
563
vendor/github.com/hebl/gofa/projection.go
generated
vendored
Normal file
563
vendor/github.com/hebl/gofa/projection.go
generated
vendored
Normal file
@@ -0,0 +1,563 @@
|
||||
// Copyright 2022 HE Boliang
|
||||
// All rights reserved.
|
||||
|
||||
package gofa
|
||||
|
||||
/*
|
||||
Tpxes Project celestial to tangent plane, spherical
|
||||
|
||||
In the tangent plane projection, given celestial spherical
|
||||
coordinates for a star and the tangent point, solve for the star's
|
||||
rectangular coordinates in the tangent plane.
|
||||
|
||||
Given:
|
||||
a,b float64 star's spherical coordinates
|
||||
a0,b0 float64 tangent point's spherical coordinates
|
||||
|
||||
Returned:
|
||||
xi,eta float64 rectangular coordinates of star image (Note 2)
|
||||
|
||||
Returned (function value):
|
||||
int status: 0 = OK
|
||||
1 = star too far from axis
|
||||
2 = antistar on tangent plane
|
||||
3 = antistar too far from axis
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the spherical coordinates are observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". For right-handed spherical coordinates,
|
||||
(xi,eta) are also right-handed. The units of (xi,eta) are,
|
||||
effectively, radians at the tangent point.
|
||||
|
||||
3) All angular arguments are in radians.
|
||||
|
||||
4) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
> iauTpxes < iauTpxev xi,eta
|
||||
iauTpsts iauTpstv star
|
||||
iauTpors iauTporv origin
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tpxes(a, b, a0, b0 float64, xi, eta *float64) int {
|
||||
const TINY = 1e-6
|
||||
|
||||
var j int
|
||||
var sb0, sb, cb0, cb, da, sda, cda, d float64
|
||||
|
||||
/* Functions of the spherical coordinates. */
|
||||
sb0 = sin(b0)
|
||||
sb = sin(b)
|
||||
cb0 = cos(b0)
|
||||
cb = cos(b)
|
||||
da = a - a0
|
||||
sda = sin(da)
|
||||
cda = cos(da)
|
||||
|
||||
/* Reciprocal of star vector length to tangent plane. */
|
||||
d = sb*sb0 + cb*cb0*cda
|
||||
|
||||
/* Check for error cases. */
|
||||
if d > TINY {
|
||||
j = 0
|
||||
} else if d >= 0.0 {
|
||||
j = 1
|
||||
d = TINY
|
||||
} else if d > -TINY {
|
||||
j = 2
|
||||
d = -TINY
|
||||
} else {
|
||||
j = 3
|
||||
}
|
||||
|
||||
/* Return the tangent plane coordinates (even in dubious cases). */
|
||||
*xi = cb * sda / d
|
||||
*eta = (sb*cb0 - cb*sb0*cda) / d
|
||||
|
||||
/* Return the status. */
|
||||
return j
|
||||
}
|
||||
|
||||
/*
|
||||
Tpxev Project celestial to tangent plane, vector
|
||||
|
||||
In the tangent plane projection, given celestial direction cosines
|
||||
for a star and the tangent point, solve for the star's rectangular
|
||||
coordinates in the tangent plane.
|
||||
|
||||
Given:
|
||||
v [3]float64 direction cosines of star (Note 4)
|
||||
v0 [3]float64 direction cosines of tangent point (Note 4)
|
||||
|
||||
Returned:
|
||||
xi,eta float64 tangent plane coordinates of star
|
||||
|
||||
Returned (function value):
|
||||
int status: 0 = OK
|
||||
1 = star too far from axis
|
||||
2 = antistar on tangent plane
|
||||
3 = antistar too far from axis
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the direction cosines represent observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". If the direction cosines are with
|
||||
respect to a right-handed triad, (xi,eta) are also right-handed.
|
||||
The units of (xi,eta) are, effectively, radians at the tangent
|
||||
point.
|
||||
|
||||
3) The method used is to extend the star vector to the tangent
|
||||
plane and then rotate the triad so that (x,y) becomes (xi,eta).
|
||||
Writing (a,b) for the celestial spherical coordinates of the
|
||||
star, the sequence of rotations is (a+pi/2) around the z-axis
|
||||
followed by (pi/2-b) around the x-axis.
|
||||
|
||||
4) If vector v0 is not of unit length, or if vector v is of zero
|
||||
length, the results will be wrong.
|
||||
|
||||
5) If v0 points at a pole, the returned (xi,eta) will be based on
|
||||
the arbitrary assumption that the longitude coordinate of the
|
||||
tangent point is zero.
|
||||
|
||||
6) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
iauTpxes > iauTpxev < xi,eta
|
||||
iauTpsts iauTpstv star
|
||||
iauTpors iauTporv origin
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tpxev(v, v0 [3]float64, xi, eta *float64) int {
|
||||
const TINY = 1e-6
|
||||
var j int
|
||||
var x, y, z, x0, y0, z0, r2, r, w, d float64
|
||||
|
||||
/* Star and tangent point. */
|
||||
x = v[0]
|
||||
y = v[1]
|
||||
z = v[2]
|
||||
x0 = v0[0]
|
||||
y0 = v0[1]
|
||||
z0 = v0[2]
|
||||
|
||||
/* Deal with polar case. */
|
||||
r2 = x0*x0 + y0*y0
|
||||
r = sqrt(r2)
|
||||
if r == 0.0 {
|
||||
r = 1e-20
|
||||
x0 = r
|
||||
}
|
||||
|
||||
/* Reciprocal of star vector length to tangent plane. */
|
||||
w = x*x0 + y*y0
|
||||
d = w + z*z0
|
||||
|
||||
/* Check for error cases. */
|
||||
if d > TINY {
|
||||
j = 0
|
||||
} else if d >= 0.0 {
|
||||
j = 1
|
||||
d = TINY
|
||||
} else if d > -TINY {
|
||||
j = 2
|
||||
d = -TINY
|
||||
} else {
|
||||
j = 3
|
||||
}
|
||||
|
||||
/* Return the tangent plane coordinates (even in dubious cases). */
|
||||
d *= r
|
||||
*xi = (y*x0 - x*y0) / d
|
||||
*eta = (z*r2 - z0*w) / d
|
||||
|
||||
/* Return the status. */
|
||||
return j
|
||||
}
|
||||
|
||||
/*
|
||||
Tpsts Project tangent plane to celestial, spherical
|
||||
|
||||
In the tangent plane projection, given the star's rectangular
|
||||
coordinates and the spherical coordinates of the tangent point,
|
||||
solve for the spherical coordinates of the star.
|
||||
|
||||
Given:
|
||||
xi,eta float64 rectangular coordinates of star image (Note 2)
|
||||
a0,b0 float64 tangent point's spherical coordinates
|
||||
|
||||
Returned:
|
||||
a,b float64 star's spherical coordinates
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the spherical coordinates are observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". If the spherical coordinates are with
|
||||
respect to a right-handed triad, (xi,eta) are also right-handed.
|
||||
The units of (xi,eta) are, effectively, radians at the tangent
|
||||
point.
|
||||
|
||||
3) All angular arguments are in radians.
|
||||
|
||||
4) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
iauTpxes iauTpxev xi,eta
|
||||
> iauTpsts < iauTpstv star
|
||||
iauTpors iauTporv origin
|
||||
|
||||
Called:
|
||||
Anp normalize angle into range 0 to 2pi
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tpsts(xi, eta, a0, b0 float64, a, b *float64) {
|
||||
var sb0, cb0, d float64
|
||||
|
||||
sb0 = sin(b0)
|
||||
cb0 = cos(b0)
|
||||
d = cb0 - eta*sb0
|
||||
*a = Anp(atan2(xi, d) + a0)
|
||||
*b = atan2(sb0+eta*cb0, sqrt(xi*xi+d*d))
|
||||
}
|
||||
|
||||
/*
|
||||
Tpstv Project tangent plane to celestial, vector
|
||||
|
||||
In the tangent plane projection, given the star's rectangular
|
||||
coordinates and the direction cosines of the tangent point, solve
|
||||
for the direction cosines of the star.
|
||||
|
||||
Given:
|
||||
xi,eta float64 rectangular coordinates of star image (Note 2)
|
||||
v0 [3]float64 tangent point's direction cosines
|
||||
|
||||
Returned:
|
||||
v [3]float64 star's direction cosines
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the direction cosines represent observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". If the direction cosines are with
|
||||
respect to a right-handed triad, (xi,eta) are also right-handed.
|
||||
The units of (xi,eta) are, effectively, radians at the tangent
|
||||
point.
|
||||
|
||||
3) The method used is to complete the star vector in the (xi,eta)
|
||||
based triad and normalize it, then rotate the triad to put the
|
||||
tangent point at the pole with the x-axis aligned to zero
|
||||
longitude. Writing (a0,b0) for the celestial spherical
|
||||
coordinates of the tangent point, the sequence of rotations is
|
||||
(b-pi/2) around the x-axis followed by (-a-pi/2) around the
|
||||
z-axis.
|
||||
|
||||
4) If vector v0 is not of unit length, the returned vector v will
|
||||
be wrong.
|
||||
|
||||
5) If vector v0 points at a pole, the returned vector v will be
|
||||
based on the arbitrary assumption that the longitude coordinate
|
||||
of the tangent point is zero.
|
||||
|
||||
6) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
iauTpxes iauTpxev xi,eta
|
||||
iauTpsts > iauTpstv < star
|
||||
iauTpors iauTporv origin
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tpstv(xi, eta float64, v0 [3]float64, v *[3]float64) {
|
||||
var x, y, z, f, r float64
|
||||
|
||||
/* Tangent point. */
|
||||
x = v0[0]
|
||||
y = v0[1]
|
||||
z = v0[2]
|
||||
|
||||
/* Deal with polar case. */
|
||||
r = sqrt(x*x + y*y)
|
||||
if r == 0.0 {
|
||||
r = 1e-20
|
||||
x = r
|
||||
}
|
||||
|
||||
/* Star vector length to tangent plane. */
|
||||
f = sqrt(1.0 + xi*xi + eta*eta)
|
||||
|
||||
/* Apply the transformation and normalize. */
|
||||
v[0] = (x - (xi*y+eta*x*z)/r) / f
|
||||
v[1] = (y + (xi*x-eta*y*z)/r) / f
|
||||
v[2] = (z + eta*r) / f
|
||||
}
|
||||
|
||||
/*
|
||||
Tpors Solve for tangent point, spherical
|
||||
|
||||
In the tangent plane projection, given the rectangular coordinates
|
||||
of a star and its spherical coordinates, determine the spherical
|
||||
coordinates of the tangent point.
|
||||
|
||||
Given:
|
||||
xi,eta float64 rectangular coordinates of star image (Note 2)
|
||||
a,b float64 star's spherical coordinates (Note 3)
|
||||
|
||||
Returned:
|
||||
a01,b01 float64 tangent point's spherical coordinates, Soln. 1
|
||||
a02,b02 float64 tangent point's spherical coordinates, Soln. 2
|
||||
|
||||
Returned (function value):
|
||||
int number of solutions:
|
||||
0 = no solutions returned (Note 5)
|
||||
1 = only the first solution is useful (Note 6)
|
||||
2 = both solutions are useful (Note 6)
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the spherical coordinates are observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". If the spherical coordinates are with
|
||||
respect to a right-handed triad, (xi,eta) are also right-handed.
|
||||
The units of (xi,eta) are, effectively, radians at the tangent
|
||||
point.
|
||||
|
||||
3) All angular arguments are in radians.
|
||||
|
||||
4) The angles a01 and a02 are returned in the range 0-2pi. The
|
||||
angles b01 and b02 are returned in the range +/-pi, but in the
|
||||
usual, non-pole-crossing, case, the range is +/-pi/2.
|
||||
|
||||
5) Cases where there is no solution can arise only near the poles.
|
||||
For example, it is clearly impossible for a star at the pole
|
||||
itself to have a non-zero xi value, and hence it is meaningless
|
||||
to ask where the tangent point would have to be to bring about
|
||||
this combination of xi and dec.
|
||||
|
||||
6) Also near the poles, cases can arise where there are two useful
|
||||
solutions. The return value indicates whether the second of the
|
||||
two solutions returned is useful; 1 indicates only one useful
|
||||
solution, the usual case.
|
||||
|
||||
7) The basis of the algorithm is to solve the spherical triangle PSC,
|
||||
where P is the north celestial pole, S is the star and C is the
|
||||
tangent point. The spherical coordinates of the tangent point are
|
||||
[a0,b0]; writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), side c
|
||||
is then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be
|
||||
found) is (pi/2-b0). Angle C is given by sin(C) = xi/rho and
|
||||
cos(C) = eta/rho. Angle P (to be found) is the longitude
|
||||
difference between star and tangent point (a-a0).
|
||||
|
||||
8) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
iauTpxes iauTpxev xi,eta
|
||||
iauTpsts iauTpstv star
|
||||
> iauTpors < iauTporv origin
|
||||
|
||||
Called:
|
||||
Anp normalize angle into range 0 to 2pi
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tpors(xi, eta, a, b float64, a01, b01, a02, b02 *float64) int {
|
||||
var xi2, r, sb, cb, rsb, rcb, w2, w, s, c float64
|
||||
|
||||
xi2 = xi * xi
|
||||
r = sqrt(1.0 + xi2 + eta*eta)
|
||||
sb = sin(b)
|
||||
cb = cos(b)
|
||||
rsb = r * sb
|
||||
rcb = r * cb
|
||||
w2 = rcb*rcb - xi2
|
||||
if w2 >= 0.0 {
|
||||
w = sqrt(w2)
|
||||
s = rsb - eta*w
|
||||
c = rsb*eta + w
|
||||
if xi == 0.0 && w == 0.0 {
|
||||
w = 1.0
|
||||
}
|
||||
*a01 = Anp(a - atan2(xi, w))
|
||||
*b01 = atan2(s, c)
|
||||
w = -w
|
||||
s = rsb - eta*w
|
||||
c = rsb*eta + w
|
||||
*a02 = Anp(a - atan2(xi, w))
|
||||
*b02 = atan2(s, c)
|
||||
if fabs(rsb) < 1.0 {
|
||||
return 1
|
||||
} else {
|
||||
return 2
|
||||
}
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Tporv Solve for tangent point, vector
|
||||
|
||||
In the tangent plane projection, given the rectangular coordinates
|
||||
of a star and its direction cosines, determine the direction
|
||||
cosines of the tangent point.
|
||||
|
||||
Given:
|
||||
xi,eta float64 rectangular coordinates of star image (Note 2)
|
||||
v [3]float64 star's direction cosines (Note 3)
|
||||
|
||||
Returned:
|
||||
v01 [3]float64 tangent point's direction cosines, Solution 1
|
||||
v02 [3]float64 tangent point's direction cosines, Solution 2
|
||||
|
||||
Returned (function value):
|
||||
int number of solutions:
|
||||
0 = no solutions returned (Note 4)
|
||||
1 = only the first solution is useful (Note 5)
|
||||
2 = both solutions are useful (Note 5)
|
||||
|
||||
Notes:
|
||||
|
||||
1) The tangent plane projection is also called the "gnomonic
|
||||
projection" and the "central projection".
|
||||
|
||||
2) The eta axis points due north in the adopted coordinate system.
|
||||
If the direction cosines represent observed (RA,Dec), the tangent
|
||||
plane coordinates (xi,eta) are conventionally called the
|
||||
"standard coordinates". If the direction cosines are with
|
||||
respect to a right-handed triad, (xi,eta) are also right-handed.
|
||||
The units of (xi,eta) are, effectively, radians at the tangent
|
||||
point.
|
||||
|
||||
3) The vector v must be of unit length or the result will be wrong.
|
||||
|
||||
4) Cases where there is no solution can arise only near the poles.
|
||||
For example, it is clearly impossible for a star at the pole
|
||||
itself to have a non-zero xi value, and hence it is meaningless
|
||||
to ask where the tangent point would have to be.
|
||||
|
||||
5) Also near the poles, cases can arise where there are two useful
|
||||
solutions. The return value indicates whether the second of the
|
||||
two solutions returned is useful; 1 indicates only one useful
|
||||
solution, the usual case.
|
||||
|
||||
6) The basis of the algorithm is to solve the spherical triangle
|
||||
PSC, where P is the north celestial pole, S is the star and C is
|
||||
the tangent point. Calling the celestial spherical coordinates
|
||||
of the star and tangent point (a,b) and (a0,b0) respectively, and
|
||||
writing rho^2 = (xi^2+eta^2) and r^2 = (1+rho^2), and
|
||||
transforming the vector v into (a,b) in the normal way, side c is
|
||||
then (pi/2-b), side p is sqrt(xi^2+eta^2) and side s (to be
|
||||
found) is (pi/2-b0), while angle C is given by sin(C) = xi/rho
|
||||
and cos(C) = eta/rho; angle P (to be found) is (a-a0). After
|
||||
solving the spherical triangle, the result (a0,b0) can be
|
||||
expressed in vector form as v0.
|
||||
|
||||
7) This function is a member of the following set:
|
||||
|
||||
spherical vector solve for
|
||||
|
||||
iauTpxes iauTpxev xi,eta
|
||||
iauTpsts iauTpstv star
|
||||
iauTpors > iauTporv < origin
|
||||
|
||||
References:
|
||||
|
||||
Calabretta M.R. & Greisen, E.W., 2002, "Representations of
|
||||
celestial coordinates in FITS", Astron.Astrophys. 395, 1077
|
||||
|
||||
Green, R.M., "Spherical Astronomy", Cambridge University Press,
|
||||
1987, Chapter 13.
|
||||
*/
|
||||
func Tporv(xi, eta float64, v [3]float64, v01, v02 *[3]float64) int {
|
||||
var x, y, z, rxy2, xi2, eta2p1, r, rsb, rcb, w2, w, c float64
|
||||
|
||||
x = v[0]
|
||||
y = v[1]
|
||||
z = v[2]
|
||||
rxy2 = x*x + y*y
|
||||
xi2 = xi * xi
|
||||
eta2p1 = eta*eta + 1.0
|
||||
r = sqrt(xi2 + eta2p1)
|
||||
rsb = r * z
|
||||
rcb = r * sqrt(x*x+y*y)
|
||||
w2 = rcb*rcb - xi2
|
||||
if w2 > 0.0 {
|
||||
w = sqrt(w2)
|
||||
c = (rsb*eta + w) / (eta2p1 * sqrt(rxy2*(w2+xi2)))
|
||||
v01[0] = c * (x*w + y*xi)
|
||||
v01[1] = c * (y*w - x*xi)
|
||||
v01[2] = (rsb - eta*w) / eta2p1
|
||||
w = -w
|
||||
c = (rsb*eta + w) / (eta2p1 * sqrt(rxy2*(w2+xi2)))
|
||||
v02[0] = c * (x*w + y*xi)
|
||||
v02[1] = c * (y*w - x*xi)
|
||||
v02[2] = (rsb - eta*w) / eta2p1
|
||||
if fabs(rsb) < 1.0 {
|
||||
return 1
|
||||
} else {
|
||||
return 2
|
||||
}
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user