How do I draw an annulus (doughnut) using GDI+?

前端 未结 2 957
无人及你
无人及你 2020-12-21 02:59

I have been trying to draw an annulus (ring with thickness) with a transparent hole and a gradient rim in C# with very little success. Does anyone have any suggestions on ho

相关标签:
2条回答
  • 2020-12-21 03:19

    This is how I did it in the Scrolling Game Development Kit:

    pTemp = new GraphicsPath();
    pTemp.AddEllipse(Start.X, Start.Y, End.X - Start.X, End.Y - Start.Y);
    pTemp.AddEllipse((Start.X * 3 + End.X) / 4f,
                     (Start.Y * 3 + End.Y) / 4f,
                     (End.X - Start.X) / 2f,
                     (End.Y - Start.Y) / 2f);
    PathGradientBrush pgb = new PathGradientBrush(pTemp);
    Blend b = new Blend();
    b.Factors = new float[] { 0, 1, 1 };
    b.Positions = new float[] { 0, .5F, 1 };
    pgb.Blend = b;
    pgb.CenterColor = ((SolidBrush)CurrentBrush).Color;
    pgb.SurroundColors = new Color[] {CurrentPen.Color};
    gTarget.FillPath(pgb, pTemp);
    pgb.Dispose();
    pTemp.Dispose();
    


    (source: enigmadream.com)

    I edited the original SGDK code for this sample because originally I wasn't smart enough to scale the gradient to exclude the hole, but now I guess I am :).

    If you would rather see the gradient like this:


    (source: enigmadream.com)

    Then change the blend code to look like this:

    Blend blend = new Blend();
    blend.Factors = new float[] { 0, 1, 0, 0 };
    blend.Positions = new float[] { 0, 0.25F, .5F, 1 };
    pgb.Blend = blend;
    
    0 讨论(0)
  • 2020-12-21 03:25

    You may use two calls to Graphics.DrawArc combined, drawing the top and bottom or left and right portions of the annulus, one portion at a time.

    0 讨论(0)
提交回复
热议问题