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);
}
Это выглядит так: