public static AgcTuple nodeVector(double inc, string direction) { var b = Math.Tan(90 - inc) * Math.Tan(Globals.KrpConnection.SpaceCenter().ActiveVessel.Flight().Latitude); b = Math.Asin(Math.Min(Math.Max(-1, b), 1)); var yVec = new AgcTuple(0, 1, 0); var longitudeVector = AgcMath.map( yVec, AgcMath.normalize(Globals.KrpConnection.SpaceCenter().ActiveVessel.Orbit.Body.Position( Globals.KrpConnection.SpaceCenter().ActiveVessel.ReferenceFrame )) ); switch (direction) { case "north": return(rodrigues(longitudeVector, yVec, b)); case "south": return(rodrigues(longitudeVector, yVec, 180 - b)); default: return(nodeVector(inc, "north")); } }
public static AgcTuple rodrigues(AgcTuple inVector, AgcTuple axis, double angle) { axis = AgcMath.normalize(axis); var outVector = inVector * Math.Cos(angle); outVector += AgcMath.cross(axis, inVector) * Math.Sin(angle); outVector += axis * AgcMath.dot(axis, inVector) * (1 - Math.Cos(angle)); return(outVector); }
public static AgcTuple solarPrimeVector(ReferenceFrame referenceFrame) { var sun = Globals.KrpConnection.SpaceCenter().Bodies["Sun"]; var secondsPerDegree = sun.RotationalPeriod / 360; var rotationOffset = (Globals.KrpConnection.SpaceCenter().UT / secondsPerDegree) % 360; AgcTuple sunPosition = sun.Position(referenceFrame); AgcTuple sunPosition2 = sun.SurfacePosition(0, 0 - rotationOffset, referenceFrame); var primeVector = sunPosition2 - sunPosition; return(AgcMath.normalize(primeVector)); }