我正在尝试绘制类似于3个参数的形状
切出部分是圆圈的底部。
我发现我可以使用
var path = new GraphicsPath();
path.AddEllipse(new RectangleF(center.X - radius, center.Y - radius, radius*2, radius*2))
// ....
g.DrawPath(path);
但是,我怎么画这样的东西?
BTW,那个形状叫什么名字?由于缺乏术语,我无法搜索以前的问题。感谢。
答案 0 :(得分:5)
在这里,把它放在一些油漆事件中:
// 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。
答案 1 :(得分:3)
我认为您可以尝试使用AddArc然后使用CloseFigure
答案 2 :(得分:0)
以下是我绘制所需图形的方法的实现:
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);
}
这看起来像: