diff options
Diffstat (limited to 'org/madore/ephem/Frames.java')
-rw-r--r-- | org/madore/ephem/Frames.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/org/madore/ephem/Frames.java b/org/madore/ephem/Frames.java new file mode 100644 index 0000000..e85412c --- /dev/null +++ b/org/madore/ephem/Frames.java @@ -0,0 +1,85 @@ +package org.madore.ephem; + +public final class Frames { + + private static double[] unboxDoubleArray(Double[] c) { + double[] unboxed = new double[c.length]; + for ( int i=0 ; i<unboxed.length ; i++ ) + unboxed[i] = c[i]; + return unboxed; + } + + public static final class Vector { + double[] crd; + public Vector(double... crd) { + if ( crd.length != 3 ) + throw new IllegalArgumentException("Vector constructor expects 3 coordinates"); + this.crd = crd; + } + public Vector(Double... crd) { + this(unboxDoubleArray(crd)); + } + public double dotprod(Vector v) { + double res = 0; + for ( int i=0 ; i<3 ; i++ ) + res += crd[i]*v.crd[i]; + return res; + } + public double sqnorm() { + double res = 0; + for ( int i=0 ; i<3 ; i++ ) + res += crd[i]*crd[i]; + return res; + } + } + + public static final class RotationMatrix { + double[][] mat; + public RotationMatrix(double[][] mat) { + if ( mat.length != 3 ) + throw new IllegalArgumentException("RotationMatrix constructor expects 3 lines"); + for ( int i=0 ; i<3 ; i++ ) + if ( mat[i].length != 3 ) + throw new IllegalArgumentException("RotationMatrix constructor expects 3 columns"); + this.mat = mat; + } + private static double[][] matOfVectors(Vector[] vecs) { + double[][] mat = new double[vecs.length][]; + for ( int i=0 ; i<mat.length ; i++ ) + mat[i] = vecs[i].crd; + return mat; + } + public RotationMatrix(Vector... vecs) { + this(matOfVectors(vecs)); + } + public Vector apply(double[] v) { + double out[] = new double[3]; + for ( int i=0 ; i<3 ; i++ ) + for ( int j=0 ; j<3 ; j++ ) + out[i] += v[j]*mat[j][i]; + return new Vector(out); + } + public Vector apply(Vector v) { + return apply(v.crd); + } + public RotationMatrix apply(RotationMatrix mv) { + return new RotationMatrix(this.apply(mv.mat[0]), this.apply(mv.mat[1]), this.apply(mv.mat[2])); + } + public static RotationMatrix rotx(double theta) { + return new RotationMatrix(new Vector(1, 0, 0), + new Vector(0, Math.cos(theta), -Math.sin(theta)), + new Vector(0, Math.sin(theta), Math.cos(theta))); + } + public static RotationMatrix roty(double theta) { + return new RotationMatrix(new Vector(Math.cos(theta), 0, Math.sin(theta)), + new Vector(0, 1, 0), + new Vector(-Math.sin(theta), 0, Math.cos(theta))); + } + public static RotationMatrix rotz(double theta) { + return new RotationMatrix(new Vector(Math.cos(theta), -Math.sin(theta), 0), + new Vector(Math.sin(theta), Math.cos(theta), 0), + new Vector(0, 0, 1)); + } + } + +} |