예제 #1
0
        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));
        }
예제 #2
0
 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;
 }
예제 #3
0
        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);
        }