Esempio n. 1
0
    private bool UpdateZeroAngleGeometry(bool relativeMode, double angle)
    {
        Point point2;
        var   flag          = false;
        var   arcPoint      = GeometryHelper.GetArcPoint(angle, LogicalBounds);
        var   logicalBounds = LogicalBounds;
        var   num           = logicalBounds.Width / 2.0;
        var   num2          = logicalBounds.Height / 2.0;

        if (relativeMode || MathHelper.AreClose(num, num2))
        {
            var bound = LogicalBounds.Resize(1.0 - _relativeThickness);
            point2 = GeometryHelper.GetArcPoint(angle, bound);
        }
        else
        {
            var intersect = InnerCurveSelfIntersect(num, num2, _absoluteThickness);
            var numArray  = ComputeAngleRanges(num, num2, intersect, angle, angle);
            var a         = numArray[0] * 3.1415926535897931 / 180.0;
            var vector    = new Vector(num2 * Math.Sin(a), -num * Math.Cos(a));
            point2 = GeometryHelper.GetArcPoint(numArray[0], LogicalBounds) -
                     vector.Normalized() * _absoluteThickness;
        }

        flag |= GeometryHelper.EnsureGeometryType(out var geometry, ref CachedGeometry,
                                                  () => new LineGeometry());
        flag |= geometry.SetIfDifferent(LineGeometry.StartPointProperty, arcPoint);
        return(flag | geometry.SetIfDifferent(LineGeometry.EndPointProperty, point2));
    }
Esempio n. 2
0
    private bool UpdatePieGeometry(double start, double end)
    {
        PathFigure  figure;
        ArcSegment  segment;
        LineSegment segment2;
        var         flag           = false;
        var         cachedGeometry = CachedGeometry as PathGeometry;

        if (cachedGeometry == null || cachedGeometry.Figures.Count != 1 ||
            (figure = cachedGeometry.Figures[0]).Segments.Count != 2 ||
            (segment = figure.Segments[0] as ArcSegment) == null ||
            (segment2 = figure.Segments[1] as LineSegment) == null)
        {
            figure         = new PathFigure();
            CachedGeometry = new PathGeometry
            {
                Figures = { figure }
            };
            figure.Segments.Add(segment  = new ArcSegment());
            figure.Segments.Add(segment2 = new LineSegment());
            figure.IsClosed        = true;
            segment.SweepDirection = SweepDirection.Clockwise;
            flag = true;
        }

        flag |= figure.SetIfDifferent(PathFigure.StartPointProperty,
                                      GeometryHelper.GetArcPoint(start, LogicalBounds));
        flag |= segment.SetIfDifferent(ArcSegment.PointProperty,
                                       GeometryHelper.GetArcPoint(end, LogicalBounds));
        flag |= segment.SetIfDifferent(ArcSegment.SizeProperty, GetArcSize(LogicalBounds));
        flag |= segment.SetIfDifferent(ArcSegment.IsLargeArcProperty, end - start > 180.0);
        return(flag | segment2.SetIfDifferent(LineSegment.PointProperty, LogicalBounds.Center()));
    }
Esempio n. 3
0
    private bool UpdateFullRingGeometry(bool relativeMode)
    {
        var flag = false;

        flag |= GeometryHelper.EnsureGeometryType(out var geometry, ref CachedGeometry,
                                                  () => new PathGeometry());
        flag |= geometry.SetIfDifferent(PathGeometry.FillRuleProperty, FillRule.EvenOdd);
        flag |= geometry.Figures.EnsureListCount(2, () => new PathFigure());
        flag |= PathFigureHelper.SyncEllipseFigure(geometry.Figures[0], LogicalBounds,
                                                   SweepDirection.Clockwise);
        var logicalBounds = LogicalBounds;
        var num           = logicalBounds.Width / 2.0;
        var num2          = logicalBounds.Height / 2.0;

        if (relativeMode || MathHelper.AreClose(num, num2))
        {
            var bounds = LogicalBounds.Resize(1.0 - _relativeThickness);
            return(flag | PathFigureHelper.SyncEllipseFigure(geometry.Figures[1], bounds,
                                                             SweepDirection.Counterclockwise));
        }

        flag |= geometry.Figures[1].SetIfDifferent(PathFigure.IsClosedProperty, true);
        flag |= geometry.Figures[1].SetIfDifferent(PathFigure.IsFilledProperty, true);
        var firstPoint = new Point();
        var intersect  = InnerCurveSelfIntersect(num, num2, _absoluteThickness);
        var angles     = ComputeAngleRanges(num, num2, intersect, 360.0, 0.0);

        flag |= SyncPieceWiseInnerCurves(geometry.Figures[1], 0, ref firstPoint, angles);
        return(flag | geometry.Figures[1].SetIfDifferent(PathFigure.StartPointProperty, firstPoint));
    }
