Beispiel #1
0
        public override void Process()
        {
            base.Process();

            // parse and resolve pilot dependent values
            // the static values are already defined
            // syntax is already checked
            if (A.Point == null)
            {
                Result = Task.NewNoResult(A.GetFirstNoteText());
            }
            else if (B.Point == null)
            {
                Result = Task.NewNoResult(B.GetFirstNoteText());
                Result.UsedPoints.Add(A.Point);
            }
            else
            {
                switch (Definition.ObjectType)
                {
                case "D2D":
                    //D2D: distance in 2D
                    //D2D(<pointNameA>, <pointNameB> [,<bestPerformance>])
                {
                    var distance = Physics.Distance2D(A.Point, B.Point);
                    if (distance < bestPerformance)
                    {
                        AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true);
                        distance = bestPerformance;
                    }
                    Result = Task.NewResult(Math.Round(distance, 0));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;

                case "D3D":
                    //D3D: distance in 3D
                    //D3D(<pointNameA>, <pointNameB> [,<bestPerformance>])
                {
                    var distance = Physics.Distance3D(A.Point, B.Point);
                    if (distance < bestPerformance)
                    {
                        AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true);
                        distance = bestPerformance;
                    }
                    Result = Task.NewResult(Math.Round(distance, 0));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;

                case "DRAD":
                    //DRAD: relative altitude dependent distance
                    //DRAD(<pointNameA>, <pointNameB>, <threshold> [,<bestPerformance>])
                {
                    var distance = 0.0;
                    var vDist    = Math.Abs(A.Point.Altitude - B.Point.Altitude);
                    if (vDist <= altitudeThreshold)
                    {
                        distance = Physics.Distance2D(A.Point, B.Point);
                        AddNote("measuring 2D distance", true);
                    }
                    else
                    {
                        distance = Physics.Distance3D(A.Point, B.Point);
                        AddNote("measuring 3D distance", true);
                    }

                    if (distance < bestPerformance)
                    {
                        AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true);
                        distance = bestPerformance;
                    }
                    Result = Task.NewResult(Math.Round(distance, 0));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;

                case "DRAD10":
                    //DRAD10: relative altitude dependent distance rounded down to decameter
                    //DRAD10(<pointNameA>, <pointNameB>, <threshold> [,<bestPerformance>])
                {
                    var distance = 0.0;
                    var vDist    = Math.Abs(A.Point.Altitude - B.Point.Altitude);
                    if (vDist <= altitudeThreshold)
                    {
                        distance = Physics.Distance2D(A.Point, B.Point);
                        AddNote("measuring 2D distance", true);
                    }
                    else
                    {
                        distance = Physics.Distance3D(A.Point, B.Point);
                        AddNote("using 3D distance", true);
                    }

                    if (distance < bestPerformance)
                    {
                        AddNote(string.Format("forcing performance ({0:0.00}) to be MMA max ({1})", distance, bestPerformance), true);
                        distance = bestPerformance;
                    }
                    Result = Task.NewResult(Math.Floor(distance / 10) * 10);
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;

                case "DACC":
                    //DACC: accumulated distance
                    //DACC(<pointNameA>, <pointNameB>)
                {
                    var track = Engine.TaskValidTrack.Filter(p => p.Time >= A.Point.Time && p.Time <= B.Point.Time);
                    Result           = Task.NewResult(Math.Round(track.Distance2D(), 0));
                    Result.UsedTrack = track;
                }
                break;

                case "TSEC":
                    //TSEC: time in seconds
                    //TSEC(<pointNameA>, <pointNameB>)
                    Result = Task.NewResult(Math.Abs(Math.Round((B.Point.Time - A.Point.Time).TotalSeconds, 0)));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                    break;

                case "TMIN":
                    //TMIN: time in minutes
                    //TMIN(<pointNameA>, <pointNameB>)
                    Result = Task.NewResult(Math.Round((B.Point.Time - A.Point.Time).TotalMinutes, 2));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                    break;

                case "ATRI":
                    //ATRI: area of triangle
                    //ATRI(<pointNameA>, <pointNameB>, <pointNameC>)
                    if (C.Point == null)
                    {
                        Result = Task.NewNoResult(C.GetFirstNoteText());
                        Result.UsedPoints.Add(A.Point);
                        Result.UsedPoints.Add(B.Point);
                    }
                    else
                    {
                        Result = Task.NewResult(Math.Round(Physics.Area(A.Point, B.Point, C.Point) / 1e6, 2));
                        Result.UsedPoints.Add(A.Point);
                        Result.UsedPoints.Add(B.Point);
                        Result.UsedPoints.Add(C.Point);
                    }
                    break;

                case "ANG3P":
                    //ANG3P: angle between 3 points
                    //ANG3P(<pointNameA>, <pointNameB>, <pointNameC>)
                    if (C.Point == null)
                    {
                        Result = Task.NewNoResult(C.GetFirstNoteText());
                        Result.UsedPoints.Add(A.Point);
                        Result.UsedPoints.Add(B.Point);
                    }
                    else
                    {
                        var nab = Physics.Direction2D(A.Point, B.Point);     //north-A-B
                        var nbc = Physics.Direction2D(B.Point, C.Point);     //north-B-C
                        var ang = Physics.Substract(nab, nbc);

                        Result = Task.NewResult(Math.Round(Math.Abs(ang), 2));
                        Result.UsedPoints.Add(A.Point);
                        Result.UsedPoints.Add(B.Point);
                        Result.UsedPoints.Add(C.Point);
                    }
                    break;

                case "ANGN":
                    //ANGN: angle to the north
                    //ANGN(<pointNameA>, <pointNameB>)
                {
                    var ang = Physics.Substract(Physics.Direction2D(A.Point, B.Point), 0);

                    Result = Task.NewResult(Math.Round(Math.Abs(ang), 2));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;

                case "ANGSD":
                    //ANGSD: angle to a set direction
                    //ANGSD(<pointNameA>, <pointNameB>, <setDirection>)
                {
                    var ang = Physics.Substract(Physics.Direction2D(A.Point, B.Point), setDirection);

                    Result = Task.NewResult(Math.Round(Math.Abs(ang), 2));
                    Result.UsedPoints.Add(A.Point);
                    Result.UsedPoints.Add(B.Point);
                }
                break;
                }
            }

            if (Result == null)
            {
                Result = Task.NewNoResult("this should never happen");
            }

            AddNote("result is " + Result.ToString());
        }