简体   繁体   中英

How to draw a (value)% Circle

I want to use Path to draw a partly circle like 25% circle (1/4, 90degree circle, 360 degree is a full circle) I can use ArcSegment to do that, but 25% is easy because the number is simple and you can easily guess the point. But when I want to draw a 20% circle 1/5 72degree circle) I can't guess anymore be cause the is not a float value so I came up with 4 Equations

For 0->90 degree (unit value = Degree (Eg: 20degree)) x,y = ArcSegment.Point(x,y)
 x = (PathWidth / 2) + [Sin(value) *50] 
 y = [Sin(value) *50]
For 90->180 degree 
 x, y= (PathWidth / 2) + [Sin(value) *50]
For 180->270 : Sorry I don't know ;(

For example I want a 25% circle in a 100x100 Path (Start point is 50,0) then 25% is 1/4 = 90 degree: Apply my equation I mention above, We have:

x = (100/2) + Sin(90) * 50 = 100
y = Sin(90) * 50 = 50

So the ArcSegment.Point="100,50" and we a 50% circle

But I think the equation is not effective and maybe( I not verify yet) Inaccurate and we need 4 equations to accomplish the a partly circle (1->99%) circle. So Could you improve the equation I use above

Sorry for my bad English because English is not my first language.

The following method creates a PathGeometry with a single circular ArcSegment , which will work from 0 up to, but not including, 360 degrees. The center of the circle is a coordinates (0, 0) .

It is important to set the ArcSegment's IsLargeArc property to true if the angle is larger than 180 degrees.

private Geometry CreateArc(double radius, double angle)
{
    var endPoint = new Point(
        radius * Math.Sin(angle * Math.PI / 180),
        radius * -Math.Cos(angle * Math.PI / 180));

    var segment = new ArcSegment(
        endPoint, new Size(radius, radius), 0,
        angle >= 180, SweepDirection.Clockwise, true);

    var figure = new PathFigure { StartPoint = new Point(0, -radius) };
    figure.Segments.Add(segment);

    var geometry = new PathGeometry();
    geometry.Figures.Add(figure);

    return geometry;
}

If you need to draw a full circle, you'll have to add a second ArcSegment, or return an EllipseGeometry.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM