Ejemplo n.º 1
0
        void ShowRouts()
        {
            List <PointLatLng> mPointsList1 = new List <PointLatLng>();

            mPointsList1 = new List <PointLatLng>();
            //mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, CMBaseGeoPoint.ShowDegreeFraction(61, 02, 18), 14010).Coordinates);
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 17512.5));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 14010));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 10507.5));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 7005));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 3502.5));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 1701.25));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, 800.75));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 800.75));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 1701.25));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 3502.5));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 7005));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 10507.5));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 14010));
            mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, 17512.5));
            //mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, CMBaseGeoPoint.ShowDegreeFraction(61, 1, 30), 14010).Coordinates);
            //mPointsList1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, CMBaseGeoPoint.ShowDegreeFraction(241, 02, 18), 14010).Coordinates);

            //ShowPolygonPoints(mPointsList1);

            polyOverlay.Routes.Add(new GMapRoute(mPointsList1, "2"));

            mPointsList1 = new List <PointLatLng>();
            mPointsList1.Add(APInf.CRW.RunwayBegin.Coordinates);
            mPointsList1.Add(APInf.CRW.RunwayEnd.Coordinates);
            polyOverlay.Routes.Add(new GMapRoute(mPointsList1, "4"));
        }
Ejemplo n.º 2
0
 void FillPointSpec(CMCheckedGeoPoint point)
 {
     point.Angle    = Math.Round(CMGeoBase.GetAsimut(APInf.KTA, point, 0), 2);
     point.Distance = Math.Round(CMGeoBase.GetDistance(APInf.KTA, point), 2);
     point.HeightAboveRunwayBegin = point.Height - APInf.CRW.RunwayBegin.Height;
     point.Offset = OffsetRunwayBegin(point);
 }
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input, double X)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Поверхность прерванной посадки";
            CheckedResult.PointHeight = Input.Height;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                PointLatLng temp = CMGeoBase.OtstupVPP(Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates);

                GeoCoordinate sCoord = new GeoCoordinate(temp.Lat, temp.Lng);
                GeoCoordinate eCoord = new GeoCoordinate(Input.Lat, Input.Lng);
                double        length = sCoord.GetDistanceTo(eCoord);
                double        angle  = CMGeoBase.Azimut(temp, Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayEnd.Coordinates);

                length *= Math.Cos(Math.Abs(angle) * CMGeoBase.DegToRad);
                CheckedResult.SurfaceHeight = HeightAngle * (Math.Abs(X) - 1800) + APInf.AirfieldHeight;

                if (CheckedResult.SurfaceHeight <= Input.Height)
                {
                    CheckedResult.IsObstacle = true;
                    CheckedResult.Exceeding  = Input.Height - CheckedResult.SurfaceHeight;
                }

                CheckedResult.ResultText = string.Format("Попадает в область прерванной посадки и {0} превышает допустимую высоту{1}", (CheckedResult.IsObstacle == true ? "" : " не "), (CheckedResult.IsObstacle == true ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));
            }
            else
            {
                Visible = false;
            }
            return(CheckedResult);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Проверка конической поверхности
        /// </summary>
        /// <param name="Input"></param>
        public CMCGPCheckedResult CheckConeSurface__(CMCheckedGeoPoint Input, CMAPSurfaceA SurfaceA)
        {
            double distance   = CMGeoBase.GetDistance(Input, CMGeoBase.GetZone(Input, Radius, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd), APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd);
            double height     = HeigthPlaneB(distance, SurfaceA);
            bool   IsObstacle = false;
            double dif        = 0;

            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Коническая поверхность";

            ////если попал, считаем высоту
            height += APInf.AirfieldHeight;

            if (distance <= Radius)
            {
                if (distance > SurfaceA.Radius)
                {
                    if (height <= Input.Height)
                    {
                        IsObstacle = true;
                        dif        = Input.Height - height;
                    }
                    CheckedResult.ResultText = string.Format("Попадает в коническую поверхность и {0} превышает допустимую высоту {1} ", ((IsObstacle == true) ? "" : "не"), ((IsObstacle == true) ? (string.Format(" на {0} / {1}", Math.Round((Input.Height - height), 2), Math.Round(height, 2))) : ""));
                }
            }
            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;
            return(CheckedResult);
        }
