public static Tuple <double, double, double> RangeAzimuthUp(Battery battery, MissionSpec mission) { double range = 0; double azimuth = 0; double up = 0; range = Coordinate.range(battery.Coords, mission.AdjustedCoords); azimuth = Coordinate.azimuth(battery.Coords, mission.AdjustedCoords); up = mission.AdjustedCoords.Altitude - battery.Coords.Altitude; return(new Tuple <double, double, double>(range, azimuth, up)); }
public void CopyTo(MissionSpec mission) { mission.adjustAdd = this.adjustAdd; mission.adjustment = this.adjustment; mission.adjustOTDir = this.adjustOTDir; mission.pieces = this.pieces; mission.adjustRight = this.adjustRight; mission.adjustRounds = this.adjustRounds; mission.adjustUp = this.adjustUp; mission.ammunition = this.ammunition; mission.attitude = this.attitude; mission.dangerClose = this.dangerClose; mission.fuzeTime = this.fuzeTime; mission.length = this.length; mission.notes = this.notes; mission.radius = this.radius; mission.rounds = this.rounds; mission.roundsLeft = this.roundsLeft; mission.targetDescription = this.targetDescription; mission.targetNumber = this.targetNumber; }
public static List <FireSolution> CalcFire(Battery battery, MissionSpec mission) { var res = new List <FireSolution>(); var munition = mission.Ammunition; if (munition == null) { return(res); } var rangedata = RangeAzimuthUp(battery, mission); System.Console.WriteLine(rangedata); var range = rangedata.Item1; var azimuth = rangedata.Item2; var up = rangedata.Item3; var deflection = (Math.PI + (azimuth - battery.Dir.RadiansValue)); if (deflection < 0) { deflection = deflection + (2 * Math.PI); } if (deflection > 2 * Math.PI) { deflection = deflection - (2 * Math.PI); } MilAngle m = new MilAngle(); m.RadiansValue = deflection; var rangeArr = new float[] { (float)rangedata.Item1 }; foreach (var rt in munition.Rangetables) { var min = rt.Table.Min(rw => rw.Range); var max = rt.Table.Max(rw => rw.Range); if (min > rangedata.Item1 || max < rangedata.Item1) { res.Add( new FireSolution() { Charge = rt.Charge, Elevation = (min > rangedata.Item1) ? -1 : -2 //-1 = under min range, -2 = over max range } ); continue; } var elev = rt.ElevSpline.Eval(rangeArr); var time = rt.TimeSpline.Eval(rangeArr); //TODO: adjust for height diff var elevAdjust = rt.ElevAdjustSpline.Eval(rangeArr); var timeAdjust = rt.TimeAdjustSpline.Eval(rangeArr); //adjust is per -100 dAlt var elevAdjustVal = elevAdjust[0] * up / -100.0; var timeAdjustVal = timeAdjust[0] * up / -100.0; res.Add(new FireSolution() { Charge = rt.Charge, Deflection = m.InternalValue, Elevation = elev[0] + elevAdjustVal, Time = (int)(time[0] + timeAdjustVal) } ); } return(res); }