internal static Vector ConvertAxesToAltAzm(Vector axes) { Vector altAzm = axes; switch (TelescopeHardware.AlignmentMode) { case AlignmentMode.AltAz: break; case AlignmentMode.GermanPolar: if (axes.Y > 90) { axes.X += 180; axes.Y = 180 - axes.Y; } if (TelescopeHardware.Latitude < 0) { axes.Y = -axes.Y; } var ra = TelescopeHardware.SiderealTime - axes.X / 15.0; altAzm = AstronomyFunctions.CalculateAltAzm(ra, axes.Y, TelescopeHardware.Latitude); break; case AlignmentMode.Polar: ra = TelescopeHardware.SiderealTime - axes.X / 15.0; if (TelescopeHardware.Latitude < 0) { axes.Y = -axes.Y; } altAzm = AstronomyFunctions.CalculateAltAzm(ra, axes.Y, TelescopeHardware.Latitude); break; } return(RangeAltAzm(altAzm)); }
/// <summary> /// convert a RaDec position to an axes positions. /// </summary> /// <param name="raDec"></param> /// <param name="preserveSop">used for sync</param> /// <returns></returns> internal static Vector ConvertRaDecToAxes(Vector raDec, bool preserveSop = false) { Vector axes = new Vector(); switch (TelescopeHardware.AlignmentMode) { case AlignmentMode.AltAz: axes = AstronomyFunctions.CalculateAltAzm(raDec.X, raDec.Y, TelescopeHardware.Latitude); break; case AlignmentMode.GermanPolar: var sop = TelescopeHardware.SideOfPier; axes.X = (TelescopeHardware.SiderealTime - raDec.X) * 15.0; axes.Y = (TelescopeHardware.Latitude >= 0) ? raDec.Y : -raDec.Y; axes.X = RangeAzm(axes.X); if (axes.X > 180.0 || axes.X < 0) { // adjust the targets to be through the pole axes.X += 180; axes.Y = 180 - axes.Y; } var newsop = (axes.Y <= 90 && axes.Y >= -90) ? PointingState.Normal : PointingState.ThroughThePole; if (preserveSop && newsop != sop) { if (TelescopeHardware.NoSyncPastMeridian) { throw new InvalidOperationException("Sync is not allowed when the mount has tracked past the meridian"); } axes.X -= 180; axes.Y = 180 - axes.Y; } break; case AlignmentMode.Polar: axes.X = (TelescopeHardware.SiderealTime - raDec.X) * 15.0; axes.Y = (TelescopeHardware.Latitude >= 0) ? raDec.Y : -raDec.Y; break; } return(RangeAxes(axes)); }