C# Draw Circle с GraphicsPath, часть которого вырезана

Я пытаюсь нарисовать что-то вроде следующих фигур с 3 параметрами

  • радиус
  • центр
  • cutOutLen

вырезанная часть является нижней частью круга.

Я понял, что я могу использовать

var path = new GraphicsPath();
path.AddEllipse(new RectangleF(center.X - radius, center.Y - radius, radius*2, radius*2))
// ....
g.DrawPath(path);

но как я могу нарисовать такую ​​вещь?

Кстати, как называется эта форма? Я не мог искать предыдущие вопросы или что-то из-за отсутствия терминологии.

Благодарю.

3 ответа

Вот, пожалуйста, разместите это в каком-нибудь событии рисования:

// set up your values
float radius = 50;
PointF center = new Point( 60,60);
float cutOutLen = 20;

RectangleF circleRect = 
           new RectangleF(center.X - radius, center.Y - radius, radius * 2, radius * 2);

// the angle
float alpha = (float) (Math.Asin(1f * (radius - cutOutLen) / radius) / Math.PI * 180);

var path = new GraphicsPath();
path.AddArc(circleRect, 180 - alpha, 180 + 2 * alpha);
path.CloseFigure();

e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.FillPath(Brushes.Yellow, path);
e.Graphics.DrawPath(Pens.Red, path);

path.Dispose();

Вот результат:

вырезать круг

Я не уверен насчет срока среза круга; по сути это Thales Cirlce.

Я думаю, что вы можете попробовать использовать AddArc, а затем CloseFigure

Вот моя реализация метода, который рисует желаемую фигуру:

    void DrawCutCircle(Graphics g, Point centerPos, int radius, int cutOutLen)
    {
        RectangleF rectangle = new RectangleF(
                        centerPos.X - radius,
                        centerPos.Y - radius,
                        radius * 2,
                        radius * 2);

        // calculate the start angle
        float startAngle = (float)(Math.Asin(
            1f * (radius - cutOutLen) / radius) / Math.PI * 180);

        using (GraphicsPath path = new GraphicsPath())
        {
            path.AddArc(rectangle, 180 - startAngle, 180 + 2 * startAngle);
            path.CloseFigure();

            g.FillPath(Brushes.Yellow, path);
            using (Pen p = new Pen(Brushes.Yellow))
            {
                g.DrawPath(new Pen(Brushes.Blue, 3), path);
            }
        }
    }

Вы можете использовать его следующим образом:

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        DrawCutCircle(e.Graphics, new Point(210, 210), 200, 80);
    }

Это выглядит так:

Другие вопросы по тегам