Ejemplo n.º 5
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input, CMAPSurfaceB SurfaceB)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Горизонтальная поверхность";
            bool   IsObstacle = false;
            double dif        = 0;
            double height     = Height + APInf.AirfieldHeight;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                if (height <= Input.Height)
                {
                    IsObstacle = true;
                    dif        = Input.Height - height;
                }

                CheckedResult.ResultText = string.Format("Попадает во внутреннюю горизонтальную поверхность и {0} превышает допустимую высоту{1}", (IsObstacle == true ? "" : " не "), (IsObstacle == true ? string.Format(" на {0} / {1}", dif, height) : ""));
            }

            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;

            return(CheckedResult);
        }
Ejemplo n.º 6
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input, CMBAPSurfaceNoise APSurfaceNoiseInner)
        {
            double height     = 100;
            bool   IsObstacle = false;
            double dif        = 0;

            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = SurfaceName;//string.Format("Поверхность R-{0}", Radius);
            height += APInf.AirfieldHeight;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                if (CMGeoBase.IsPointInPolygon(APSurfaceNoiseInner.PointsList, Input.Coordinates) == false)
                {
                    CheckedResult.ResultText = string.Format("Попадает в {0}", SurfaceName);
                }
            }

            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;
            return(CheckedResult);
        }
Ejemplo n.º 7
0
        public void LoadPointsList()//CMAirPortInfo APInf)
        {
            mPointsList.Clear();

            PointLatLng _n = CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, -Offset);

            //mPointsList.Add(_n);
            mPointsList.Add(CMGeoBase.GetCoordinate(_n, APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(_n, APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2));

            PointLatLng _m1 = CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, (Offset + Length1) * -1);

            mPointsList.Add(CMGeoBase.GetCoordinate(_m1, APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2 + WidthAngle * (Length1)));

            PointLatLng _m2 = CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, (Offset + Length1 + Length2) * -1);

            mPointsList.Add(CMGeoBase.GetCoordinate(_m2, APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2 + WidthAngle * (Length1 + Length2)));

            PointLatLng _m3 = CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, (Offset + Length1 + Length2 + Length3) * -1);

            mPointsList.Add(CMGeoBase.GetCoordinate(_m3, APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2 + WidthAngle * (Length1 + Length2 + Length3)));

            mPointsList.Add(CMGeoBase.GetCoordinate(_m3, APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2 + WidthAngle * (Length1 + Length2 + Length3)));
            mPointsList.Add(CMGeoBase.GetCoordinate(_m2, APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2 + WidthAngle * (Length1 + Length2)));
            mPointsList.Add(CMGeoBase.GetCoordinate(_m1, APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2 + WidthAngle * (Length1)));
        }
Ejemplo n.º 8
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = SurfaceName;//"Поверхность взлета";
            CheckedResult.PointHeight = Input.Height;

            if (CMGeoBase.IsPointInPolygon(PointsList, Input.Coordinates))
            {
                Visible = true;

                double Angle   = Math.Abs(CMGeoBase.Azimut(APInf.CRW.RunwayEnd.Coordinates, Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayEnd.Coordinates));
                double _length = CMGeoBase.GetDistance(Input.Coordinates, APInf.CRW.RunwayEnd.Coordinates) * Math.Cos(Angle * CMGeoBase.DegToRad);
                CheckedResult.SurfaceHeight = _length * HeightAngle;

                CheckedResult.SurfaceHeight += APInf.CRW.RunwayBegin.Height;

                if (CheckedResult.SurfaceHeight <= Input.Height)
                {
                    CheckedResult.IsObstacle = true;
                    CheckedResult.Exceeding  = Input.Height - CheckedResult.SurfaceHeight;
                }
                CheckedResult.ResultText = string.Format("Попадает в {0} и {1} превышает допустимую высоту{2}", SurfaceName, (CheckedResult.IsObstacle == true ? "" : " не "), (CheckedResult.IsObstacle == true ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));
            }
            else
            {
                Visible = false;
            }

            return(CheckedResult);
        }
Ejemplo n.º 9
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input, CMAPSurfaceB SurfaceB)
        {
            double height     = Height + APInf.AirfieldHeight;
            bool   IsObstacle = false;
            double dif        = 0;

            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = SurfaceName;


            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                if (CMGeoBase.IsPointInPolygon(SurfaceB.PointsList, Input.Coordinates) == false)
                {
                    CheckedResult.ResultText = string.Format("Попадает в {0}", SurfaceName);
                    if (Height > 0)
                    {
                        if (height <= Input.Height)
                        {
                            IsObstacle = true;
                            dif        = Input.Height - height;
                        }
                        CheckedResult.ResultText += string.Format(" и {0} превышает допустимую высоту {1} ", ((IsObstacle == true) ? "" : "не"), ((IsObstacle == true) ? (string.Format(" на {0} / {1}", Math.Round((Input.Height - height), 2), Math.Round(height, 2))) : ""));
                    }
                }
            }

            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;
            return(CheckedResult);
        }
Ejemplo n.º 10
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Переходная поверхность";
            CheckedResult.PointHeight = Input.Height;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates) || CMGeoBase.IsPointInPolygon(mPointsList2, Input.Coordinates))
            {
                CheckedResult.SurfaceHeight = HeightAngle * (Math.Abs(Input.Offset.Lng) - 150) + APInf.AirfieldHeight;

                if (CheckedResult.SurfaceHeight <= Input.Height)
                {
                    CheckedResult.IsObstacle = true;
                    CheckedResult.Exceeding  = Input.Height - CheckedResult.SurfaceHeight;
                }
                CheckedResult.ResultText = string.Format("Попадание в переходную плоскость и {0} превышает допустимую высоту{1}", (CheckedResult.IsObstacle == true ? "" : " не "), (CheckedResult.IsObstacle == true ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));
            }
            else
            {
                Visible = false;
            }

            return(CheckedResult);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Проверка конической поверхности
        /// </summary>
        /// <param name="Input"></param>
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input, CMAPSurfaceC SurfaceC)
        {
            double height     = 100;
            bool   IsObstacle = false;
            double dif        = 0;

            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Граница района аэродрома";
            height += APInf.AirfieldHeight;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                if (CMGeoBase.IsPointInPolygon(SurfaceC.PointsList, Input.Coordinates) == false)
                {
                    CheckedResult.ResultText = "Попадает в границы района аэродрома";
                }
            }

            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;
            return(CheckedResult);
        }
Ejemplo n.º 12
0
        void DrawEllipse_()
        {
            double a    = 5947.81;
            double b    = 726.22;
            double cx   = 0;
            double cy   = 0;
            double Ugol = 60;
            double X    = 0;
            double Y    = 0;

            List <PointF>      PFlist      = new List <PointF>();
            List <PointLatLng> mPointsList = new List <PointLatLng>();

            for (int fi = 0; fi < 360; fi += 5)//шаг формирования точек 5 градусов
            {
                //PointF p = new PointF();
                X = a * (float)Math.Cos(fi * CMGeoBase.DegToRad);
                Y = b * (float)Math.Sin(fi * CMGeoBase.DegToRad);

                double tempX = X;
                double tempY = Y;
                X = cx + tempX * Math.Cos(-Ugol * CMGeoBase.DegToRad) + tempY * Math.Sin(-Ugol * CMGeoBase.DegToRad);
                Y = cy - (tempX * (-Math.Sin(-Ugol * CMGeoBase.DegToRad)) + tempY * Math.Cos(-Ugol * CMGeoBase.DegToRad));

                PFlist.Add(new PointF((float)(X), (float)(Y)));
                mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, fi, (Math.Sqrt(Math.Pow(X, 2) + Math.Pow(Y, 2)))).Coordinates);
            }

            ShowPolygonPoints(mPointsList);
        }
Ejemplo n.º 13
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Полоса воздушных подходов";
            bool   IsObstacle = false;
            bool   Forward    = false;
            double dif        = 0;

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                IsObstacle = true;
                Forward    = true;
            }

            if (CMGeoBase.IsPointInPolygon(mPointsList2, Input.Coordinates))
            {
                IsObstacle = true;
                Forward    = false;
            }

            if (IsObstacle)
            {
                CheckedResult.ResultText = string.Format("Попадает в {0}полосу воздушных подходов", (Forward == true ? "" : " обратную "));
            }

            CheckedResult.PointHeight = Input.Height;
            CheckedResult.Exceeding   = dif;
            return(CheckedResult);
        }
Ejemplo n.º 14
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Внутренняя поверхность захода на посадку";
            CheckedResult.PointHeight = Input.Height;


            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates))
            {
                double length = CMGeoBase.GetDistance(Input.Coordinates, APInf.CRW.RunwayBegin.Coordinates) - Offset;
                double angle  = Math.Abs(CMGeoBase.Azimut(CMGeoBase.OtstupVPP(Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates), Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayBegin.Coordinates));
                length *= Math.Cos(angle * CMGeoBase.DegToRad);
                CheckedResult.SurfaceHeight = length * HeightAngle;
                //
                CheckedResult.SurfaceHeight += APInf.CRW.RunwayBegin.Height;
                //
                //TextResult.Text += CheckedResult.SurfaceHeight <= Input.Height ? "Попадает во внутренюю поверхность захода на посадку и превышает высоту на :" + (Input.Height - height).ToString() + " / " + height.ToString() + Environment.NewLine : " Попадает во внутренюю поверхность захода на посадку и не превышает высоту" + Environment.NewLine;

                if (CheckedResult.SurfaceHeight <= Input.Height)
                {
                    CheckedResult.IsObstacle = true;
                    CheckedResult.Exceeding  = Input.Height - CheckedResult.SurfaceHeight;
                }
                CheckedResult.ResultText = string.Format("Попадает во внутренюю поверхность захода на посадку и {0} превышает высоту{1}", (CheckedResult.IsObstacle ? "" : " не "), (CheckedResult.IsObstacle ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));
            }
            else
            {
                Visible = false;
            }


            return(CheckedResult);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Проверка на вхождение точки во внутреннюю горизонтальную поверхность
        /// </summary>
        /// <param name="Input">Проверяемая точка</param>
        public CMCGPCheckedResult CheckHorizSurface___(CMCheckedGeoPoint Input, CMAPSurfaceB SurfaceB)
        {
            double distance = CMGeoBase.GetDistance(Input, CMGeoBase.GetZone(Input, SurfaceB.Radius, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd), APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd);

            double height = Height + APInf.AirfieldHeight; //HeightA + APInf.AirfieldHeight; //абсолютная высота внутренней горизонтальной поверхности

            bool   IsObstacle = false;
            double dif        = 0;

            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Горизонтальная поверхность";

            if (distance <= Radius)
            {
                if (height <= Input.Height)
                {
                    IsObstacle = true;
                    dif        = Input.Height - height;
                }

                CheckedResult.ResultText = string.Format("Попадает во внутреннюю горизонтальную поверхность и {0} превышает допустимую высоту{1}", (IsObstacle == true ? "" : " не "), (IsObstacle == true ? string.Format(" на {0} / {1}", dif, height) : ""));
            }


            CheckedResult.IsObstacle    = IsObstacle;
            CheckedResult.PointHeight   = Input.Height;
            CheckedResult.SurfaceHeight = height;
            CheckedResult.Exceeding     = dif;

            return(CheckedResult);
        }
Ejemplo n.º 16
0
 void CalcGeoPoint()
 {
     if (mCheckedGeoPoint != null)
     {
         CheckedGeoPoint.Coordinates = CMGeoBase.GetCoordinate(mAPInf.KTA.Coordinates, (double)nudAzimut.Value, (double)nudDistance.Value);
         LoadData1();
     }
 }
Ejemplo n.º 17
0
 public void LoadPointsListO()
 {
     mPointsList.Clear();
     for (int i = 0; i < 360; i++)
     {
         mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, i, Radius).Coordinates);
     }
 }
 public void LoadPointsList_()//CMAirPortInfo APInf)
 {
     mPointsList.Clear();
     //красная трапеция рядом с зеленой
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 1, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + Height / HeightAngle * WidthAngle, 1, CMGeoBase.OtstupVPP(Offset + Height / HeightAngle, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + Height / HeightAngle * WidthAngle, 3, CMGeoBase.OtstupVPP(Offset + Height / HeightAngle, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 3, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
 }
Ejemplo n.º 19
0
        public void LoadPointsList_()
        {
            mPointsList.Clear();

            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 1, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 3, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 3, CMGeoBase.OtstupVPP(Offset + Length, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 1, CMGeoBase.OtstupVPP(Offset + Length, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
        }
Ejemplo n.º 20
0
        public void LoadPointsList()
        {
            mPointsList.Clear();

            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, -Offset), APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, -Offset), APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, -(Offset + Length)), APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, -(Offset + Length)), APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2));
        }
 public void LoadPointsList()//CMAirPortInfo APInf)
 {
     mPointsList.Clear();
     //красная трапеция рядом с зеленой
     mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, Offset), APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2));
     mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, Offset + Height / HeightAngle), APInf.CRW.RunwayBegin.TrueCourse + 90, Width / 2 + Height / HeightAngle * WidthAngle));
     mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, Offset + Height / HeightAngle), APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2 + Height / HeightAngle * WidthAngle));
     mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.TrueCourse, Offset), APInf.CRW.RunwayBegin.TrueCourse - 90, Width / 2));
 }
Ejemplo n.º 22
0
 public void LoadPointsList_(CMInnerApproachSurfaceData InnerApproachSurface, CMCancelledApproachSurfaceData CancelledApproachSurface)
 {
     mPointsList.Clear();
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + 42 / HeightAngle, 1, CMGeoBase.OtstupVPP(InnerApproachSurface.Offset + InnerApproachSurface.Length, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));                                     //1
     mPointsList.Add(CMGeoBase.OtstupVPP(Height / HeightAngle + Width / 2, 1, CMGeoBase.OtstupVPP(InnerApproachSurface.Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));                                                               //2
     mPointsList.Add(CMGeoBase.OtstupVPP(Height / HeightAngle + Width / 2, 1, CMGeoBase.OtstupVPP(CancelledApproachSurface.Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));                                                              //3
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + CancelledApproachSurface.Height / CancelledApproachSurface.HeightAngle * CancelledApproachSurface.WidthAngle, 1, CMGeoBase.OtstupVPP(3600, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse())); //4
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + CancelledApproachSurface.Height / CancelledApproachSurface.HeightAngle * CancelledApproachSurface.WidthAngle, 3, CMGeoBase.OtstupVPP(3600, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Height / HeightAngle + Width / 2, 3, CMGeoBase.OtstupVPP(CancelledApproachSurface.Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Height / HeightAngle + Width / 2, 3, CMGeoBase.OtstupVPP(InnerApproachSurface.Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
     mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + 42 / HeightAngle, 3, CMGeoBase.OtstupVPP(InnerApproachSurface.Offset + InnerApproachSurface.Length, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
 }
Ejemplo n.º 23
0
        public void LoadPointsList()
        {
            mPointsList.Clear();
            mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, APInf.CRW.RunwayThreshold1.TrueCourse + 180 + AzimutP, Radius).Coordinates);
            mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, APInf.CRW.RunwayThreshold1.TrueCourse - AzimutP, Radius).Coordinates);


            for (int i = (int)Math.Round(APInf.CRW.RunwayThreshold1.TrueCourse - AzimutP) + 1; i < (int)Math.Round(APInf.CRW.RunwayThreshold1.TrueCourse + 180 + AzimutP); i++)
            {
                mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, i, Radius).Coordinates);
            }
        }
