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)); }
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())); }
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)); }
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)); }