/// <summary>
        /// Calcuates the tick position.
        /// </summary>
        /// <param name="ticksPosition">The Tick Position</param>
        /// <param name="tickSize">The Tick Size</param>
        /// <param name="width">The Weight</param>
        /// <param name="height">The Height</param>
        /// <param name="x1">The x 1 value</param>
        /// <param name="y1">The y 1 value</param>
        /// <param name="x2">The x 2 value</param>
        /// <param name="y2">The y 2 value</param>
        private void CalculatePosition(
            AxisElementPosition ticksPosition,
            double tickSize,
            double width,
            double height,
            ref double x1,
            ref double y1,
            ref double x2,
            ref double y2)
        {
            Orientation orientaion       = Axis.Orientation;
            bool        isOpposed        = Axis.OpposedPosition;
            double      strokeHalfFactor = MainAxisLine.StrokeThickness / 2;
            bool        isTickInside     = ticksPosition == AxisElementPosition.Inside;

            // Positioning ticksize according to the axis stroke thickness size.
            if (orientaion == Orientation.Horizontal)
            {
                y1 = isOpposed ? !isTickInside ? MainAxisLine.Y1 - strokeHalfFactor : MainAxisLine.Y1 + strokeHalfFactor
                             : isTickInside ? MainAxisLine.Y1 - strokeHalfFactor : MainAxisLine.Y1 + strokeHalfFactor;

                y2 = isOpposed ? !isTickInside ? y1 - tickSize : y1 + tickSize
                             : isTickInside ? y1 - tickSize : y1 + tickSize;
            }
            else
            {
                x1 = isOpposed ? !isTickInside ? MainAxisLine.X1 + strokeHalfFactor : MainAxisLine.X1 - strokeHalfFactor
                              : isTickInside ? MainAxisLine.X1 + strokeHalfFactor : MainAxisLine.X1 - strokeHalfFactor;
                x2 = isOpposed ? !isTickInside ? x1 + tickSize : x1 - tickSize
                              : isTickInside ? x1 + tickSize : x1 - tickSize;
            }
        }