Ejemplo n.º 24
0
        public void LoadPointsList_()//CMAirPortInfo APInf)
        {
            mPointsList.Clear();

            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 1, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2, 3, CMGeoBase.OtstupVPP(Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1), 3, CMGeoBase.OtstupVPP((Offset + Length1), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1 + Length2), 3, CMGeoBase.OtstupVPP((Offset + Length1 + Length2), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1 + Length2 + Length3), 3, CMGeoBase.OtstupVPP((Offset + Length1 + Length2 + Length3), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1 + Length2 + Length3), 1, CMGeoBase.OtstupVPP((Offset + Length1 + Length2 + Length3), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1 + Length2), 1, CMGeoBase.OtstupVPP((Offset + Length1 + Length2), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
            mPointsList.Add(CMGeoBase.OtstupVPP(Width / 2 + WidthAngle * (Length1), 1, CMGeoBase.OtstupVPP((Offset + Length1), APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.GetCalcTrueCourse()), APInf.CRW.GetCalcTrueCourse()));
        }
Ejemplo n.º 25
0
        public void LoadPointsList()//CMAirPortInfo APInf)
        {
            //зеленая область
            PointLatLng RunwayEndWithOffset = CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.TrueCourse, -Offset);

            mPointsList.Clear();
            mPointsList.Add(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse - 90, Width1 / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse - 180, (Width2 - Width1) / 2 / WidthAngle), APInf.CRW.RunwayEnd.TrueCourse - 90, Width2 / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse - 180, Length2), APInf.CRW.RunwayEnd.TrueCourse - 90, Width2 / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse - 180, Length2), APInf.CRW.RunwayEnd.TrueCourse - 270, Width2 / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse - 180, (Width2 - Width1) / 2 / WidthAngle), APInf.CRW.RunwayEnd.TrueCourse - 270, Width2 / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(RunwayEndWithOffset, APInf.CRW.RunwayEnd.TrueCourse + 90, Width1 / 2));
        }
Ejemplo n.º 26
0
        public void LoadPointsList()
        {
            mPointsList.Clear();

            for (double fi = 0; fi < 360; fi += 1)
            {
                double distance   = Math.Sqrt(Math.Pow((RadiusA * Math.Cos((fi * CMGeoBase.DegToRad))), 2) + Math.Pow((RadiusB * Math.Sin((fi * CMGeoBase.DegToRad))), 2));
                double Fi4Ellipse = GetFi4Ellipse(fi, RadiusA, RadiusB);
                //TextResult.Text += string.Format("< {0} << {1} d {2}", fi, Fi4Ellipse, distance) + " \r\n"; ;

                mPointsList.Add(CMGeoBase.GetCoordinate(APInf.KTA, Fi4Ellipse, distance).Coordinates);
            }
        }
Ejemplo n.º 27
0
        public CMCGPCheckedResult CheckSurface(CMCheckedGeoPoint Input)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

            CheckedResult.SurfaceName = "Поверхность захода на посадку";
            CheckedResult.PointHeight = Input.Height;

            if (CMGeoBase.IsPointInPolygon(PointsList, Input.Coordinates))
            {
                Visible = true;

                double angle  = Math.Abs(CMGeoBase.Azimut(APInf.CRW.RunwayBegin.Coordinates, Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayBegin.Coordinates));
                double length = CMGeoBase.GetDistance(Input.Coordinates, APInf.CRW.RunwayBegin.Coordinates) * Math.Cos(angle * CMGeoBase.DegToRad);


                if (length <= Length1)
                {
                    CheckedResult.SurfaceHeight = (length - Offset) * HeightAngle1;
                }
                else
                if (length > Length1 && length <= (Length1 + Length2))
                {
                    CheckedResult.SurfaceHeight = (length - (Length1 + Offset)) * HeightAngle2 + Length1 * HeightAngle1;
                }
                else
                {
                    CheckedResult.SurfaceHeight = Length2 * HeightAngle2 + Length1 * HeightAngle1;
                }

                CheckedResult.SurfaceHeight += APInf.CRW.RunwayBegin.Height;;

                if (CheckedResult.SurfaceHeight <= Input.Height)
                {
                    CheckedResult.IsObstacle = true;
                    CheckedResult.Exceeding  = Input.Height - CheckedResult.SurfaceHeight;
                }
                //TextResult.Text += height <= DataStorage.Height ? "Попадает в область захода на посадку и превышает допустимую высоту на "
                //                     + (DataStorage.Height - height).ToString() + " / " + height.ToString() + Environment.NewLine : "Попадает в область захода на посадку и не превышает допустимую высоту" + Environment.NewLine;
                CheckedResult.ResultText = string.Format("Попадает в область захода на посадку и {0} превышает допустимую высоту{1}", (CheckedResult.IsObstacle == true ? "" : " не "), (CheckedResult.IsObstacle == true ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));

                //   CheckedResult.ResultText = string.Format("Попадает во внутреннюю горизонтальную поверхность и {0} превышает допустимую высоту{1}", (IsObstacle == true ? "" : " не "), (IsObstacle == true ? string.Format(" на {0} / {1}", dif, height) : ""));
            }
            else
            {
                Visible = false;
            }


            return(CheckedResult);
        }
