protected override void GetPointWidthAndHeight(Series series, int pointIndex, float location, out float height, out float startWidth, out float endWidth) { PointF empty = PointF.Empty; RectangleF absoluteRectangle = base.graph.GetAbsoluteRectangle(base.plotAreaPosition); float num = absoluteRectangle.Height - base.funnelSegmentGap * (float)(base.pointNumber - (this.ShouldDrawFirstPoint() ? 1 : 2)); if (num < 0.0) { num = 0f; } height = (float)((double)num * (this.GetYValue(series.Points[pointIndex], pointIndex) / base.yValueTotal)); height = base.CheckMinHeight(height); PointF linesIntersection = ChartGraphics3D.GetLinesIntersection(absoluteRectangle.X, location - height, absoluteRectangle.Right, location - height, absoluteRectangle.X, absoluteRectangle.Bottom, (float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0), absoluteRectangle.Y); if (linesIntersection.X > absoluteRectangle.X + absoluteRectangle.Width / 2.0) { linesIntersection.X = (float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0); } PointF linesIntersection2 = ChartGraphics3D.GetLinesIntersection(absoluteRectangle.X, location, absoluteRectangle.Right, location, absoluteRectangle.X, absoluteRectangle.Bottom, (float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0), absoluteRectangle.Y); if (linesIntersection2.X > absoluteRectangle.X + absoluteRectangle.Width / 2.0) { linesIntersection2.X = (float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0); } startWidth = (float)(Math.Abs((float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0 - linesIntersection.X)) * 2.0); endWidth = (float)(Math.Abs((float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0 - linesIntersection2.X)) * 2.0); empty = new PointF((float)(absoluteRectangle.X + absoluteRectangle.Width / 2.0), (float)(location - height / 2.0)); series.Points[pointIndex].positionRel = base.graph.GetRelativePoint(empty); }
protected virtual void GetTopSurfaceVisibility(ChartArea area, DataPoint3D firstPoint, DataPoint3D secondPoint, bool upSideDown, float positionZ, float depth, Matrix3D matrix, ref SurfaceNames visibleSurfaces) { if ((visibleSurfaces & SurfaceNames.Top) == SurfaceNames.Top) { visibleSurfaces ^= SurfaceNames.Top; } Point3D[] array = new Point3D[3]; if (!area.reverseSeriesOrder) { if (!upSideDown && firstPoint.xPosition <= secondPoint.xPosition) { goto IL_0048; } if (upSideDown && firstPoint.xPosition >= secondPoint.xPosition) { goto IL_0048; } array[0] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); } else { if (!upSideDown && secondPoint.xPosition <= firstPoint.xPosition) { goto IL_010c; } if (upSideDown && secondPoint.xPosition >= firstPoint.xPosition) { goto IL_010c; } array[0] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); } goto IL_01a4; IL_010c: array[0] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); goto IL_01a4; IL_01a4: matrix.TransformPoints(array); if (ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2])) { visibleSurfaces |= SurfaceNames.Top; } return; IL_0048: array[0] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); goto IL_01a4; }
private void CheckSurfaceOrientation(COPCoordinates coord, Point3D point1, Point3D point2, out bool xSameOrientation, out bool ySameOrientation, out bool zSameOrientation) { Point3D[] array = new Point3D[3]; xSameOrientation = true; ySameOrientation = true; zSameOrientation = true; if ((coord & COPCoordinates.X) == COPCoordinates.X) { array[0] = new Point3D(point1.X, base.PlotAreaPosition.Y, 0f); array[1] = new Point3D(point1.X, base.PlotAreaPosition.Bottom(), 0f); array[2] = new Point3D(point1.X, base.PlotAreaPosition.Bottom(), this.areaSceneDepth); this.matrix3D.TransformPoints(array); bool flag = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); array[0] = new Point3D(point2.X, base.PlotAreaPosition.Y, 0f); array[1] = new Point3D(point2.X, base.PlotAreaPosition.Bottom(), 0f); array[2] = new Point3D(point2.X, base.PlotAreaPosition.Bottom(), this.areaSceneDepth); this.matrix3D.TransformPoints(array); bool flag2 = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); xSameOrientation = (flag == flag2); } if ((coord & COPCoordinates.Y) == COPCoordinates.Y) { array[0] = new Point3D(base.PlotAreaPosition.X, point1.Y, this.areaSceneDepth); array[1] = new Point3D(base.PlotAreaPosition.X, point1.Y, 0f); array[2] = new Point3D(base.PlotAreaPosition.Right(), point1.Y, 0f); this.matrix3D.TransformPoints(array); bool flag = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); array[0] = new Point3D(base.PlotAreaPosition.X, point2.Y, this.areaSceneDepth); array[1] = new Point3D(base.PlotAreaPosition.X, point2.Y, 0f); array[2] = new Point3D(base.PlotAreaPosition.Right(), point2.Y, 0f); this.matrix3D.TransformPoints(array); bool flag2 = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); ySameOrientation = (flag == flag2); } if ((coord & COPCoordinates.Z) == COPCoordinates.Z) { array[0] = new Point3D(base.PlotAreaPosition.X, base.PlotAreaPosition.Y, point1.Z); array[1] = new Point3D(base.PlotAreaPosition.X, base.PlotAreaPosition.Bottom(), point1.Z); array[2] = new Point3D(base.PlotAreaPosition.Right(), base.PlotAreaPosition.Bottom(), point1.Z); this.matrix3D.TransformPoints(array); bool flag = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); array[0] = new Point3D(base.PlotAreaPosition.X, base.PlotAreaPosition.Y, point2.Z); array[1] = new Point3D(base.PlotAreaPosition.X, base.PlotAreaPosition.Bottom(), point2.Z); array[2] = new Point3D(base.PlotAreaPosition.Right(), base.PlotAreaPosition.Bottom(), point2.Z); this.matrix3D.TransformPoints(array); bool flag2 = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); zSameOrientation = (flag == flag2); } }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { if (pointLoopIndex != 2) { return(base.Draw3DSurface(area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, topDarkening, bottomDarkening, thirdPointPosition, fourthPointPosition, clippedSegment)); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; if (dataPoint3D.index == 2) { int num = 0; DataPoint3D pointEx = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, dataPoint3D, ref num); this.DrawLabels3D(area, graph, area.Common, pointEx, positionZ, depth); } this.DrawLabels3D(area, graph, area.Common, dataPoint3D, positionZ, depth); return(new GraphicsPath()); }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (base.centerPointIndex == 2147483647) { base.centerPointIndex = base.GetCenterPointIndex(points); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; int num = pointIndex; DataPoint3D dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, base.multiSeries ? dataPoint3D : null, ref num); DataPoint3D dataPoint3D3 = dataPoint3D; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D3 = prevDataPointEx; } else if (dataPoint3D2.index > dataPoint3D.index) { dataPoint3D3 = dataPoint3D2; } Color color = base.useBorderColor ? dataPoint3D3.dataPoint.BorderColor : dataPoint3D3.dataPoint.Color; ChartDashStyle borderStyle = dataPoint3D3.dataPoint.BorderStyle; if (dataPoint3D3.dataPoint.Empty && dataPoint3D3.dataPoint.Color == Color.Empty) { color = Color.Gray; } if (dataPoint3D3.dataPoint.Empty && dataPoint3D3.dataPoint.BorderStyle == ChartDashStyle.NotSet) { borderStyle = ChartDashStyle.Solid; } if (this.currentKagiDirection == 0) { this.kagiUpColor = dataPoint3D.dataPoint.series.Color; string text = ((DataPointAttributes)dataPoint3D.dataPoint.series)["PriceUpColor"]; ColorConverter colorConverter = new ColorConverter(); if (text != null) { try { this.kagiUpColor = (Color)colorConverter.ConvertFromString(null, CultureInfo.InvariantCulture, text); } catch { throw new InvalidOperationException(SR.ExceptionKagiAttributeFormatInvalid("Up Brick color")); } } this.currentKagiDirection = ((dataPoint3D2.yPosition > dataPoint3D.yPosition) ? 1 : (-1)); } Color backColor = (this.currentKagiDirection == 1) ? this.kagiUpColor : color; DataPoint3D dataPoint3D4 = new DataPoint3D(); dataPoint3D4.xPosition = dataPoint3D.xPosition; dataPoint3D4.yPosition = dataPoint3D2.yPosition; bool flag = true; if (pointIndex + 1 < points.Count) { DataPoint3D dataPoint3D5 = (DataPoint3D)points[pointIndex + 1]; if (dataPoint3D5.index == dataPoint3D2.index) { flag = false; } } if (base.centerPointIndex != 2147483647 && pointIndex >= base.centerPointIndex) { flag = false; } DataPoint3D dataPoint3D6 = null; if (dataPoint3D.index >= 2) { int num2 = (dataPoint3D2.yPosition > dataPoint3D.yPosition) ? 1 : (-1); if (num2 != this.currentKagiDirection) { DataPoint3D dataPoint3D7 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 2, base.multiSeries ? dataPoint3D : null, ref num); bool flag2 = false; if (dataPoint3D2.yPosition > dataPoint3D7.yPosition && dataPoint3D2.yPosition > dataPoint3D.yPosition && dataPoint3D7.yPosition > dataPoint3D.yPosition) { flag2 = true; } else if (dataPoint3D2.yPosition < dataPoint3D7.yPosition && dataPoint3D2.yPosition < dataPoint3D.yPosition && dataPoint3D7.yPosition < dataPoint3D.yPosition) { flag2 = true; } if (flag2) { dataPoint3D6 = new DataPoint3D(); dataPoint3D6.xPosition = dataPoint3D.xPosition; dataPoint3D6.yPosition = dataPoint3D7.yPosition; dataPoint3D6.dataPoint = dataPoint3D.dataPoint; } } } GraphicsPath[] array = new GraphicsPath[3]; for (int i = 0; i < 2; i++) { DataPoint3D firstPoint = dataPoint3D2; DataPoint3D secondPoint = dataPoint3D; LineSegmentType lineSegmentType = LineSegmentType.First; switch (i) { case 0: lineSegmentType = (LineSegmentType)(flag ? 1 : 3); dataPoint3D4.dataPoint = (flag ? dataPoint3D.dataPoint : dataPoint3D2.dataPoint); firstPoint = (flag ? dataPoint3D2 : dataPoint3D4); secondPoint = (flag ? dataPoint3D4 : dataPoint3D); break; case 1: lineSegmentType = (LineSegmentType)((!flag) ? 1 : 3); dataPoint3D4.dataPoint = ((!flag) ? dataPoint3D.dataPoint : dataPoint3D.dataPoint); firstPoint = ((!flag) ? dataPoint3D2 : dataPoint3D4); secondPoint = ((!flag) ? dataPoint3D4 : dataPoint3D); break; } if (lineSegmentType == LineSegmentType.First || dataPoint3D6 == null) { array[i] = new GraphicsPath(); array[i] = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, points, pointIndex, 0f, operationType, lineSegmentType, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); } else { if (!flag) { backColor = ((this.currentKagiDirection == -1) ? this.kagiUpColor : color); } array[i] = new GraphicsPath(); array[i] = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, firstPoint, dataPoint3D6, points, pointIndex, 0f, operationType, LineSegmentType.Middle, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); graph.frontLinePen = null; this.currentKagiDirection = ((this.currentKagiDirection != 1) ? 1 : (-1)); backColor = ((!flag) ? ((this.currentKagiDirection == -1) ? this.kagiUpColor : color) : ((this.currentKagiDirection == 1) ? this.kagiUpColor : color)); array[2] = new GraphicsPath(); array[2] = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, dataPoint3D6, secondPoint, points, pointIndex, 0f, operationType, lineSegmentType, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); if (!flag) { backColor = ((this.currentKagiDirection == 1) ? this.kagiUpColor : color); } } graph.frontLinePen = null; } if (graphicsPath != null) { if (array[0] != null) { graphicsPath.AddPath(array[0], true); } if (array[1] != null) { graphicsPath.AddPath(array[1], true); } if (array[2] != null) { graphicsPath.AddPath(array[2], true); } } return(graphicsPath); }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (base.centerPointIndex == 2147483647) { base.centerPointIndex = base.GetCenterPointIndex(points); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; int num = pointIndex; DataPoint3D dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, base.multiSeries ? dataPoint3D : null, ref num); DataPoint3D dataPoint3D3 = dataPoint3D; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D3 = prevDataPointEx; } else if (dataPoint3D2.index > dataPoint3D.index) { dataPoint3D3 = dataPoint3D2; } Color backColor = base.useBorderColor ? dataPoint3D3.dataPoint.BorderColor : dataPoint3D3.dataPoint.Color; ChartDashStyle borderStyle = dataPoint3D3.dataPoint.BorderStyle; if (dataPoint3D3.dataPoint.Empty && dataPoint3D3.dataPoint.Color == Color.Empty) { backColor = Color.Gray; } if (dataPoint3D3.dataPoint.Empty && dataPoint3D3.dataPoint.BorderStyle == ChartDashStyle.NotSet) { borderStyle = ChartDashStyle.Solid; } DataPoint3D dataPoint3D4 = new DataPoint3D(); dataPoint3D4.xPosition = dataPoint3D.xPosition; dataPoint3D4.yPosition = dataPoint3D2.yPosition; bool flag = true; if (pointIndex + 1 < points.Count) { DataPoint3D dataPoint3D5 = (DataPoint3D)points[pointIndex + 1]; if (dataPoint3D5.index == dataPoint3D2.index) { flag = false; } } if (base.centerPointIndex != 2147483647 && pointIndex >= base.centerPointIndex) { flag = false; } GraphicsPath graphicsPath2; GraphicsPath graphicsPath3; if (flag) { dataPoint3D4.dataPoint = dataPoint3D.dataPoint; graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, dataPoint3D2, dataPoint3D4, points, pointIndex, 0f, operationType, LineSegmentType.First, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); graph.frontLinePen = null; dataPoint3D4.dataPoint = dataPoint3D2.dataPoint; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, dataPoint3D4, dataPoint3D, points, pointIndex, 0f, operationType, LineSegmentType.Last, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); graph.frontLinePen = null; } else { dataPoint3D4.dataPoint = dataPoint3D2.dataPoint; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, dataPoint3D4, dataPoint3D, points, pointIndex, 0f, operationType, LineSegmentType.Last, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); graph.frontLinePen = null; dataPoint3D4.dataPoint = dataPoint3D.dataPoint; graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, SurfaceNames.Top, positionZ, depth, backColor, dataPoint3D3.dataPoint.BorderColor, dataPoint3D3.dataPoint.BorderWidth, borderStyle, dataPoint3D2, dataPoint3D4, points, pointIndex, 0f, operationType, LineSegmentType.First, (byte)(base.showPointLines ? 1 : 0) != 0, false, area.reverseSeriesOrder, base.multiSeries, 0, true); graph.frontLinePen = null; } if (graphicsPath != null) { if (area.Common.ProcessModeRegions && graphicsPath2 != null && graphicsPath2.PointCount > 0) { area.Common.HotRegionsList.AddHotRegion(graphicsPath2, false, graph, prevDataPointEx.dataPoint, prevDataPointEx.dataPoint.series.Name, prevDataPointEx.index - 1); } if (graphicsPath3 != null && graphicsPath3.PointCount > 0) { graphicsPath.AddPath(graphicsPath3, true); } } return(graphicsPath); }
protected override GraphicsPath Draw3DSurface(DataPoint3D firstPoint, DataPoint3D secondPoint, bool reversed, ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, LineSegmentType surfaceSegmentType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment, bool clipOnTop, bool clipOnBottom) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (Math.Round(firstPoint.xPosition, 3) == Math.Round(secondPoint.xPosition, 3) && Math.Round(firstPoint.yPosition, 3) == Math.Round(secondPoint.yPosition, 3)) { return(graphicsPath); } DataPoint3D dataPoint3D = secondPoint; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D = prevDataPointEx; } else if (firstPoint.index > secondPoint.index) { dataPoint3D = firstPoint; } Color color = useBorderColor ? dataPoint3D.dataPoint.BorderColor : dataPoint3D.dataPoint.Color; ChartDashStyle borderStyle = dataPoint3D.dataPoint.BorderStyle; if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.Color == Color.Empty) { color = Color.Gray; } if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.BorderStyle == ChartDashStyle.NotSet) { borderStyle = ChartDashStyle.Solid; } float num = (float)Math.Round(vAxis.GetPosition(vAxis.Crossing), 3); float num2 = (float)Math.Min(firstPoint.xPosition, secondPoint.xPosition); float val = (float)Math.Min(firstPoint.yPosition, secondPoint.yPosition); val = Math.Min(val, num); float num3 = (float)Math.Max(firstPoint.xPosition, secondPoint.xPosition); float val2 = (float)Math.Max(firstPoint.yPosition, secondPoint.yPosition); val2 = Math.Max(val2, num); RectangleF position = new RectangleF(num2, val, num3 - num2, val2 - val); SurfaceNames visibleSurfaces = graph.GetVisibleSurfaces(position, positionZ, depth, matrix); bool upSideDown = false; if ((decimal)firstPoint.yPosition >= (decimal)num && (decimal)secondPoint.yPosition >= (decimal)num) { upSideDown = true; bool num4 = (visibleSurfaces & SurfaceNames.Top) == SurfaceNames.Top; bool flag = (visibleSurfaces & SurfaceNames.Bottom) == SurfaceNames.Bottom; visibleSurfaces ^= SurfaceNames.Bottom; visibleSurfaces ^= SurfaceNames.Top; if (num4) { visibleSurfaces |= SurfaceNames.Bottom; } if (flag) { visibleSurfaces |= SurfaceNames.Top; } } GetTopSurfaceVisibility(area, firstPoint, secondPoint, upSideDown, positionZ, depth, matrix, ref visibleSurfaces); GetBottomPointsPosition(common, area, num, ref firstPoint, ref secondPoint, thirdPointPosition, fourthPointPosition, out PointF thirdPoint, out PointF fourthPoint); if (!float.IsNaN(thirdPointPosition.Y)) { thirdPoint.Y = thirdPointPosition.Y; } if (!float.IsNaN(fourthPointPosition.Y)) { fourthPoint.Y = fourthPointPosition.Y; } if (float.IsNaN(thirdPoint.X) || float.IsNaN(thirdPoint.Y) || float.IsNaN(fourthPoint.X) || float.IsNaN(fourthPoint.Y)) { return(graphicsPath); } if (clipOnTop && ClipTopPoints(graphicsPath, ref firstPoint, ref secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } if (clipOnBottom && ClipBottomPoints(graphicsPath, ref firstPoint, ref secondPoint, ref thirdPoint, ref fourthPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } if ((Math.Round((decimal)firstPoint.yPosition, 3) > (decimal)num + 0.001m && Math.Round((decimal)secondPoint.yPosition, 3) < (decimal)num - 0.001m) || (Math.Round((decimal)firstPoint.yPosition, 3) < (decimal)num - 0.001m && Math.Round((decimal)secondPoint.yPosition, 3) > (decimal)num + 0.001m)) { DataPoint3D axisIntersection = GetAxisIntersection(firstPoint, secondPoint, num); for (int i = 0; i <= 1; i++) { GraphicsPath graphicsPath2 = null; if ((i == 0 && !reversed) || (i == 1 && reversed)) { axisIntersection.dataPoint = secondPoint.dataPoint; axisIntersection.index = secondPoint.index; graphicsPath2 = Draw3DSurface(firstPoint, axisIntersection, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop, clipOnBottom); } if ((i == 1 && !reversed) || (i == 0 && reversed)) { axisIntersection.dataPoint = firstPoint.dataPoint; axisIntersection.index = firstPoint.index; graphicsPath2 = Draw3DSurface(axisIntersection, secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop, clipOnBottom); } if (graphicsPath != null && graphicsPath2 != null && graphicsPath2.PointCount > 0) { graphicsPath.AddPath(graphicsPath2, connect: true); } } return(graphicsPath); } if (Math.Round(firstPoint.xPosition, 3) == Math.Round(secondPoint.xPosition, 3) && Math.Round(firstPoint.yPosition, 3) == Math.Round(secondPoint.yPosition, 3)) { return(graphicsPath); } for (int j = 1; j <= 2; j++) { SurfaceNames[] obj = new SurfaceNames[6] { SurfaceNames.Back, SurfaceNames.Bottom, SurfaceNames.Top, SurfaceNames.Left, SurfaceNames.Right, SurfaceNames.Front }; LineSegmentType lineSegmentType = LineSegmentType.Middle; SurfaceNames[] array = obj; foreach (SurfaceNames surfaceNames in array) { if (ChartGraphics3D.ShouldDrawLineChartSurface(area, area.reverseSeriesOrder, surfaceNames, visibleSurfaces, color, points, firstPoint, secondPoint, multiSeries, reversed, ref lineSegmentType) != j || (allPointsLoopsNumber == 2 && (operationType & DrawingOperationTypes.DrawElement) == DrawingOperationTypes.DrawElement && ((pointLoopIndex == 0 && (surfaceNames == SurfaceNames.Front || (j == 2 && (surfaceNames == SurfaceNames.Left || surfaceNames == SurfaceNames.Right)))) || (pointLoopIndex == 1 && (surfaceNames == SurfaceNames.Back || surfaceNames != SurfaceNames.Front) && (j == 1 || (surfaceNames != SurfaceNames.Left && surfaceNames != SurfaceNames.Right)))))) { continue; } Color color2 = color; Color color3 = dataPoint3D.dataPoint.BorderColor; if (j == 1) { if (color2.A == byte.MaxValue) { continue; } color2 = Color.Transparent; if (color3 == Color.Empty) { color3 = ChartGraphics.GetGradientColor(color, Color.Black, 0.2); } } bool flag2 = showPointLines; if (surfaceSegmentType == LineSegmentType.Middle) { flag2 = false; } if (clippedSegment && surfaceNames != SurfaceNames.Top && surfaceNames != SurfaceNames.Bottom) { continue; } GraphicsPath graphicsPath3 = null; switch (surfaceNames) { case SurfaceNames.Top: { Color backColor = (topDarkening == 0f) ? color2 : ChartGraphics.GetGradientColor(color2, Color.Black, topDarkening); Color borderColor = (topDarkening == 0f) ? color3 : ChartGraphics.GetGradientColor(color3, Color.Black, topDarkening); graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor, borderColor, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, points, pointIndex, 0f, operationType, surfaceSegmentType, flag2, forceThickBorder: false, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); break; } case SurfaceNames.Bottom: { DataPoint3D dataPoint3D12 = new DataPoint3D(); dataPoint3D12.index = firstPoint.index; dataPoint3D12.dataPoint = firstPoint.dataPoint; dataPoint3D12.xPosition = firstPoint.xPosition; dataPoint3D12.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D13 = new DataPoint3D(); dataPoint3D13.index = secondPoint.index; dataPoint3D13.dataPoint = secondPoint.dataPoint; dataPoint3D13.xPosition = secondPoint.xPosition; dataPoint3D13.yPosition = fourthPoint.Y; Color backColor2 = (bottomDarkening == 0f) ? color2 : ChartGraphics.GetGradientColor(color2, Color.Black, topDarkening); Color borderColor2 = (bottomDarkening == 0f) ? color3 : ChartGraphics.GetGradientColor(color3, Color.Black, topDarkening); graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor2, borderColor2, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D12, dataPoint3D13, points, pointIndex, 0f, operationType, surfaceSegmentType, flag2, forceThickBorder: false, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); break; } case SurfaceNames.Left: if (surfaceSegmentType == LineSegmentType.Single || (!area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.First) || (area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.Last)) { DataPoint3D dataPoint3D4 = (firstPoint.xPosition <= secondPoint.xPosition) ? firstPoint : secondPoint; DataPoint3D dataPoint3D5 = new DataPoint3D(); dataPoint3D5.index = dataPoint3D4.index; dataPoint3D5.dataPoint = dataPoint3D4.dataPoint; dataPoint3D5.xPosition = dataPoint3D4.xPosition; dataPoint3D5.yPosition = ((firstPoint.xPosition <= secondPoint.xPosition) ? thirdPoint.Y : fourthPoint.Y); DataPoint3D dataPoint3D6 = new DataPoint3D(); dataPoint3D6.index = dataPoint3D4.index; dataPoint3D6.dataPoint = dataPoint3D4.dataPoint; dataPoint3D6.xPosition = dataPoint3D4.xPosition; dataPoint3D6.yPosition = dataPoint3D4.yPosition; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D5, dataPoint3D6, points, pointIndex, 0f, operationType, LineSegmentType.Single, forceThinBorder: true, forceThickBorder: true, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); } break; case SurfaceNames.Right: if (surfaceSegmentType == LineSegmentType.Single || (!area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.Last) || (area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.First)) { DataPoint3D dataPoint3D9 = (secondPoint.xPosition >= firstPoint.xPosition) ? secondPoint : firstPoint; DataPoint3D dataPoint3D10 = new DataPoint3D(); dataPoint3D10.index = dataPoint3D9.index; dataPoint3D10.dataPoint = dataPoint3D9.dataPoint; dataPoint3D10.xPosition = dataPoint3D9.xPosition; dataPoint3D10.yPosition = ((secondPoint.xPosition >= firstPoint.xPosition) ? fourthPoint.Y : thirdPoint.Y); DataPoint3D dataPoint3D11 = new DataPoint3D(); dataPoint3D11.index = dataPoint3D9.index; dataPoint3D11.dataPoint = dataPoint3D9.dataPoint; dataPoint3D11.xPosition = dataPoint3D9.xPosition; dataPoint3D11.yPosition = dataPoint3D9.yPosition; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D10, dataPoint3D11, points, pointIndex, 0f, operationType, LineSegmentType.Single, forceThinBorder: true, forceThickBorder: true, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); } break; case SurfaceNames.Back: { DataPoint3D dataPoint3D7 = new DataPoint3D(); dataPoint3D7.index = firstPoint.index; dataPoint3D7.dataPoint = firstPoint.dataPoint; dataPoint3D7.xPosition = firstPoint.xPosition; dataPoint3D7.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D8 = new DataPoint3D(); dataPoint3D8.index = secondPoint.index; dataPoint3D8.dataPoint = secondPoint.dataPoint; dataPoint3D8.xPosition = secondPoint.xPosition; dataPoint3D8.yPosition = fourthPoint.Y; SurfaceNames thinBorders2 = (SurfaceNames)0; if (flag2) { switch (surfaceSegmentType) { case LineSegmentType.Single: thinBorders2 = (SurfaceNames.Left | SurfaceNames.Right); break; case LineSegmentType.First: thinBorders2 = SurfaceNames.Left; break; case LineSegmentType.Last: thinBorders2 = SurfaceNames.Right; break; } } graphicsPath3 = graph.Draw3DPolygon(area, matrix, lightStyle, surfaceNames, positionZ, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D8, dataPoint3D7, points, pointIndex, 0f, operationType, lineSegmentType, thinBorders2); break; } case SurfaceNames.Front: { DataPoint3D dataPoint3D2 = new DataPoint3D(); dataPoint3D2.index = firstPoint.index; dataPoint3D2.dataPoint = firstPoint.dataPoint; dataPoint3D2.xPosition = firstPoint.xPosition; dataPoint3D2.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D3 = new DataPoint3D(); dataPoint3D3.index = secondPoint.index; dataPoint3D3.dataPoint = secondPoint.dataPoint; dataPoint3D3.xPosition = secondPoint.xPosition; dataPoint3D3.yPosition = fourthPoint.Y; if (area.reverseSeriesOrder) { switch (lineSegmentType) { case LineSegmentType.First: lineSegmentType = LineSegmentType.Last; break; case LineSegmentType.Last: lineSegmentType = LineSegmentType.First; break; } } if (surfaceSegmentType != 0 && (surfaceSegmentType == LineSegmentType.Middle || (surfaceSegmentType == LineSegmentType.First && lineSegmentType != LineSegmentType.First) || (surfaceSegmentType == LineSegmentType.Last && lineSegmentType != LineSegmentType.Last))) { lineSegmentType = LineSegmentType.Middle; } SurfaceNames thinBorders = (SurfaceNames)0; if (flag2) { switch (surfaceSegmentType) { case LineSegmentType.Single: thinBorders = (SurfaceNames.Left | SurfaceNames.Right); break; case LineSegmentType.First: thinBorders = SurfaceNames.Left; break; case LineSegmentType.Last: thinBorders = SurfaceNames.Right; break; } } graphicsPath3 = graph.Draw3DPolygon(area, matrix, lightStyle, surfaceNames, positionZ + depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D3, dataPoint3D2, points, pointIndex, 0f, operationType, lineSegmentType, thinBorders); break; } } if (j == 2 && graphicsPath != null && graphicsPath3 != null && graphicsPath3.PointCount > 0) { graphicsPath.CloseFigure(); graphicsPath.SetMarkers(); graphicsPath.AddPath(graphicsPath3, connect: true); } } } return(graphicsPath); }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (centerPointIndex == int.MaxValue) { centerPointIndex = GetCenterPointIndex(points); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; int neighborPointIndex = pointIndex; DataPoint3D dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); bool flag = false; if (dataPoint3D2.index > dataPoint3D.index) { DataPoint3D dataPoint3D3 = dataPoint3D2; dataPoint3D2 = dataPoint3D; dataPoint3D = dataPoint3D3; flag = true; } if (matrix.perspective != 0f && centerPointIndex != int.MaxValue) { neighborPointIndex = pointIndex; if (pointIndex != centerPointIndex + 1) { dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } else if (!area.reverseSeriesOrder) { dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D2.index + 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } else { dataPoint3D2 = dataPoint3D; dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } } if (dataPoint3D2 == null || dataPoint3D == null) { return(graphicsPath); } DataPoint3D dataPoint3D4 = dataPoint3D; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D4 = prevDataPointEx; } else if (dataPoint3D2.index > dataPoint3D.index) { dataPoint3D4 = dataPoint3D2; } if (!useBorderColor) { _ = dataPoint3D4.dataPoint.Color; } else { _ = dataPoint3D4.dataPoint.BorderColor; } _ = dataPoint3D4.dataPoint.BorderStyle; if (dataPoint3D4.dataPoint.Empty && dataPoint3D4.dataPoint.Color == Color.Empty) { _ = Color.Gray; } if (dataPoint3D4.dataPoint.Empty) { _ = dataPoint3D4.dataPoint.BorderStyle; } flag = false; for (int i = 1; pointIndex + i < points.Count; i++) { DataPoint3D dataPoint3D5 = (DataPoint3D)points[pointIndex + i]; if (dataPoint3D5.dataPoint.series.Name == dataPoint3D2.dataPoint.series.Name) { if (dataPoint3D5.index == dataPoint3D2.index) { flag = true; } break; } } if (tension != 0f) { GraphicsPath splineFlattenPath = graph.GetSplineFlattenPath(area, matrix, positionZ, depth, dataPoint3D2, dataPoint3D, points, pointIndex, tension, flatten: true, translateCoordinates: false, 0); PointF[] array = null; flag = (pointIndex < neighborPointIndex); if (flag) { splineFlattenPath.Reverse(); } array = splineFlattenPath.PathPoints; DataPoint3D dataPoint3D6 = new DataPoint3D(); DataPoint3D dataPoint3D7 = new DataPoint3D(); LineSegmentType lineSegmentType = LineSegmentType.Middle; for (int j = 1; j < array.Length; j++) { if (!flag) { dataPoint3D6.dataPoint = dataPoint3D2.dataPoint; dataPoint3D6.index = dataPoint3D2.index; dataPoint3D6.xPosition = array[j - 1].X; dataPoint3D6.yPosition = array[j - 1].Y; dataPoint3D7.dataPoint = dataPoint3D.dataPoint; dataPoint3D7.index = dataPoint3D.index; dataPoint3D7.xPosition = array[j].X; dataPoint3D7.yPosition = array[j].Y; } else { dataPoint3D7.dataPoint = dataPoint3D2.dataPoint; dataPoint3D7.index = dataPoint3D2.index; dataPoint3D7.xPosition = array[j - 1].X; dataPoint3D7.yPosition = array[j - 1].Y; dataPoint3D6.dataPoint = dataPoint3D.dataPoint; dataPoint3D6.index = dataPoint3D.index; dataPoint3D6.xPosition = array[j].X; dataPoint3D6.yPosition = array[j].Y; } lineSegmentType = LineSegmentType.Middle; if (j == 1) { lineSegmentType = ((!flag) ? LineSegmentType.First : LineSegmentType.Last); } else if (j == array.Length - 1) { lineSegmentType = (flag ? LineSegmentType.First : LineSegmentType.Last); } area.IterationCounter = 0; GraphicsPath graphicsPath2 = Draw3DSurface(dataPoint3D6, dataPoint3D7, flag, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, 0f, operationType, lineSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop: true, clipOnBottom: true); if (graphicsPath != null && graphicsPath2 != null && graphicsPath2.PointCount > 0) { graphicsPath.AddPath(graphicsPath2, connect: true); } } return(graphicsPath); } return(Draw3DSurface(dataPoint3D2, dataPoint3D, flag, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, LineSegmentType.Single, topDarkening, bottomDarkening, thirdPointPosition, fourthPointPosition, clippedSegment, clipOnTop: true, clipOnBottom: true)); }
internal GraphicsPath Draw3DSplinePolygon(ChartGraphics graph, ChartArea area, float positionZ, Color backColor, Color borderColor, int borderWidth, ChartDashStyle borderStyle, DataPoint3D firstPoint, DataPoint3D secondPoint, DataPoint3D thirdPoint, DataPoint3D fourthPoint, ArrayList points, int pointIndex, float tension, DrawingOperationTypes operationType, LineSegmentType lineSegmentType, bool forceThinBorder) { if (tension == 0f) { SurfaceNames thinBorders = (SurfaceNames)0; if (forceThinBorder) { thinBorders = (SurfaceNames.Left | SurfaceNames.Right); } return(graph.Draw3DPolygon(area, area.matrix3D, area.Area3DStyle.Light, SurfaceNames.Front, positionZ, backColor, borderColor, borderWidth, borderStyle, firstPoint, secondPoint, thirdPoint, fourthPoint, points, pointIndex, tension, operationType, lineSegmentType, thinBorders)); } bool num = (operationType & DrawingOperationTypes.DrawElement) == DrawingOperationTypes.DrawElement; GraphicsPath graphicsPath = new GraphicsPath(); GraphicsPath splineFlattenPath = graph.GetSplineFlattenPath(area, area.matrix3D, positionZ, 0f, firstPoint, secondPoint, points, pointIndex, tension, flatten: false, translateCoordinates: true, 0); GraphicsPath splineFlattenPath2 = graph.GetSplineFlattenPath(area, area.matrix3D, positionZ, 0f, thirdPoint, fourthPoint, points, pointIndex, tension, flatten: false, translateCoordinates: true, 1); graphicsPath.AddPath(splineFlattenPath, connect: true); graphicsPath.AddPath(splineFlattenPath2, connect: true); graphicsPath.CloseAllFigures(); Point3D[] array = new Point3D[3] { new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ), new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ), new Point3D((float)thirdPoint.xPosition, (float)thirdPoint.yPosition, positionZ) }; area.matrix3D.TransformPoints(array); bool visiblePolygon = ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2]); Color polygonLight = area.matrix3D.GetPolygonLight(array, backColor, visiblePolygon, area.Area3DStyle.YAngle, SurfaceNames.Front, area.reverseSeriesOrder); Color color = borderColor; if (color == Color.Empty) { color = ChartGraphics.GetGradientColor(backColor, Color.Black, 0.2); } Pen pen = null; if (num) { SmoothingMode smoothingMode = graph.SmoothingMode; graph.SmoothingMode = SmoothingMode.Default; graph.FillPath(new SolidBrush(polygonLight), graphicsPath); graph.SmoothingMode = smoothingMode; if (forceThinBorder) { graph.DrawPath(new Pen(color, 1f), graphicsPath); } else if (polygonLight.A == byte.MaxValue) { graph.DrawPath(new Pen(polygonLight, 1f), graphicsPath); } pen = new Pen(color, borderWidth); pen.StartCap = LineCap.Round; pen.EndCap = LineCap.Round; graph.DrawPath(pen, splineFlattenPath); graph.DrawPath(pen, splineFlattenPath2); switch (lineSegmentType) { case LineSegmentType.First: graph.DrawLine(pen, splineFlattenPath.PathPoints[0], splineFlattenPath2.GetLastPoint()); break; case LineSegmentType.Last: graph.DrawLine(pen, splineFlattenPath.GetLastPoint(), splineFlattenPath2.PathPoints[0]); break; } } if (graphicsPath != null && pen != null) { ChartGraphics.Widen(graphicsPath, pen); } return(graphicsPath); }
protected virtual void GetTopSurfaceVisibility(ChartArea area, DataPoint3D firstPoint, DataPoint3D secondPoint, bool upSideDown, float positionZ, float depth, Matrix3D matrix, ref SurfaceNames visibleSurfaces) { if ((visibleSurfaces & SurfaceNames.Top) == SurfaceNames.Top) { visibleSurfaces ^= SurfaceNames.Top; } Point3D[] array = new Point3D[3]; if (!area.reverseSeriesOrder) { if ((!upSideDown && firstPoint.xPosition < secondPoint.xPosition) || (upSideDown && firstPoint.xPosition > secondPoint.xPosition)) { array[0] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); } else { array[0] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); } } else if ((!upSideDown && secondPoint.xPosition < firstPoint.xPosition) || (upSideDown && secondPoint.xPosition > firstPoint.xPosition)) { array[0] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); } else { array[0] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, (float)firstPoint.yPosition, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, (float)secondPoint.yPosition, positionZ); } matrix.TransformPoints(array); if (ChartGraphics3D.IsSurfaceVisible(array[0], array[1], array[2])) { visibleSurfaces |= SurfaceNames.Top; } GetBottomPointsPosition(area.Common, area, 0f, ref firstPoint, ref secondPoint, out PointF thirdPoint, out PointF fourthPoint); if ((visibleSurfaces & SurfaceNames.Bottom) == SurfaceNames.Bottom) { visibleSurfaces ^= SurfaceNames.Bottom; } array = new Point3D[3]; if (!area.reverseSeriesOrder) { if ((!upSideDown && firstPoint.xPosition < secondPoint.xPosition) || (upSideDown && firstPoint.xPosition > secondPoint.xPosition)) { array[0] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ); } else { array[0] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ); } } else if ((!upSideDown && secondPoint.xPosition < firstPoint.xPosition) || (upSideDown && secondPoint.xPosition > firstPoint.xPosition)) { array[0] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ + depth); array[1] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ); array[2] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ); } else { array[0] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ + depth); array[1] = new Point3D((float)firstPoint.xPosition, thirdPoint.Y, positionZ); array[2] = new Point3D((float)secondPoint.xPosition, fourthPoint.Y, positionZ); } matrix.TransformPoints(array); if (ChartGraphics3D.IsSurfaceVisible(array[2], array[1], array[0])) { visibleSurfaces |= SurfaceNames.Bottom; } }
protected override GraphicsPath Draw3DSurface(DataPoint3D firstPoint, DataPoint3D secondPoint, bool reversed, ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, LineSegmentType surfaceSegmentType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment, bool clipOnTop, bool clipOnBottom) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; DataPoint3D dataPoint3D = secondPoint; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D = prevDataPointEx; } else if (firstPoint.index > secondPoint.index) { dataPoint3D = firstPoint; } Color color = useBorderColor ? dataPoint3D.dataPoint.BorderColor : dataPoint3D.dataPoint.Color; ChartDashStyle borderStyle = dataPoint3D.dataPoint.BorderStyle; if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.Color == Color.Empty) { color = Color.Gray; } if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.BorderStyle == ChartDashStyle.NotSet) { borderStyle = ChartDashStyle.Solid; } float num = (float)vAxis.GetPosition(vAxis.Crossing); GetBottomPointsPosition(common, area, num, ref firstPoint, ref secondPoint, out PointF thirdPoint, out PointF fourthPoint); if (!float.IsNaN(thirdPointPosition.Y)) { thirdPoint.Y = thirdPointPosition.Y; } if (!float.IsNaN(fourthPointPosition.Y)) { fourthPoint.Y = fourthPointPosition.Y; } if ((firstPoint.yPosition > (double)thirdPoint.Y && secondPoint.yPosition < (double)fourthPoint.Y) || (firstPoint.yPosition < (double)thirdPoint.Y && secondPoint.yPosition > (double)fourthPoint.Y)) { if (tension != 0f) { throw new InvalidOperationException(SR.Exception3DSplineY1ValueIsLessThenY2); } PointF linesIntersection = ChartGraphics3D.GetLinesIntersection((float)firstPoint.xPosition, (float)firstPoint.yPosition, (float)secondPoint.xPosition, (float)secondPoint.yPosition, thirdPoint.X, thirdPoint.Y, fourthPoint.X, fourthPoint.Y); DataPoint3D dataPoint3D2 = new DataPoint3D(); dataPoint3D2.xPosition = linesIntersection.X; dataPoint3D2.yPosition = linesIntersection.Y; bool flag = true; if (double.IsNaN(linesIntersection.X) || double.IsNaN(linesIntersection.Y)) { flag = false; } else { if ((decimal)linesIntersection.X == (decimal)firstPoint.xPosition && (decimal)linesIntersection.Y == (decimal)firstPoint.yPosition) { flag = false; } if ((decimal)linesIntersection.X == (decimal)secondPoint.xPosition && (decimal)linesIntersection.Y == (decimal)secondPoint.yPosition) { flag = false; } } if (flag) { reversed = false; if (pointIndex + 1 < points.Count && ((DataPoint3D)points[pointIndex + 1]).index == firstPoint.index) { reversed = true; } for (int i = 0; i <= 1; i++) { GraphicsPath graphicsPath2 = null; if ((i == 0 && !reversed) || (i == 1 && reversed)) { fourthPointY2Value = (float)dataPoint3D2.yPosition; dataPoint3D2.dataPoint = secondPoint.dataPoint; dataPoint3D2.index = secondPoint.index; graphicsPath2 = Draw3DSurface(firstPoint, dataPoint3D2, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop: true, clipOnBottom: true); } if ((i == 1 && !reversed) || (i == 0 && reversed)) { thirdPointY2Value = (float)dataPoint3D2.yPosition; dataPoint3D2.dataPoint = firstPoint.dataPoint; dataPoint3D2.index = firstPoint.index; graphicsPath2 = Draw3DSurface(dataPoint3D2, secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop: true, clipOnBottom: true); } if (graphicsPath != null && graphicsPath2 != null && graphicsPath2.PointCount > 0) { graphicsPath.AddPath(graphicsPath2, connect: true); } thirdPointY2Value = float.NaN; fourthPointY2Value = float.NaN; } return(graphicsPath); } } float num2 = (float)Math.Min(firstPoint.xPosition, secondPoint.xPosition); float val = (float)Math.Min(firstPoint.yPosition, secondPoint.yPosition); val = Math.Min(val, num); float num3 = (float)Math.Max(firstPoint.xPosition, secondPoint.xPosition); float val2 = (float)Math.Max(firstPoint.yPosition, secondPoint.yPosition); val2 = Math.Max(val2, num); RectangleF position = new RectangleF(num2, val, num3 - num2, val2 - val); SurfaceNames visibleSurfaces = graph.GetVisibleSurfaces(position, positionZ, depth, matrix); bool upSideDown = false; if (firstPoint.yPosition >= (double)thirdPoint.Y && secondPoint.yPosition >= (double)fourthPoint.Y) { upSideDown = true; bool num4 = (visibleSurfaces & SurfaceNames.Top) == SurfaceNames.Top; bool flag2 = (visibleSurfaces & SurfaceNames.Bottom) == SurfaceNames.Bottom; visibleSurfaces ^= SurfaceNames.Bottom; visibleSurfaces ^= SurfaceNames.Top; if (num4) { visibleSurfaces |= SurfaceNames.Bottom; } if (flag2) { visibleSurfaces |= SurfaceNames.Top; } } GetTopSurfaceVisibility(area, firstPoint, secondPoint, upSideDown, positionZ, depth, matrix, ref visibleSurfaces); bool flag3 = true; if (tension != 0f) { if ((visibleSurfaces & SurfaceNames.Bottom) == SurfaceNames.Bottom) { flag3 = false; } if ((visibleSurfaces & SurfaceNames.Bottom) == 0 && (visibleSurfaces & SurfaceNames.Top) == 0) { flag3 = false; } visibleSurfaces |= SurfaceNames.Bottom; visibleSurfaces |= SurfaceNames.Top; } firstPoint.xPosition = Math.Round(firstPoint.xPosition, 5); firstPoint.yPosition = Math.Round(firstPoint.yPosition, 5); secondPoint.xPosition = Math.Round(secondPoint.xPosition, 5); secondPoint.yPosition = Math.Round(secondPoint.yPosition, 5); if (ClipTopPoints(graphicsPath, ref firstPoint, ref secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } if (ClipBottomPoints(graphicsPath, ref firstPoint, ref secondPoint, ref thirdPoint, ref fourthPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } for (int j = 1; j <= 2; j++) { SurfaceNames[] array = null; array = ((!flag3) ? new SurfaceNames[6] { SurfaceNames.Back, SurfaceNames.Top, SurfaceNames.Bottom, SurfaceNames.Left, SurfaceNames.Right, SurfaceNames.Front } : new SurfaceNames[6] { SurfaceNames.Back, SurfaceNames.Bottom, SurfaceNames.Top, SurfaceNames.Left, SurfaceNames.Right, SurfaceNames.Front }); LineSegmentType lineSegmentType = LineSegmentType.Middle; SurfaceNames[] array2 = array; foreach (SurfaceNames surfaceNames in array2) { if (ChartGraphics3D.ShouldDrawLineChartSurface(area, area.reverseSeriesOrder, surfaceNames, visibleSurfaces, color, points, firstPoint, secondPoint, multiSeries, reversed, ref lineSegmentType) != j) { continue; } Color backColor = color; Color color2 = dataPoint3D.dataPoint.BorderColor; if (j == 1) { if (backColor.A == byte.MaxValue) { continue; } backColor = Color.Transparent; if (color2 == Color.Empty) { color2 = ChartGraphics.GetGradientColor(color, Color.Black, 0.2); } } GraphicsPath graphicsPath3 = null; switch (surfaceNames) { case SurfaceNames.Top: graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, points, pointIndex, tension, operationType, LineSegmentType.Middle, showPointLines ? true : false, forceThickBorder: false, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); break; case SurfaceNames.Bottom: { DataPoint3D dataPoint3D13 = new DataPoint3D(); dataPoint3D13.dataPoint = firstPoint.dataPoint; dataPoint3D13.index = firstPoint.index; dataPoint3D13.xPosition = firstPoint.xPosition; dataPoint3D13.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D14 = new DataPoint3D(); dataPoint3D14.dataPoint = secondPoint.dataPoint; dataPoint3D14.index = secondPoint.index; dataPoint3D14.xPosition = secondPoint.xPosition; dataPoint3D14.yPosition = fourthPoint.Y; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D13, dataPoint3D14, points, pointIndex, tension, operationType, LineSegmentType.Middle, showPointLines ? true : false, forceThickBorder: false, area.reverseSeriesOrder, multiSeries, 1, clipInsideArea: true); break; } case SurfaceNames.Left: if (surfaceSegmentType == LineSegmentType.Single || (!area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.First) || (area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.Last)) { DataPoint3D dataPoint3D10 = (firstPoint.xPosition <= secondPoint.xPosition) ? firstPoint : secondPoint; DataPoint3D dataPoint3D11 = new DataPoint3D(); dataPoint3D11.xPosition = dataPoint3D10.xPosition; dataPoint3D11.yPosition = ((firstPoint.xPosition <= secondPoint.xPosition) ? thirdPoint.Y : fourthPoint.Y); DataPoint3D dataPoint3D12 = new DataPoint3D(); dataPoint3D12.xPosition = dataPoint3D10.xPosition; dataPoint3D12.yPosition = dataPoint3D10.yPosition; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D11, dataPoint3D12, points, pointIndex, 0f, operationType, LineSegmentType.Single, forceThinBorder: false, forceThickBorder: true, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); } break; case SurfaceNames.Right: if (surfaceSegmentType == LineSegmentType.Single || (!area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.Last) || (area.reverseSeriesOrder && surfaceSegmentType == LineSegmentType.First)) { DataPoint3D dataPoint3D7 = (secondPoint.xPosition >= firstPoint.xPosition) ? secondPoint : firstPoint; DataPoint3D dataPoint3D8 = new DataPoint3D(); dataPoint3D8.xPosition = dataPoint3D7.xPosition; dataPoint3D8.yPosition = ((secondPoint.xPosition >= firstPoint.xPosition) ? fourthPoint.Y : thirdPoint.Y); DataPoint3D dataPoint3D9 = new DataPoint3D(); dataPoint3D9.xPosition = dataPoint3D7.xPosition; dataPoint3D9.yPosition = dataPoint3D7.yPosition; graphicsPath3 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames, positionZ, depth, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D8, dataPoint3D9, points, pointIndex, 0f, operationType, LineSegmentType.Single, forceThinBorder: false, forceThickBorder: true, area.reverseSeriesOrder, multiSeries, 0, clipInsideArea: true); } break; case SurfaceNames.Back: { DataPoint3D dataPoint3D5 = new DataPoint3D(); dataPoint3D5.dataPoint = firstPoint.dataPoint; dataPoint3D5.index = firstPoint.index; dataPoint3D5.xPosition = firstPoint.xPosition; dataPoint3D5.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D6 = new DataPoint3D(); dataPoint3D6.dataPoint = secondPoint.dataPoint; dataPoint3D6.index = secondPoint.index; dataPoint3D6.xPosition = secondPoint.xPosition; dataPoint3D6.yPosition = fourthPoint.Y; graphicsPath3 = Draw3DSplinePolygon(graph, area, positionZ, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D6, dataPoint3D5, points, pointIndex, tension, operationType, lineSegmentType, showPointLines ? true : false); break; } case SurfaceNames.Front: { DataPoint3D dataPoint3D3 = new DataPoint3D(); dataPoint3D3.dataPoint = firstPoint.dataPoint; dataPoint3D3.index = firstPoint.index; dataPoint3D3.xPosition = firstPoint.xPosition; dataPoint3D3.yPosition = thirdPoint.Y; DataPoint3D dataPoint3D4 = new DataPoint3D(); dataPoint3D4.dataPoint = secondPoint.dataPoint; dataPoint3D4.index = secondPoint.index; dataPoint3D4.xPosition = secondPoint.xPosition; dataPoint3D4.yPosition = fourthPoint.Y; if (area.reverseSeriesOrder) { switch (lineSegmentType) { case LineSegmentType.First: lineSegmentType = LineSegmentType.Last; break; case LineSegmentType.Last: lineSegmentType = LineSegmentType.First; break; } } if (surfaceSegmentType != 0) { if (surfaceSegmentType == LineSegmentType.Middle || (surfaceSegmentType == LineSegmentType.First && lineSegmentType != LineSegmentType.First) || (surfaceSegmentType == LineSegmentType.Last && lineSegmentType != LineSegmentType.Last)) { lineSegmentType = LineSegmentType.Middle; } if (reversed) { switch (lineSegmentType) { case LineSegmentType.First: lineSegmentType = LineSegmentType.Last; break; case LineSegmentType.Last: lineSegmentType = LineSegmentType.First; break; } } } graphicsPath3 = Draw3DSplinePolygon(graph, area, positionZ + depth, backColor, color2, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D4, dataPoint3D3, points, pointIndex, tension, operationType, lineSegmentType, showPointLines ? true : false); break; } } if (j == 2 && graphicsPath != null && graphicsPath3 != null && graphicsPath3.PointCount > 0) { graphicsPath.CloseFigure(); graphicsPath.AddPath(graphicsPath3, connect: true); } } } return(graphicsPath); }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { GraphicsPath result = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (centerPointIndex == int.MaxValue) { centerPointIndex = GetCenterPointIndex(points); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; int neighborPointIndex = pointIndex; DataPoint3D dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); bool reversed = false; if (dataPoint3D2.index > dataPoint3D.index) { DataPoint3D dataPoint3D3 = dataPoint3D2; dataPoint3D2 = dataPoint3D; dataPoint3D = dataPoint3D3; reversed = true; } if (matrix.perspective != 0f && centerPointIndex != int.MaxValue) { neighborPointIndex = pointIndex; if (pointIndex != centerPointIndex + 1) { dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } else if (!area.reverseSeriesOrder) { dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D2.index + 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } else { dataPoint3D2 = dataPoint3D; dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, multiSeries ? dataPoint3D : null, ref neighborPointIndex); } } if (dataPoint3D2 == null || dataPoint3D == null) { return(result); } DataPoint3D dataPoint3D4 = dataPoint3D; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D4 = prevDataPointEx; } else if (dataPoint3D2.index > dataPoint3D.index) { dataPoint3D4 = dataPoint3D2; } if (!useBorderColor) { _ = dataPoint3D4.dataPoint.Color; } else { _ = dataPoint3D4.dataPoint.BorderColor; } _ = dataPoint3D4.dataPoint.BorderStyle; if (dataPoint3D4.dataPoint.Empty && dataPoint3D4.dataPoint.Color == Color.Empty) { _ = Color.Gray; } if (dataPoint3D4.dataPoint.Empty) { _ = dataPoint3D4.dataPoint.BorderStyle; } return(Draw3DSurface(dataPoint3D2, dataPoint3D, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, LineSegmentType.Single, topDarkening, bottomDarkening, thirdPointPosition, fourthPointPosition, clippedSegment, clipOnTop: true, clipOnBottom: true)); }
protected override GraphicsPath Draw3DSurface(DataPoint3D firstPoint, DataPoint3D secondPoint, bool reversed, ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, LineSegmentType surfaceSegmentType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment, bool clipOnTop, bool clipOnBottom) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (Math.Round(firstPoint.xPosition, 3) == Math.Round(secondPoint.xPosition, 3) && Math.Round(firstPoint.yPosition, 3) == Math.Round(secondPoint.yPosition, 3)) { return(graphicsPath); } DataPoint3D dataPoint3D = secondPoint; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D = prevDataPointEx; } else if (firstPoint.index > secondPoint.index) { dataPoint3D = firstPoint; } Color color = base.useBorderColor ? dataPoint3D.dataPoint.BorderColor : dataPoint3D.dataPoint.Color; ChartDashStyle borderStyle = dataPoint3D.dataPoint.BorderStyle; if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.Color == Color.Empty) { color = Color.Gray; } if (dataPoint3D.dataPoint.Empty && dataPoint3D.dataPoint.BorderStyle == ChartDashStyle.NotSet) { borderStyle = ChartDashStyle.Solid; } float num = (float)Math.Round(base.vAxis.GetPosition(base.vAxis.Crossing), 3); float num2 = (float)Math.Min(firstPoint.xPosition, secondPoint.xPosition); float val = (float)Math.Min(firstPoint.yPosition, secondPoint.yPosition); val = Math.Min(val, num); float num3 = (float)Math.Max(firstPoint.xPosition, secondPoint.xPosition); float val2 = (float)Math.Max(firstPoint.yPosition, secondPoint.yPosition); val2 = Math.Max(val2, num); RectangleF position = new RectangleF(num2, val, num3 - num2, val2 - val); SurfaceNames surfaceNames = graph.GetVisibleSurfaces(position, positionZ, depth, matrix); bool upSideDown = false; if ((decimal)firstPoint.yPosition >= (decimal)num && (decimal)secondPoint.yPosition >= (decimal)num) { upSideDown = true; bool flag = (surfaceNames & SurfaceNames.Top) == SurfaceNames.Top; bool flag2 = (surfaceNames & SurfaceNames.Bottom) == SurfaceNames.Bottom; surfaceNames ^= SurfaceNames.Bottom; surfaceNames ^= SurfaceNames.Top; if (flag) { surfaceNames |= SurfaceNames.Bottom; } if (flag2) { surfaceNames |= SurfaceNames.Top; } } this.GetTopSurfaceVisibility(area, firstPoint, secondPoint, upSideDown, positionZ, depth, matrix, ref surfaceNames); PointF pointF = default(PointF); PointF pointF2 = default(PointF); this.GetBottomPointsPosition(base.common, area, num, ref firstPoint, ref secondPoint, thirdPointPosition, fourthPointPosition, out pointF, out pointF2); if (!float.IsNaN(thirdPointPosition.Y)) { pointF.Y = thirdPointPosition.Y; } if (!float.IsNaN(fourthPointPosition.Y)) { pointF2.Y = fourthPointPosition.Y; } if (!float.IsNaN(pointF.X) && !float.IsNaN(pointF.Y) && !float.IsNaN(pointF2.X) && !float.IsNaN(pointF2.Y)) { if (clipOnTop && base.ClipTopPoints(graphicsPath, ref firstPoint, ref secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } if (clipOnBottom && base.ClipBottomPoints(graphicsPath, ref firstPoint, ref secondPoint, ref pointF, ref pointF2, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening)) { return(graphicsPath); } if (Math.Round((decimal)firstPoint.yPosition, 3) > (decimal)num + 0.001m && Math.Round((decimal)secondPoint.yPosition, 3) < (decimal)num - 0.001m) { goto IL_03d1; } if (Math.Round((decimal)firstPoint.yPosition, 3) < (decimal)num - 0.001m && Math.Round((decimal)secondPoint.yPosition, 3) > (decimal)num + 0.001m) { goto IL_03d1; } if (Math.Round(firstPoint.xPosition, 3) == Math.Round(secondPoint.xPosition, 3) && Math.Round(firstPoint.yPosition, 3) == Math.Round(secondPoint.yPosition, 3)) { return(graphicsPath); } for (int i = 1; i <= 2; i++) { SurfaceNames[] array = new SurfaceNames[6] { SurfaceNames.Back, SurfaceNames.Bottom, SurfaceNames.Top, SurfaceNames.Left, SurfaceNames.Right, SurfaceNames.Front }; LineSegmentType lineSegmentType = LineSegmentType.Middle; SurfaceNames[] array2 = array; foreach (SurfaceNames surfaceNames2 in array2) { if (ChartGraphics3D.ShouldDrawLineChartSurface(area, area.reverseSeriesOrder, surfaceNames2, surfaceNames, color, points, firstPoint, secondPoint, base.multiSeries, reversed, ref lineSegmentType) == i) { if (base.allPointsLoopsNumber == 2 && (operationType & DrawingOperationTypes.DrawElement) == DrawingOperationTypes.DrawElement) { if (pointLoopIndex == 0 && (surfaceNames2 == SurfaceNames.Front || (i == 2 && (surfaceNames2 == SurfaceNames.Left || surfaceNames2 == SurfaceNames.Right)))) { continue; } if (pointLoopIndex == 1) { switch (surfaceNames2) { case SurfaceNames.Front: goto IL_05fc; } if (i != 1 && (surfaceNames2 == SurfaceNames.Left || surfaceNames2 == SurfaceNames.Right)) { goto IL_05fc; } continue; } } goto IL_05fc; } continue; IL_05fc: Color color2 = color; Color color3 = dataPoint3D.dataPoint.BorderColor; if (i == 1) { if (color2.A == 255) { continue; } color2 = Color.Transparent; if (color3 == Color.Empty) { color3 = ChartGraphics.GetGradientColor(color, Color.Black, 0.2); } } bool flag3 = base.showPointLines; if (surfaceSegmentType == LineSegmentType.Middle) { flag3 = false; } if (!clippedSegment || surfaceNames2 == SurfaceNames.Top || surfaceNames2 == SurfaceNames.Bottom) { GraphicsPath graphicsPath2 = null; switch (surfaceNames2) { case SurfaceNames.Top: { Color backColor = (topDarkening == 0.0) ? color2 : ChartGraphics.GetGradientColor(color2, Color.Black, (double)topDarkening); Color borderColor = (topDarkening == 0.0) ? color3 : ChartGraphics.GetGradientColor(color3, Color.Black, (double)topDarkening); graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames2, positionZ, depth, backColor, borderColor, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, points, pointIndex, 0f, operationType, surfaceSegmentType, flag3, false, area.reverseSeriesOrder, base.multiSeries, 0, true); break; } case SurfaceNames.Bottom: { DataPoint3D dataPoint3D9 = new DataPoint3D(); dataPoint3D9.index = firstPoint.index; dataPoint3D9.dataPoint = firstPoint.dataPoint; dataPoint3D9.xPosition = firstPoint.xPosition; dataPoint3D9.yPosition = (double)pointF.Y; DataPoint3D dataPoint3D10 = new DataPoint3D(); dataPoint3D10.index = secondPoint.index; dataPoint3D10.dataPoint = secondPoint.dataPoint; dataPoint3D10.xPosition = secondPoint.xPosition; dataPoint3D10.yPosition = (double)pointF2.Y; Color backColor2 = (bottomDarkening == 0.0) ? color2 : ChartGraphics.GetGradientColor(color2, Color.Black, (double)topDarkening); Color borderColor2 = (bottomDarkening == 0.0) ? color3 : ChartGraphics.GetGradientColor(color3, Color.Black, (double)topDarkening); graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames2, positionZ, depth, backColor2, borderColor2, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D9, dataPoint3D10, points, pointIndex, 0f, operationType, surfaceSegmentType, flag3, false, area.reverseSeriesOrder, base.multiSeries, 0, true); break; } case SurfaceNames.Left: { if (surfaceSegmentType != 0 && (area.reverseSeriesOrder || surfaceSegmentType != LineSegmentType.First)) { if (!area.reverseSeriesOrder) { break; } if (surfaceSegmentType != LineSegmentType.Last) { break; } } DataPoint3D dataPoint3D4 = (firstPoint.xPosition <= secondPoint.xPosition) ? firstPoint : secondPoint; DataPoint3D dataPoint3D5 = new DataPoint3D(); dataPoint3D5.index = dataPoint3D4.index; dataPoint3D5.dataPoint = dataPoint3D4.dataPoint; dataPoint3D5.xPosition = dataPoint3D4.xPosition; dataPoint3D5.yPosition = (double)((firstPoint.xPosition <= secondPoint.xPosition) ? pointF.Y : pointF2.Y); DataPoint3D dataPoint3D6 = new DataPoint3D(); dataPoint3D6.index = dataPoint3D4.index; dataPoint3D6.dataPoint = dataPoint3D4.dataPoint; dataPoint3D6.xPosition = dataPoint3D4.xPosition; dataPoint3D6.yPosition = dataPoint3D4.yPosition; graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames2, positionZ, depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D5, dataPoint3D6, points, pointIndex, 0f, operationType, LineSegmentType.Single, true, true, area.reverseSeriesOrder, base.multiSeries, 0, true); break; } case SurfaceNames.Right: { if (surfaceSegmentType != 0 && (area.reverseSeriesOrder || surfaceSegmentType != LineSegmentType.Last)) { if (!area.reverseSeriesOrder) { break; } if (surfaceSegmentType != LineSegmentType.First) { break; } } DataPoint3D dataPoint3D11 = (secondPoint.xPosition >= firstPoint.xPosition) ? secondPoint : firstPoint; DataPoint3D dataPoint3D12 = new DataPoint3D(); dataPoint3D12.index = dataPoint3D11.index; dataPoint3D12.dataPoint = dataPoint3D11.dataPoint; dataPoint3D12.xPosition = dataPoint3D11.xPosition; dataPoint3D12.yPosition = (double)((secondPoint.xPosition >= firstPoint.xPosition) ? pointF2.Y : pointF.Y); DataPoint3D dataPoint3D13 = new DataPoint3D(); dataPoint3D13.index = dataPoint3D11.index; dataPoint3D13.dataPoint = dataPoint3D11.dataPoint; dataPoint3D13.xPosition = dataPoint3D11.xPosition; dataPoint3D13.yPosition = dataPoint3D11.yPosition; graphicsPath2 = graph.Draw3DSurface(area, matrix, lightStyle, surfaceNames2, positionZ, depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, dataPoint3D12, dataPoint3D13, points, pointIndex, 0f, operationType, LineSegmentType.Single, true, true, area.reverseSeriesOrder, base.multiSeries, 0, true); break; } case SurfaceNames.Back: { DataPoint3D dataPoint3D7 = new DataPoint3D(); dataPoint3D7.index = firstPoint.index; dataPoint3D7.dataPoint = firstPoint.dataPoint; dataPoint3D7.xPosition = firstPoint.xPosition; dataPoint3D7.yPosition = (double)pointF.Y; DataPoint3D dataPoint3D8 = new DataPoint3D(); dataPoint3D8.index = secondPoint.index; dataPoint3D8.dataPoint = secondPoint.dataPoint; dataPoint3D8.xPosition = secondPoint.xPosition; dataPoint3D8.yPosition = (double)pointF2.Y; SurfaceNames thinBorders2 = (SurfaceNames)0; if (flag3) { switch (surfaceSegmentType) { case LineSegmentType.Single: thinBorders2 = (SurfaceNames.Left | SurfaceNames.Right); break; case LineSegmentType.First: thinBorders2 = SurfaceNames.Left; break; case LineSegmentType.Last: thinBorders2 = SurfaceNames.Right; break; } } graphicsPath2 = graph.Draw3DPolygon(area, matrix, lightStyle, surfaceNames2, positionZ, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D8, dataPoint3D7, points, pointIndex, 0f, operationType, lineSegmentType, thinBorders2); break; } case SurfaceNames.Front: { DataPoint3D dataPoint3D2 = new DataPoint3D(); dataPoint3D2.index = firstPoint.index; dataPoint3D2.dataPoint = firstPoint.dataPoint; dataPoint3D2.xPosition = firstPoint.xPosition; dataPoint3D2.yPosition = (double)pointF.Y; DataPoint3D dataPoint3D3 = new DataPoint3D(); dataPoint3D3.index = secondPoint.index; dataPoint3D3.dataPoint = secondPoint.dataPoint; dataPoint3D3.xPosition = secondPoint.xPosition; dataPoint3D3.yPosition = (double)pointF2.Y; if (area.reverseSeriesOrder) { switch (lineSegmentType) { case LineSegmentType.First: lineSegmentType = LineSegmentType.Last; break; case LineSegmentType.Last: lineSegmentType = LineSegmentType.First; break; } } switch (surfaceSegmentType) { case LineSegmentType.First: if (lineSegmentType == LineSegmentType.First) { goto default; } goto case LineSegmentType.Middle; default: if (surfaceSegmentType != LineSegmentType.Last) { break; } if (lineSegmentType == LineSegmentType.Last) { break; } goto case LineSegmentType.Middle; case LineSegmentType.Middle: lineSegmentType = LineSegmentType.Middle; break; case LineSegmentType.Single: break; } SurfaceNames thinBorders = (SurfaceNames)0; if (flag3) { switch (surfaceSegmentType) { case LineSegmentType.Single: thinBorders = (SurfaceNames.Left | SurfaceNames.Right); break; case LineSegmentType.First: thinBorders = SurfaceNames.Left; break; case LineSegmentType.Last: thinBorders = SurfaceNames.Right; break; } } graphicsPath2 = graph.Draw3DPolygon(area, matrix, lightStyle, surfaceNames2, positionZ + depth, color2, color3, dataPoint3D.dataPoint.BorderWidth, borderStyle, firstPoint, secondPoint, dataPoint3D3, dataPoint3D2, points, pointIndex, 0f, operationType, lineSegmentType, thinBorders); break; } } if (i == 2 && graphicsPath != null && graphicsPath2 != null && graphicsPath2.PointCount > 0) { graphicsPath.CloseFigure(); graphicsPath.SetMarkers(); graphicsPath.AddPath(graphicsPath2, true); } } } } return(graphicsPath); } return(graphicsPath); IL_03d1: DataPoint3D axisIntersection = this.GetAxisIntersection(firstPoint, secondPoint, num); for (int num4 = 0; num4 <= 1; num4++) { GraphicsPath graphicsPath3 = null; if (num4 == 0 && !reversed) { goto IL_03f7; } if (num4 == 1 && reversed) { goto IL_03f7; } goto IL_045f; IL_03f7: axisIntersection.dataPoint = secondPoint.dataPoint; axisIntersection.index = secondPoint.index; graphicsPath3 = this.Draw3DSurface(firstPoint, axisIntersection, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop, clipOnBottom); goto IL_045f; IL_046e: axisIntersection.dataPoint = firstPoint.dataPoint; axisIntersection.index = firstPoint.index; graphicsPath3 = this.Draw3DSurface(axisIntersection, secondPoint, reversed, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, surfaceSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, clipOnTop, clipOnBottom); goto IL_04d6; IL_045f: if (num4 == 1 && !reversed) { goto IL_046e; } if (num4 == 0 && reversed) { goto IL_046e; } goto IL_04d6; IL_04d6: if (graphicsPath != null && graphicsPath3 != null && graphicsPath3.PointCount > 0) { graphicsPath.AddPath(graphicsPath3, true); } } return(graphicsPath); }
protected override GraphicsPath Draw3DSurface(ChartArea area, ChartGraphics graph, Matrix3D matrix, LightStyle lightStyle, DataPoint3D prevDataPointEx, float positionZ, float depth, ArrayList points, int pointIndex, int pointLoopIndex, float tension, DrawingOperationTypes operationType, float topDarkening, float bottomDarkening, PointF thirdPointPosition, PointF fourthPointPosition, bool clippedSegment) { GraphicsPath graphicsPath = ((operationType & DrawingOperationTypes.CalcElementPath) == DrawingOperationTypes.CalcElementPath) ? new GraphicsPath() : null; if (base.centerPointIndex == 2147483647) { base.centerPointIndex = base.GetCenterPointIndex(points); } DataPoint3D dataPoint3D = (DataPoint3D)points[pointIndex]; int num = pointIndex; DataPoint3D dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, base.multiSeries ? dataPoint3D : null, ref num); bool flag = false; if (dataPoint3D2.index > dataPoint3D.index) { DataPoint3D dataPoint3D3 = dataPoint3D2; dataPoint3D2 = dataPoint3D; dataPoint3D = dataPoint3D3; flag = true; } if (matrix.perspective != 0.0 && base.centerPointIndex != 2147483647) { num = pointIndex; if (pointIndex != base.centerPointIndex + 1) { dataPoint3D2 = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, base.multiSeries ? dataPoint3D : null, ref num); } else if (!area.reverseSeriesOrder) { dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D2.index + 1, base.multiSeries ? dataPoint3D : null, ref num); } else { dataPoint3D2 = dataPoint3D; dataPoint3D = ChartGraphics3D.FindPointByIndex(points, dataPoint3D.index - 1, base.multiSeries ? dataPoint3D : null, ref num); } } if (dataPoint3D2 != null && dataPoint3D != null) { DataPoint3D dataPoint3D4 = dataPoint3D; if (prevDataPointEx.dataPoint.Empty) { dataPoint3D4 = prevDataPointEx; } else if (dataPoint3D2.index > dataPoint3D.index) { dataPoint3D4 = dataPoint3D2; } if (!base.useBorderColor) { Color color = dataPoint3D4.dataPoint.Color; } else { Color borderColor = dataPoint3D4.dataPoint.BorderColor; } ChartDashStyle borderStyle = dataPoint3D4.dataPoint.BorderStyle; if (dataPoint3D4.dataPoint.Empty && dataPoint3D4.dataPoint.Color == Color.Empty) { Color gray = Color.Gray; } if (dataPoint3D4.dataPoint.Empty) { ChartDashStyle borderStyle2 = dataPoint3D4.dataPoint.BorderStyle; } flag = false; for (int i = 1; pointIndex + i < points.Count; i++) { DataPoint3D dataPoint3D5 = (DataPoint3D)points[pointIndex + i]; if (dataPoint3D5.dataPoint.series.Name == dataPoint3D2.dataPoint.series.Name) { if (dataPoint3D5.index == dataPoint3D2.index) { flag = true; } break; } } if (tension != 0.0) { GraphicsPath splineFlattenPath = graph.GetSplineFlattenPath(area, matrix, positionZ, depth, dataPoint3D2, dataPoint3D, points, pointIndex, tension, true, false, 0); PointF[] array = null; flag = (pointIndex < num); if (flag) { splineFlattenPath.Reverse(); } array = splineFlattenPath.PathPoints; DataPoint3D dataPoint3D6 = new DataPoint3D(); DataPoint3D dataPoint3D7 = new DataPoint3D(); LineSegmentType lineSegmentType = LineSegmentType.Middle; for (int j = 1; j < array.Length; j++) { if (!flag) { dataPoint3D6.dataPoint = dataPoint3D2.dataPoint; dataPoint3D6.index = dataPoint3D2.index; dataPoint3D6.xPosition = (double)array[j - 1].X; dataPoint3D6.yPosition = (double)array[j - 1].Y; dataPoint3D7.dataPoint = dataPoint3D.dataPoint; dataPoint3D7.index = dataPoint3D.index; dataPoint3D7.xPosition = (double)array[j].X; dataPoint3D7.yPosition = (double)array[j].Y; } else { dataPoint3D7.dataPoint = dataPoint3D2.dataPoint; dataPoint3D7.index = dataPoint3D2.index; dataPoint3D7.xPosition = (double)array[j - 1].X; dataPoint3D7.yPosition = (double)array[j - 1].Y; dataPoint3D6.dataPoint = dataPoint3D.dataPoint; dataPoint3D6.index = dataPoint3D.index; dataPoint3D6.xPosition = (double)array[j].X; dataPoint3D6.yPosition = (double)array[j].Y; } lineSegmentType = LineSegmentType.Middle; if (j == 1) { lineSegmentType = (LineSegmentType)((!flag) ? 1 : 3); } else if (j == array.Length - 1) { lineSegmentType = (LineSegmentType)(flag ? 1 : 3); } area.IterationCounter = 0; GraphicsPath graphicsPath2 = this.Draw3DSurface(dataPoint3D6, dataPoint3D7, flag, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, 0f, operationType, lineSegmentType, topDarkening, bottomDarkening, new PointF(float.NaN, float.NaN), new PointF(float.NaN, float.NaN), clippedSegment, true, true); if (graphicsPath != null && graphicsPath2 != null && graphicsPath2.PointCount > 0) { graphicsPath.AddPath(graphicsPath2, true); } } return(graphicsPath); } return(this.Draw3DSurface(dataPoint3D2, dataPoint3D, flag, area, graph, matrix, lightStyle, prevDataPointEx, positionZ, depth, points, pointIndex, pointLoopIndex, tension, operationType, LineSegmentType.Single, topDarkening, bottomDarkening, thirdPointPosition, fourthPointPosition, clippedSegment, true, true)); } return(graphicsPath); }