Esempio n. 2
0
 public static void SetPosition(UIElement element, AxisElementPosition value)
 {
     if (element == null)
     {
         throw new ArgumentNullException("element");
     }
     element.SetValue(XYAxisElementsPanel.PositionProperty, (object)value);
 }
        /// <summary>
        /// Renders the tick lines.
        /// </summary>
        /// <param name="finalSize">The Final Size</param>
        /// <param name="linesRecycler">The Line Recycler</param>
        /// <param name="orientation">The Orientation</param>
        /// <param name="tickSize">The Tick Size</param>
        /// <param name="tickPosition">The Tick Postion</param>
        /// <param name="Values">The Values</param>
        private void RenderTicks(
            Size finalSize,
            UIElementsRecycler <Line> linesRecycler,
            Orientation orientation,
            double tickSize,
            AxisElementPosition tickPosition,
            double[] Values)
        {
            int    labelsCount = Values.Length;
            int    linesCount  = linesRecycler.Count;
            double width       = finalSize.Width;
            double height      = finalSize.Height;

            for (int i = 0; i < labelsCount; i++)
            {
                if (i < linesCount)
                {
                    double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
                    Line   line  = linesRecycler[i];
                    double value = this.Axis.ValueToCoefficientCalc(Values[i]);
                    value = double.IsNaN(value) ? 0 : value;

                    if (orientation == Orientation.Horizontal)
                    {
                        x1 = x2 = Axis.ActualPlotOffset + Math.Round((this.Axis.RenderedRect.Width * value));
                    }
                    else
                    {
                        y1 = y2 = (Axis.ActualPlotOffset + Math.Round(this.Axis.RenderedRect.Height * (1 - value)) + 0.5);
                    }

                    CalculatePosition(tickPosition, tickSize, width, height, ref x1, ref y1, ref x2, ref y2);

                    line.X1 = x1;
                    line.X2 = x2;
                    line.Y1 = y1;
                    line.Y2 = y2;
                }
            }
        }
        /// <summary>
        /// Calculates the 3D position for the ticklines.
        /// </summary>
        /// <param name="ticksPosition">The Tick Position</param>
        /// <param name="tickSize">The Tick Size</param>
        /// <param name="x1">The X 1 Value</param>
        /// <param name="y1">The Y 1 Value</param>
        /// <param name="x2">The X 2 Value</param>
        /// <param name="y2">The Y 2 Value</param>
        /// <param name="actualRotationAngle">The Actual Rotation Angle</param>
        private void CalculatePosition3D(AxisElementPosition ticksPosition, double tickSize, ref double x1, ref double y1, ref double x2, ref double y2, double actualRotationAngle)
        {
            var orientation = Axis.Orientation;
            var isOpposed   = Axis.OpposedPosition;

            if (orientation == Orientation.Horizontal)
            {
                isOpposed = isOpposed || Axis.Area.Axes.Where(x => (x is ChartAxisBase3D) && x.Orientation == Orientation.Horizontal && x.OpposedPosition).Any();

                switch (ticksPosition)
                {
                case AxisElementPosition.Inside:
                    y1 = isOpposed ? MainAxisLine.StrokeThickness : 0;
                    y2 = isOpposed ? y1 + tickSize : tickSize;
                    break;

                case AxisElementPosition.Outside:
                    y1 = isOpposed ? 0 : MainAxisLine.StrokeThickness;
                    y2 = isOpposed ? tickSize : y1 + tickSize;
                    break;
                }

                var screenPositionTop  = axis.ArrangeRect.Top + Top;
                var screenPositionLeft = axis.ArrangeRect.Left;
                y1 += screenPositionTop;
                y2 += screenPositionTop;

                if (!(this.Axis as ChartAxisBase3D).IsZAxis)
                {
                    x1 += screenPositionLeft;
                    x2 += screenPositionLeft;
                }
            }
            else
            {
                var axis3D = Axis as ChartAxisBase3D;
                isOpposed = (isOpposed
                             ||
                             ((Axis.ShowAxisNextToOrigin &&
                               ((actualRotationAngle >= 180 && actualRotationAngle < 360)))
                              ||
                              (!Axis.ShowAxisNextToOrigin &&
                               ((axis3D.AxisPosition3D == AxisPosition3D.DepthBackRight) ||
                                ((axis3D.AxisPosition3D == AxisPosition3D.DepthFrontRight) ||
                                 (axis3D.AxisPosition3D == AxisPosition3D.BackRight) ||
                                 (axis3D.AxisPosition3D == AxisPosition3D.DepthFrontLeft) ||
                                 (axis3D.AxisPosition3D == AxisPosition3D.FrontRight))))));
                switch (ticksPosition)
                {
                case AxisElementPosition.Inside:
                    x1 = isOpposed ? 0 : MainAxisLine.StrokeThickness;
                    x2 = isOpposed ? tickSize : x1 + tickSize;
                    break;

                case AxisElementPosition.Outside:
                    x1 = isOpposed ? MainAxisLine.StrokeThickness : 0;
                    x2 = isOpposed ? x1 + tickSize : tickSize;
                    break;
                }

                double screenPositionLeft = 0d;

                switch (axis3D.AxisPosition3D)
                {
                case AxisPosition3D.DepthBackRight:
                case AxisPosition3D.DepthFrontLeft:
                    screenPositionLeft = axis3D.AxisDepth + Left;
                    break;

                case AxisPosition3D.DepthFrontRight:
                case AxisPosition3D.DepthBackLeft:
                    screenPositionLeft = (axis3D.AxisDepth - Left);
                    x1 = -x1; x2 = -x2;
                    break;

                default:
                    screenPositionLeft = axis.ArrangeRect.Left + Left;
                    break;
                }

                x1 += screenPositionLeft;
                x2 += screenPositionLeft;

                var screenPositionTop = axis.ArrangeRect.Top;
                y1 += screenPositionTop;
                y2 += screenPositionTop;
            }
        }
        /// <summary>
        /// Renders the 3D tick lines.
        /// </summary>
        /// <param name="linesRecycler">The Line Recycler</param>
        /// <param name="orientation">The Orientation</param>
        /// <param name="tickSize">The Tick Size</param>
        /// <param name="tickPosition">The Tick Position</param>
        /// <param name="values">The Values</param>
        private void RenderTicks3D(
            UIElementsRecycler <Line> linesRecycler,
            Orientation orientation,
            double tickSize,
            AxisElementPosition tickPosition,
            IList <double> values)
        {
            var area3D = Axis.Area as SfChart3D;
            var actualRotationAngle = area3D.ActualRotationAngle;
            var labelsCount         = values.Count;
            var linesCount          = linesRecycler.Count;

            for (var i = 0; i < labelsCount; i++)
            {
                if (i >= linesCount)
                {
                    continue;
                }
                double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
                var    line  = linesRecycler[i];
                var    value = Axis.ValueToCoefficientCalc(values[i]);
                value = double.IsNaN(value) ? 0 : value;

                if (orientation == Orientation.Horizontal)
                {
                    var tempaxis = axis as ChartAxisBase3D;
                    if (tempaxis.IsManhattanAxis && (axis.RegisteredSeries[i] as ChartSeries3D).Segments != null && (axis.RegisteredSeries[i] as ChartSeries3D).Segments.Count > 0)
                    {
                        var segment = (axis.RegisteredSeries[i] as ChartSeries3D).Segments[0] as ChartSegment3D;
                        x1 = x2 = segment.startDepth + (segment.endDepth - segment.startDepth) / 2;
                    }
                    else
                    {
                        x1 = x2 = Math.Round(Axis.ActualPlotOffset + (Axis.RenderedRect.Width * value));
                    }
                }
                else
                {
                    y1 = y2 = Math.Round(Axis.ActualPlotOffset + (Axis.RenderedRect.Height * (1 - value)));
                }

                CalculatePosition3D(tickPosition, tickSize, ref x1, ref y1, ref x2, ref y2, actualRotationAngle);
                var verticalAxis = area3D.InternalSecondaryAxis.Orientation == Orientation.Vertical ? area3D.InternalSecondaryAxis : area3D.InternalPrimaryAxis;

                if ((axis as ChartAxisBase3D).IsZAxis)
                {
                    // Adding one to prevent the tick hidding.
                    var leftPosition = !verticalAxis.OpposedPosition && actualRotationAngle >= 0 && actualRotationAngle < 180 ? axis.ArrangeRect.Left + 1 : axis.ArrangeRect.Left;

                    ((SfChart3D)Axis.Area).Graphics3D.AddVisual(Polygon3D.CreateLine(line, leftPosition, y1, leftPosition, y2, x1, x1, false));
                }
                else
                {
                    double depth  = 0d;
                    var    axis3D = this.axis as ChartAxisBase3D;
                    Line3D line3D = null;
                    if (orientation == Orientation.Vertical)
                    {
                        if (axis.ShowAxisNextToOrigin)
                        {
                            if (actualRotationAngle >= 90 && actualRotationAngle < 270)
                            {
                                depth = (axis.Area as SfChart3D).ActualDepth;
                            }

                            line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true);
                        }
                        else
                        {
                            if (axis3D.AxisPosition3D == AxisPosition3D.DepthBackRight || axis3D.AxisPosition3D == AxisPosition3D.DepthBackLeft ||
                                axis3D.AxisPosition3D == AxisPosition3D.DepthFrontRight || axis3D.AxisPosition3D == AxisPosition3D.DepthFrontLeft)
                            {
                                line3D = Polygon3D.CreateLine(line, axis.ArrangeRect.Left, y1, axis.ArrangeRect.Left, y2, x1, x2, false);
                            }
                            else
                            {
                                depth  = axis3D.AxisDepth;
                                line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true);
                            }
                        }
                    }
                    else
                    {
                        depth  = axis3D.AxisDepth;
                        line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true);
                    }

                    ((SfChart3D)Axis.Area).Graphics3D.AddVisual(line3D);
                }
            }
        }
Esempio n. 6
0
 public static void SetPosition(UIElement element, AxisElementPosition value)
 {
     if (element == null)
         throw new ArgumentNullException("element");
     element.SetValue(XYAxisElementsPanel.PositionProperty, (object)value);
 }