Ejemplo n.º 1
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.º 2
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.º 3
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.º 4
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.º 5
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);
 }
Ejemplo n.º 6
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.º 7
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.º 8
0
        void testproc()
        {
            //показать на карте точки, которые образуют данный полигон


            //GetAsimut( APInf.CRW.RunwayEnd, APInf.CRW.RunwayBegin);
            //GetAsimut(APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd);


            //CMGeoPoint FinishPoint = CMGeoBase.GetCoordinate(new CMGeoPoint(enumGeoPointType.geoptControlDot, 43.389269, 132.130642, 9.87, "07R"), CMBaseGeoPoint.ShowDegreeFraction(61, 1, 30), 3502.54);

            ////CMGeoPoint FinishPoint = GetCoordinate(new CMGeoPoint(enumGeoPointType.geoptControlDot, 43.389269, 132.130642, 9.87, "07R"), CMBaseGeoPoint.ShowDegreeFraction(61, 1, 30), 3502.54);
            //////CMGeoPoint FinishPoint = GetCoordinate(new CMGeoPoint(enumGeoPointType.geoptControlDot, CMBaseGeoPoint.ShowDegreeFraction(42, 0, 10.5), CMBaseGeoPoint.ShowDegreeFraction(105, 47, 19.4567), 14.8, "КТА"), CMBaseGeoPoint.ShowDegreeFraction(48, 18, 03.4), 25258.87);
            //TextResult.Text  =  string.Format ("{0} --- {1}",CMBaseGeoPoint.ShowDegMiSec(FinishPoint.Coordinates.Lat),CMBaseGeoPoint.ShowDegMiSec(FinishPoint.Coordinates.Lng));

            //TextResult.Text  += string.Format("{0}",CMGeoBase.GetDistance(APInf.CRW.RunwayBegin,APInf.CRW.RunwayEnd));

            TextResult.Text += string.Format("Начало ВПП {0}  {1}", CMBaseGeoPoint.ShowDegMiSec(APInf.CRW.RunwayBegin.Coordinates.Lat), CMBaseGeoPoint.ShowDegMiSec(APInf.CRW.RunwayBegin.Coordinates.Lng)) + " \r\n";
            TextResult.Text += string.Format("Конец ВПП {0}  {1}", CMBaseGeoPoint.ShowDegMiSec(APInf.CRW.RunwayEnd.Coordinates.Lat), CMBaseGeoPoint.ShowDegMiSec(APInf.CRW.RunwayEnd.Coordinates.Lng)) + " \r\n";



            //TextResult.Text += string.Format(" {0} ", GetAsimut(APInf.CRW.RunwayEnd, APInf.CRW.RunwayBegin)) + " \r\n";

            TextResult.Text += string.Format("Расстояние <=> {0} ", CMGeoBase.GetDistance(APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd)) + " \r\n";


            TextResult.Text += string.Format("А1 с К-> Н {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.GetAsimut(APInf.CRW.RunwayEnd, APInf.CRW.RunwayBegin, 0))) + " \r\n";
            TextResult.Text += string.Format("А2 с К-> Н {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.GetAsimut(APInf.CRW.RunwayEnd, APInf.CRW.RunwayBegin, 1))) + " \r\n";

            TextResult.Text += string.Format("А1 с Н-> К {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.GetAsimut(APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd, 0))) + " \r\n";
            TextResult.Text += string.Format("А2 с Н-> К {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.GetAsimut(APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd, 1))) + " \r\n";

            TextResult.Text += string.Format("Аold с Н-> К {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.Azimut(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayEnd.Coordinates))) + " \r\n";
            TextResult.Text += string.Format("Аold с К-> Н {0} ", CMBaseGeoPoint.ShowDegMiSec(CMGeoBase.Azimut(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayBegin.Coordinates))) + " \r\n";
        }
Ejemplo n.º 9
0
        public CMCGPCheckedResult CheckHorizSurface_(CMCheckedGeoPoint Input, CMAPSurfaceB SurfaceB)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

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



            List <PointLatLng> Plane1 = new List <PointLatLng>();

            Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse - 90, Radius).Coordinates);
            Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse + 90, Radius).Coordinates);
            Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse - 90, Radius).Coordinates);
            Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse + 90, Radius).Coordinates);

            if (CMGeoBase.IsPointInPolygon(Plane1, Input.Coordinates))
            {
                Zone = 1;
            }
            else
            {
                Plane1.Clear();
                Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse + 90, Radius).Coordinates);
                Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse - 90, Radius).Coordinates);
                Plane1.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse, Radius), APInf.CRW.RunwayEnd.BackTrueCourse - 90, Radius).Coordinates);
                Plane1.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayEnd, APInf.CRW.RunwayEnd.BackTrueCourse, Radius), APInf.CRW.RunwayEnd.BackTrueCourse + 90, Radius).Coordinates);

                if (CMGeoBase.IsPointInPolygon(Plane1, Input.Coordinates))
                {
                    Zone = 2;
                }
                else
                {
                    Plane1.Clear();
                    Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse + 90, Radius).Coordinates);
                    Plane1.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse + 90, Radius), APInf.CRW.RunwayBegin.BackTrueCourse, Radius).Coordinates);
                    Plane1.Add(CMGeoBase.GetCoordinate(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse - 90, Radius), APInf.CRW.RunwayBegin.BackTrueCourse, Radius).Coordinates);
                    Plane1.Add(CMGeoBase.GetCoordinate(APInf.CRW.RunwayBegin, APInf.CRW.RunwayBegin.BackTrueCourse - 90, Radius).Coordinates);
                    if (CMGeoBase.IsPointInPolygon(Plane1, Input.Coordinates))
                    {
                        Zone = 3;
                    }
                }
            }

            switch (Zone)
            {
            case 1:
                inZone = true;
                break;

            case 2:
                if (CMGeoBase.GetDistance(APInf.CRW.RunwayEnd, Input) <= Radius)
                {
                    inZone = true;
                }

                break;

            case 3:
                if (CMGeoBase.GetDistance(APInf.CRW.RunwayBegin, Input) <= Radius)
                {
                    inZone = true;
                }
                break;

            default:
                break;
            }

            if (inZone)
            {
                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.º 10
0
        public CMCGPCheckedResult CheckInnerTransitionSurface_(CMCheckedGeoPoint Input, CMInnerApproachSurfaceData InnerApproachSurface, CMCancelledApproachSurfaceData CancelledApproachSurface)
        {
            CMCGPCheckedResult CheckedResult = new CMCGPCheckedResult();

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

            if (CMGeoBase.IsPointInPolygon(mPointsList, Input.Coordinates) || CMGeoBase.IsPointInPolygon(mPointsList2, Input.Coordinates))
            {
                int    misc   = CMGeoBase.ZoneChecker(Input.Coordinates, mPointsList);
                double length = 0;
                double angle  = 0;

                GeoCoordinate eCoord = new GeoCoordinate(Input.Lat, Input.Lng);
                PointLatLng   temp1  = new PointLatLng();

                switch (misc)
                {
                case 1:
                {
                    temp1 = CMGeoBase.OtstupVPP(InnerApproachSurface.Offset, APInf.CRW.TransitionSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates);
                    GeoCoordinate sCoord = new GeoCoordinate(temp1.Lat, temp1.Lng);
                    length = eCoord.GetDistanceTo(sCoord);
                    angle  = CMGeoBase.Azimut(temp1, Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayEnd.Coordinates, APInf.CRW.RunwayBegin.Coordinates);
                    //aa *= Math.Cos(Math.Abs(angle) * DegToRad);
                    double length2 = length * Math.Cos(Math.Abs(angle) * CMGeoBase.DegToRad);
                    double length3 = length * Math.Sin(Math.Abs(angle) * CMGeoBase.DegToRad);
                    CheckedResult.SurfaceHeight = length2 * InnerApproachSurface.HeightAngle;          //основание

                    double w1 = InnerApproachSurface.Width / 2 * 1000;
                    double w2 = Math.Abs(length3);
                    if (w2 > w1)
                    {
                        CheckedResult.SurfaceHeight += HeightAngle * (w2 - w1);
                    }
                    break;
                }

                case 2:
                {
                    length = CMGeoBase.GetDistance(Input, 2, APInf.CRW.RunwayBegin, APInf.CRW.RunwayEnd);
                    if (length > Width / 2)
                    {
                        CheckedResult.SurfaceHeight = (length - Width / 2) * HeightAngle;
                    }

                    break;
                }

                case 3:
                {
                    temp1 = CMGeoBase.OtstupVPP(CancelledApproachSurface.Offset, APInf.CRW.TakeoffSurfaceDirection, APInf.CRW.RunwayBegin.Coordinates);
                    GeoCoordinate sCoord = new GeoCoordinate(temp1.Lat, temp1.Lng);
                    length = eCoord.GetDistanceTo(sCoord);
                    angle  = CMGeoBase.Azimut(temp1, Input.Coordinates) - CMGeoBase.Azimut(APInf.CRW.RunwayBegin.Coordinates, APInf.CRW.RunwayEnd.Coordinates);
                    double length2 = length * Math.Cos(Math.Abs(angle) * CMGeoBase.DegToRad);
                    double length3 = length * Math.Sin(Math.Abs(angle) * CMGeoBase.DegToRad);
                    CheckedResult.SurfaceHeight = length2 * CancelledApproachSurface.HeightAngle;         //основание

                    //new
                    double Width1 = 60 + length2 * 0.1;
                    double Width2 = Math.Abs(length3);

                    if (Width2 > Width1)
                    {
                        CheckedResult.SurfaceHeight += HeightAngle * (Width2 - Width1);
                    }
                    break;
                }

                default: break;
                }
                //
                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}", (CheckedResult.IsObstacle ? "" : " не "), (CheckedResult.IsObstacle ? string.Format(" на {0} / {1}", CheckedResult.Exceeding, CheckedResult.SurfaceHeight) : ""));
            }
            else
            {
                Visible = false;
            }
            return(CheckedResult);
        }