Esempio n. 4
0
    private bool UpdateRingArcGeometry(bool relativeMode, double start, double end)
    {
        var flag = false;

        flag |= GeometryHelper.EnsureGeometryType(out var geometry, ref CachedGeometry,
                                                  () => new PathGeometry());
        flag |= geometry.SetIfDifferent(PathGeometry.FillRuleProperty, FillRule.Nonzero);
        flag |= geometry.Figures.EnsureListCount(1, () => new PathFigure());
        var dependencyObject = geometry.Figures[0];

        flag |= dependencyObject.SetIfDifferent(PathFigure.IsClosedProperty, true);
        flag |= dependencyObject.SetIfDifferent(PathFigure.IsFilledProperty, true);
        flag |= dependencyObject.SetIfDifferent(PathFigure.StartPointProperty,
                                                GeometryHelper.GetArcPoint(start, LogicalBounds));
        flag |= dependencyObject.Segments.EnsureListCountAtLeast(3, () => new ArcSegment());
        flag |= GeometryHelper.EnsureSegmentType(out var segment, dependencyObject.Segments, 0,
                                                 () => new ArcSegment());
        flag |= segment.SetIfDifferent(ArcSegment.PointProperty,
                                       GeometryHelper.GetArcPoint(end, LogicalBounds));
        flag |= segment.SetIfDifferent(ArcSegment.SizeProperty,
                                       new Size(LogicalBounds.Width / 2.0, LogicalBounds.Height / 2.0));
        flag |= segment.SetIfDifferent(ArcSegment.IsLargeArcProperty, end - start > 180.0);
        flag |= segment.SetIfDifferent(ArcSegment.SweepDirectionProperty, SweepDirection.Clockwise);
        flag |= GeometryHelper.EnsureSegmentType(out var segment2, dependencyObject.Segments, 1,
                                                 () => new LineSegment());
        var logicalBounds = LogicalBounds;
        var num           = logicalBounds.Width / 2.0;
        var num2          = logicalBounds.Height / 2.0;

        if (relativeMode || MathHelper.AreClose(num, num2))
        {
            var bound = LogicalBounds.Resize(1.0 - _relativeThickness);
            flag |= segment2.SetIfDifferent(LineSegment.PointProperty,
                                            GeometryHelper.GetArcPoint(end, bound));
            flag |= dependencyObject.Segments.EnsureListCount(3, () => new ArcSegment());
            flag |= GeometryHelper.EnsureSegmentType(out var segment3, dependencyObject.Segments, 2,
                                                     () => new ArcSegment());
            flag |= segment3.SetIfDifferent(ArcSegment.PointProperty,
                                            GeometryHelper.GetArcPoint(start, bound));
            flag |= segment3.SetIfDifferent(ArcSegment.SizeProperty, GetArcSize(bound));
            flag |= segment3.SetIfDifferent(ArcSegment.IsLargeArcProperty, end - start > 180.0);
            return(flag | segment3.SetIfDifferent(ArcSegment.SweepDirectionProperty,
                                                  SweepDirection.Counterclockwise));
        }

        var firstPoint = new Point();
        var intersect  = InnerCurveSelfIntersect(num, num2, _absoluteThickness);
        var angles     = ComputeAngleRanges(num, num2, intersect, end, start);

        flag |= SyncPieceWiseInnerCurves(dependencyObject, 2, ref firstPoint, angles);
        return(flag | segment2.SetIfDifferent(LineSegment.PointProperty, firstPoint));
    }