public static CameraParameters InterpolateGreatCircle(CameraParameters from, CameraParameters to, double alphaIn, InterpolationType type) { CameraParameters result = new CameraParameters(); double alpha = EaseCurve(alphaIn, type); double alphaBIn = Math.Min(1.0, alphaIn * 2); double alphaB = EaseCurve(alphaBIn, type); result.Angle = to.Angle * alpha + from.Angle * (1.0 - alpha); result.Rotation = to.Rotation * alpha + from.Rotation * (1.0 - alpha); Vector3d left = Coordinates.GeoTo3dDouble(from.Lat, from.Lng); Vector3d right = Coordinates.GeoTo3dDouble(to.Lat, to.Lng); Vector3d mid = Vector3d.Slerp(left, right, alpha); Vector2d midV2 = Coordinates.CartesianToLatLng(mid); result.Lat = midV2.Y; result.Lng = midV2.X; result.Zoom = Math.Pow(2, Math.Log(to.Zoom, 2) * alpha + Math.Log(from.Zoom, 2) * (1.0 - alpha)); result.Opacity = (float)(to.Opacity * alpha + from.Opacity * (1.0 - alpha)); result.ViewTarget = Vector3d.Lerp(from.ViewTarget, to.ViewTarget, alpha); result.DomeAlt = to.DomeAlt * alpha + from.DomeAlt * (1.0 - alpha); result.DomeAz = to.DomeAz * alpha + from.DomeAz * (1.0 - alpha); result.TargetReferenceFrame = to.TargetReferenceFrame; if (to.Target == from.Target) { result.Target = to.Target; } else { result.Target = SolarSystemObjects.Custom; } return(result); }
private void GoToRADec_Click(object sender, EventArgs e) { int index = coordinateType.SelectedIndex; double ra = 0; double dec = 0; bool raValid = false; bool decValid = false; switch (index) { case 0: // Equitorial { ra = Coordinates.ParseRA(raText.Text, false); dec = Coordinates.ParseDec(decText.Text); raValid = Coordinates.ValidateRA(raText.Text); decValid = Coordinates.ValidateDec(decText.Text); } break; case 2: // Galactic { double l = Coordinates.Parse(raText.Text); double b = Coordinates.ParseDec(decText.Text); raValid = Coordinates.Validate(raText.Text); decValid = Coordinates.ValidateDec(decText.Text); if (raValid && decValid) { double[] result = Earth3d.GalactictoJ2000(l, b); ra = result[0] / 15; dec = result[1]; } } break; case 3: // Ecliptic { double l = Coordinates.Parse(raText.Text); double b = Coordinates.ParseDec(decText.Text); raValid = Coordinates.Validate(raText.Text); decValid = Coordinates.ValidateDec(decText.Text); if (raValid && decValid) { AstroCalc.AstroRaDec radec = AstroCalc.AstroCalc.EclipticToJ2000(l, b, SpaceTimeController.JNow); ra = radec.RA; dec = radec.Dec; } } break; case 4: // Geo { ra = -Coordinates.Parse(raText.Text) / 15; dec = Coordinates.ParseDec(decText.Text); raValid = Coordinates.Validate(raText.Text); decValid = Coordinates.ValidateDec(decText.Text); } break; case 1: // alt/az { double az = Coordinates.Parse(raText.Text); double alt = Coordinates.ParseDec(decText.Text); raValid = Coordinates.Validate(raText.Text); decValid = Coordinates.ValidateDec(decText.Text); Coordinates radec = Coordinates.HorizonToEquitorial(Coordinates.FromLatLng(alt, az), SpaceTimeController.Location, SpaceTimeController.Now); ra = radec.RA; dec = radec.Dec; } break; } if (raValid && decValid) { if (Earth3d.MainWindow.SolarSystemMode) { Vector3d pnt = Coordinates.GeoTo3dDouble(dec, Coordinates.Parse(raText.Text)); pnt = Vector3d.TransformCoordinate(pnt, Planets.EarthMatrix); pnt.Normalize(); Vector2d radec = Coordinates.CartesianToLatLng(pnt); Earth3d.MainWindow.TargetLat = radec.Y; Earth3d.MainWindow.TargetLong = radec.X - 90; } else { Earth3d.MainWindow.GotoTargetRADec(ra, dec, true, false); } } }