/* File: Spheric.java University of Applied Science Berne,HTA-Biel/Bienne, Computer Science Department. Diploma thesis J3D Solar System Simulator Originally written by Marcel Portner & Bernhard Hari (c) 2000 CVS - Information : $Header: /var/cvsreps/projects/c450/2000/sss3d/source_diploma/sss3d/utils/astronomy/Spheric.java,v 1.3 2000/12/13 13:42:49 portm Exp $ $Author: portm $ $Date: 2000/12/13 13:42:49 $ $State: Exp $ */ package sss3d.utils.astronomy; import sss3d.calculations.*; import sss3d.calculations.constants.AstronomicalConstants; import javax.vecmath.Matrix3d; /** * This class calculate the transformation of the coordinate. * * @author Marcel Portner & Bernhard Hari * @version $Revision: 1.3 $ */ public class Spheric { /** * Constructor */ public Spheric() { } /** * Transformation the equatorial coordinates in ecliptical coordinates. * * @param time time in julianish century. * * @return the transformation matrix. */ public Matrix3d equ2EclMatrix(double time) { double eps = (23.43929111 - (46.8150 + (0.00059 - 0.001813 * time) * time) * time / 3600.0) * MoreMath.RAD; Matrix3d mat = new Matrix3d(); mat.setIdentity(); mat.rotX(eps); return mat; } /** * Transformation the ecliptical coordinates in equatorial coordinates. * * @param time time in julianish century. * * @return the transformation matrix. */ public Matrix3d ecl2EquMatrix(double time) { Matrix3d matrix = equ2EclMatrix(time); matrix.transpose(); return matrix; } /** * Transformation equatorial coordinates to horizon system. * * @param dec the declension in [rad]. * @param tau the hour angle in [rad]. * @param lat the latitude of the observer in [rad]. * * @return an array with the values:
* double[0] = elevation in [rad].
* double[1] = azimuth in [rad]. */ public double[] equ2Hor(double dec, double tau, double lat) { // Einheitsvektor im Horizontsystem Vec3D e_equ = new Vec3D(new Polar(tau, dec)); Matrix3d mat = new Matrix3d(); mat.setIdentity(); mat.rotY(StrictMath.PI / 2.0 - lat); e_equ.mul(mat); // Einheitsvektor im aequator. System double[] result = new double[2]; result[0] = e_equ.getElevation(); result[1] = e_equ.getAzimut(); return result; } /** * Transformation horizon system to equatorial coordinates. * * @param h the elevation in [rad]. * @param az the azimuth in [rad]. * @param lat the latitude of the observer in [rad]. * * @return an array with the values:
* double[0] = declension in [rad].
* double[1] = hour angle in [rad]. */ public double[] hor2Equ(double h, double az, double lat) { // Einheitsvektor im Horizontsystem Vec3D e_hor = new Vec3D(new Polar(az, h)); Matrix3d mat = new Matrix3d(); mat.setIdentity(); mat.rotY(-(StrictMath.PI / 2.0 - lat)); e_hor.mul(mat); // Einheitsvektor im aequator. System double[] result = new double[2]; result[0] = e_hor.getElevation(); result[1] = e_hor.getAzimut(); return result; } /** * Calculate the geocentrically position of a place on the earth's surface. * * @param lambda the geocentrically longitude (eastward positiv) in [rad]. * @param phi the geocentrically latitude in [rad]. * * @return the geocentrically position in [km]. */ public Vec3D site(double lambda, double phi) { double f = 1.0 / 298.257; // Abplattung der Erde double e_sqr = f * (2.0 - f); // Quadrat der Exzentrizitaet double cos_phi = StrictMath.cos(phi); // (Ko)sinus der geographischen Breite double sin_phi = StrictMath.sin(phi); double n = AstronomicalConstants.R_EARTH / StrictMath.sqrt(1.0 - e_sqr * (sin_phi * sin_phi)); // Kartesischer Ortsvektor [km] return new Vec3D(n * cos_phi * StrictMath.cos(lambda), n * cos_phi * StrictMath.sin(lambda), (1.0 - e_sqr) * n * sin_phi); } /** * Calculation from equatorial coordinates to standart coordinates. * * @param ra0 the right ascension of the optic axis in [rad]. * @param dec0 the declension of the optic axis in [rad]. * @param x the standart coordinate x. * @param y the standart coordinate y. * * @return an array with the values:
* double[0] = the right ascension in [rad].
* double[1] = the declension in [rad]. */ public double[] stdEqu(double ra0, double dec0, double x, double y) { double[] result = new double[2]; result[0] = ra0 + StrictMath.atan(-x / (StrictMath.cos(dec0) - y * StrictMath.sin(dec0))); result[1] = StrictMath.asin((StrictMath.sin(dec0) + y * StrictMath.cos(dec0)) / StrictMath.sqrt(1.0 + x * x + y * y)); return result; } /** * Calculation from standart coordinates to equatorial coordinates. * * @param ra0 the right ascension of the optic axis in [rad]. * @param dec0 the declension of the optic axis in [rad]. * @param ra the right ascension in [rad]. * @param dec the declension in [rad]. * * @return an array with the values:
* double[0] = the standart coordinate x.
* double[1] = the standart coordinate y. */ public double[] equStd(double ra0, double dec0, double ra, double dec) { double[] result = new double[2]; double c = StrictMath.cos(dec0) * StrictMath.cos(dec) * StrictMath.cos(ra - ra0) + StrictMath.sin(dec0) * StrictMath.sin(dec); result[0] = -(StrictMath.cos(dec) * StrictMath.sin(ra - ra0)) / c; result[1] = -(StrictMath.sin(dec0) * StrictMath.cos(dec) * StrictMath.cos(ra - ra0) - StrictMath.cos(dec0) * StrictMath.sin(dec)) / c; return result; } }