protected void DrawArea3DScene(ChartGraphics graph, RectangleF position)
        {
            ChartArea chartArea = (ChartArea)this;

            areaSceneWallWidth = graph.GetRelativeSize(new SizeF(Area3DStyle.WallWidth, Area3DStyle.WallWidth));
            areaSceneDepth     = GetArea3DSceneDepth();
            matrix3D.Initialize(position, areaSceneDepth, Area3DStyle.XAngle, Area3DStyle.YAngle, Area3DStyle.Perspective, Area3DStyle.RightAngleAxes);
            matrix3D.InitLight(Area3DStyle.Light);
            visibleSurfaces = graph.GetVisibleSurfaces(position, 0f, areaSceneDepth, matrix3D);
            Color color = chartArea.BackColor;

            if (color == Color.Transparent)
            {
                areaSceneWallWidth = SizeF.Empty;
                return;
            }
            if (color == Color.Empty)
            {
                color = Color.LightGray;
            }
            if (IsBottomSceneWallVisible())
            {
                position.Height += areaSceneWallWidth.Height;
            }
            position.Width += areaSceneWallWidth.Width;
            if (Area3DStyle.YAngle > 0)
            {
                position.X -= areaSceneWallWidth.Width;
            }
            RectangleF position2 = new RectangleF(position.Location, position.Size);
            float      width     = areaSceneWallWidth.Width;
            float      positionZ = 0f - width;

            if (IsMainSceneWallOnFront())
            {
                positionZ = areaSceneDepth;
            }
            graph.Fill3DRectangle(position2, positionZ, width, matrix3D, chartArea.Area3DStyle.Light, color, chartArea.BackHatchStyle, chartArea.BackImage, chartArea.BackImageMode, chartArea.BackImageTransparentColor, chartArea.BackImageAlign, chartArea.BackGradientType, chartArea.BackGradientEndColor, chartArea.BorderColor, chartArea.BorderWidth, chartArea.BorderStyle, PenAlignment.Outset, DrawingOperationTypes.DrawElement);
            position2       = new RectangleF(position.Location, position.Size);
            position2.Width = areaSceneWallWidth.Width;
            if (!IsSideSceneWallOnLeft())
            {
                position2.X = position.Right - areaSceneWallWidth.Width;
            }
            graph.Fill3DRectangle(position2, 0f, areaSceneDepth, matrix3D, chartArea.Area3DStyle.Light, color, chartArea.BackHatchStyle, chartArea.BackImage, chartArea.BackImageMode, chartArea.BackImageTransparentColor, chartArea.BackImageAlign, chartArea.BackGradientType, chartArea.BackGradientEndColor, chartArea.BorderColor, chartArea.BorderWidth, chartArea.BorderStyle, PenAlignment.Outset, DrawingOperationTypes.DrawElement);
            if (IsBottomSceneWallVisible())
            {
                position2        = new RectangleF(position.Location, position.Size);
                position2.Height = areaSceneWallWidth.Height;
                position2.Y      = position.Bottom - areaSceneWallWidth.Height;
                position2.Width -= areaSceneWallWidth.Width;
                if (IsSideSceneWallOnLeft())
                {
                    position2.X += areaSceneWallWidth.Width;
                }
                positionZ = 0f;
                graph.Fill3DRectangle(position2, 0f, areaSceneDepth, matrix3D, chartArea.Area3DStyle.Light, color, chartArea.BackHatchStyle, chartArea.BackImage, chartArea.BackImageMode, chartArea.BackImageTransparentColor, chartArea.BackImageAlign, chartArea.BackGradientType, chartArea.BackGradientEndColor, chartArea.BorderColor, chartArea.BorderWidth, chartArea.BorderStyle, PenAlignment.Outset, DrawingOperationTypes.DrawElement);
            }
        }
        internal void Estimate3DInterval(ChartGraphics graph)
        {
            _ = (ChartArea)this;
            areaSceneWallWidth = graph.GetRelativeSize(new SizeF(Area3DStyle.WallWidth, Area3DStyle.WallWidth));
            ChartArea chartArea = (ChartArea)this;

            areaSceneDepth = GetEstimatedSceneDepth();
            RectangleF innerPlotRectangle = chartArea.Position.ToRectangleF();

            if (base.PlotAreaPosition.Width == 0f && base.PlotAreaPosition.Height == 0f && !chartArea.InnerPlotPosition.Auto && !chartArea.Position.Auto && !chartArea.InnerPlotPosition.Auto)
            {
                innerPlotRectangle.X     += chartArea.Position.Width / 100f * chartArea.InnerPlotPosition.X;
                innerPlotRectangle.Y     += chartArea.Position.Height / 100f * chartArea.InnerPlotPosition.Y;
                innerPlotRectangle.Width  = chartArea.Position.Width / 100f * chartArea.InnerPlotPosition.Width;
                innerPlotRectangle.Height = chartArea.Position.Height / 100f * chartArea.InnerPlotPosition.Height;
            }
            int      realYAngle = GetRealYAngle();
            Matrix3D matrix3D   = new Matrix3D();

            matrix3D.Initialize(innerPlotRectangle, areaSceneDepth, Area3DStyle.XAngle, realYAngle, Area3DStyle.Perspective, Area3DStyle.RightAngleAxes);
            Point3D[] array = new Point3D[8];
            bool      axisOnEdge;

            if (chartArea.switchValueAxes)
            {
                float marksZPosition = axisX.GetMarksZPosition(out axisOnEdge);
                array[0]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[1]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
                marksZPosition = axisY.GetMarksZPosition(out axisOnEdge);
                array[2]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
                array[3]       = new Point3D(innerPlotRectangle.Right, innerPlotRectangle.Bottom, marksZPosition);
                marksZPosition = axisX2.GetMarksZPosition(out axisOnEdge);
                array[4]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[5]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
                marksZPosition = axisY2.GetMarksZPosition(out axisOnEdge);
                array[6]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[7]       = new Point3D(innerPlotRectangle.Right, innerPlotRectangle.Y, marksZPosition);
            }
            else
            {
                float marksZPosition = axisX.GetMarksZPosition(out axisOnEdge);
                array[0]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
                array[1]       = new Point3D(innerPlotRectangle.Right, innerPlotRectangle.Bottom, marksZPosition);
                marksZPosition = axisY.GetMarksZPosition(out axisOnEdge);
                array[2]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[3]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
                marksZPosition = axisX2.GetMarksZPosition(out axisOnEdge);
                array[4]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[5]       = new Point3D(innerPlotRectangle.Right, innerPlotRectangle.Y, marksZPosition);
                marksZPosition = axisY2.GetMarksZPosition(out axisOnEdge);
                array[6]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Y, marksZPosition);
                array[7]       = new Point3D(innerPlotRectangle.X, innerPlotRectangle.Bottom, marksZPosition);
            }
            Axis[] axes = chartArea.Axes;
            foreach (Axis obj in axes)
            {
                obj.crossing = obj.tempCrossing;
            }
            matrix3D.TransformPoints(array);
            int num = 0;

            axes = chartArea.Axes;
            foreach (Axis axis in axes)
            {
                double num2 = Math.Sqrt((array[num].X - array[num + 1].X) * (array[num].X - array[num + 1].X) + (array[num].Y - array[num + 1].Y) * (array[num].Y - array[num + 1].Y));
                float  num3 = 1f;
                if (!chartArea.switchValueAxes)
                {
                    num3 = 0.5f;
                }
                if (axis.Type == AxisName.X || axis.Type == AxisName.X2)
                {
                    if (chartArea.switchValueAxes)
                    {
                        axis.interval3DCorrection = num2 / (double)innerPlotRectangle.Height;
                    }
                    else
                    {
                        axis.interval3DCorrection = num2 / (double)innerPlotRectangle.Width;
                    }
                }
                else if (chartArea.switchValueAxes)
                {
                    axis.interval3DCorrection = num2 / (double)innerPlotRectangle.Width;
                }
                else
                {
                    axis.interval3DCorrection = num2 / (double)innerPlotRectangle.Height * (double)num3;
                }
                if (axis.interval3DCorrection < 0.15)
                {
                    axis.interval3DCorrection = 0.15;
                }
                if (axis.interval3DCorrection > 0.8)
                {
                    axis.interval3DCorrection = 1.0;
                }
                num += 2;
            }
        }