Ejemplo n.º 28
0
        PointLatLng OffsetRunwayBegin(CMGeoPoint point)
        {
            PointLatLng v1 = CMGeoBase.Mercator(point.Coordinates);
            PointLatLng v2 = CMGeoBase.Mercator(RunwayBegin);

            double AzimutP1 = CMGeoBase.GetAsimut(APInf.CRW.RunwayBegin, point);
            double AzimutP2 = CMGeoBase.GetAsimut(APInf.CRW.RunwayEnd, APInf.CRW.RunwayBegin);

            double Angle = Math.Abs(AzimutP1 - APInf.CRW.RunwayBegin.BackTrueCourse);

            double K = 1;

            if (AzimutP2 >= 0 && AzimutP2 <= 180)
            {
                if (AzimutP1 >= AzimutP2 && AzimutP1 <= (AzimutP2 + 180))
                {
                    K = -1;
                }
                else
                {
                    K = 1;
                }
            }
            else
            {
                if (AzimutP1 <= AzimutP2 && AzimutP1 >= (AzimutP2 - 180))
                {
                    K = 1;
                }
                else
                {
                    K = -1;
                }
            }

            double Latitude   = 0; //(v1.Lat - v2.Lat) * Math.Cos(Angle * DegToRad);
            double Longtitude = 0; //(v1.Lng - v2.Lng) * Math.Cos(Angle * DegToRad);
            double distance   = CMGeoBase.GetDistance(APInf.CRW.RunwayBegin, point);

            double x = distance * Math.Cos(Angle * CMGeoBase.DegToRad);
            double y = Math.Abs((distance * Math.Sin(Angle * CMGeoBase.DegToRad))) * K;

            Latitude   = Math.Round(y, 2);
            Longtitude = Math.Round(x, 2);

            PointLatLng v3 = new PointLatLng(Longtitude, Latitude);

            return(v3);
        }
Ejemplo n.º 29
0
        public void LoadPointsList()
        {
            //зеленая область
            mPointsList.Clear();

            for (int i = 90; i >= -90; i--)
            {
                mPointsList.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse + i, Radius).Coordinates);
            }

            for (int i = 90; i >= -90; i--)
            {
                mPointsList.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse + i, Radius).Coordinates);
            }
        }
Ejemplo n.º 30
0
        public void LoadPointsList()//CMAirPortInfo APInf)
        {
            mPointsList.Clear();
            //красная трапеция рядом с зеленой
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, Offset), APInf.CRW.RunwayBegin.BackTrueCourse + 90, Width / 2));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, Offset + Length), APInf.CRW.RunwayBegin.BackTrueCourse + 90, (Width / 2) + WidthAngle * Length));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, Offset + Length), APInf.CRW.RunwayBegin.BackTrueCourse - 90, (Width / 2) + WidthAngle * Length));
            mPointsList.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayBegin.BackTrueCourse, Offset), APInf.CRW.RunwayBegin.BackTrueCourse - 90, Width / 2));


            mPointsList2.Clear();
            //красная трапеция рядом с зеленой
            mPointsList2.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, Offset), APInf.CRW.RunwayEnd.BackTrueCourse + 90, Width / 2));
            mPointsList2.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, Offset + Length), APInf.CRW.RunwayEnd.BackTrueCourse + 90, (Width / 2) + WidthAngle * Length));
            mPointsList2.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, Offset + Length), APInf.CRW.RunwayEnd.BackTrueCourse - 90, (Width / 2) + WidthAngle * Length));
            mPointsList2.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayEnd.BackTrueCourse, Offset), APInf.CRW.RunwayEnd.BackTrueCourse - 90, Width / 2));
        }