|
|
|
@ -41,12 +41,12 @@ namespace Avalonia.Controls.Shapes |
|
|
|
get => GetValue(SweepAngleProperty); |
|
|
|
set => SetValue(SweepAngleProperty, value); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override Geometry CreateDefiningGeometry() |
|
|
|
{ |
|
|
|
var angle1 = DegreesToRad(StartAngle); |
|
|
|
var angle2 = angle1 + DegreesToRad(SweepAngle); |
|
|
|
|
|
|
|
|
|
|
|
var startAngle = Math.Min(angle1, angle2); |
|
|
|
var sweepAngle = Math.Max(angle1, angle2); |
|
|
|
|
|
|
|
@ -72,29 +72,30 @@ namespace Avalonia.Controls.Shapes |
|
|
|
|
|
|
|
var radiusX = deflatedRect.Width / 2; |
|
|
|
var radiusY = deflatedRect.Height / 2; |
|
|
|
|
|
|
|
|
|
|
|
var angleGap = RadToNormRad(sweepAngle - startAngle); |
|
|
|
|
|
|
|
var startPoint = GetRingPoint(radiusX, radiusY, centerX, centerY, startAngle); |
|
|
|
var endPoint = GetRingPoint(radiusX, radiusY, centerX, centerY, sweepAngle); |
|
|
|
|
|
|
|
var arcGeometry = new StreamGeometry(); |
|
|
|
|
|
|
|
|
|
|
|
using (var ctx = arcGeometry.Open()) |
|
|
|
{ |
|
|
|
ctx.BeginFigure(startPoint, false); |
|
|
|
ctx.ArcTo(endPoint, new Size(radiusX, radiusY), angleGap, angleGap >= Math.PI, SweepDirection.Clockwise); |
|
|
|
ctx.ArcTo(endPoint, new Size(radiusX, radiusY), angleGap, angleGap >= Math.PI, |
|
|
|
SweepDirection.Clockwise); |
|
|
|
ctx.EndFigure(false); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return arcGeometry; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static double DegreesToRad(double inAngle) => |
|
|
|
inAngle * Math.PI / 180; |
|
|
|
|
|
|
|
static double RadToNormRad(double inAngle) => (inAngle % (Math.PI * 2)) + (Math.PI * 2)) % (Math.PI * 2); |
|
|
|
|
|
|
|
static double RadToNormRad(double inAngle) => ((inAngle % (Math.PI * 2)) + (Math.PI * 2)) % (Math.PI * 2); |
|
|
|
|
|
|
|
static Point GetRingPoint(double radiusX, double radiusY, double centerX, double centerY, double angle) => |
|
|
|
new Point((radiusX * Math.Cos(angle)) + centerX, (radiusY * Math.Sin(angle)) + centerY); |
|
|
|
|