使用三个点绘制C#弧形图形

12

我需要使用GraphicsPath绘制一条弧线,该弧线具有初始点、中间点和结束点,并且必须经过它们。

我尝试过.DrawCurve和.DrawBezier,但结果并不完全是一条弧线。

我该怎么办?

解决方案:

在写了几个小时的代码后,我使用以下算法成功地绘制了我想要的内容(给出3个点a、b、c和一个GraphicsPath路径):

double d = 2 * (a.X - c.X) * (c.Y - b.Y) + 2 * (b.X - c.X) * (a.Y - c.Y);
double m1 = (Math.Pow(a.X, 2) - Math.Pow(c.X, 2) + Math.Pow(a.Y, 2) - Math.Pow(c.Y, 2));
double m2 = (Math.Pow(c.X, 2) - Math.Pow(b.X, 2) + Math.Pow(c.Y, 2) - Math.Pow(b.Y, 2));
double nx = m1 * (c.Y - b.Y) + m2 * (c.Y - a.Y);
double ny = m1 * (b.X - c.X) + m2 * (a.X - c.X);
double cx = nx / d;
double cy = ny / d;
double dx = cx - a.X;
double dy = cy - a.Y;
double distance = Math.Sqrt(dx * dx + dy * dy);
Vector va = new Vector(a.X - cx, a.Y - cy);
Vector vb = new Vector(b.X - cx, b.Y - cy);
Vector vc = new Vector(c.X - cx, c.Y - cy);
Vector xaxis = new Vector(1, 0);
float startAngle = (float)Vector.AngleBetween(xaxis, va);
float sweepAngle = (float)(Vector.AngleBetween(va, vb) + Vector.AngleBetween(vb, vc));
path.AddArc(
    (float)(cx - distance), (float)(cy - distance),
    (float)(distance * 2), (float)(distance * 2), 
    startAngle, sweepAngle);

1
你是指圆弧还是任何弧线都可以? - Pete Kirkham
循环的,我忘记添加了。 - Keeper
2个回答

7

我建议使用ANC_Michael提出的DrawArc()。要找到一个通过3个点的弧,您需要计算由这些点形成的三角形的外接圆

一旦您有了外接圆,请使用最小/最大尺寸(中心+/-半径)计算用于DrawArc的圆的边界框。现在通过将点平移使外接圆位于原点上(平移-circumcenter),并使用归一化的起始和结束向量与X轴进行点积来计算起始和停止角度:

double startAngle = Math.Acos(VectorToLeftPoint.Dot(XAxis));
double stopAngle = Math.Acos(VectorToRightPoint.Dot(XAxis));

请注意,DrawArc 函数期望的角度是相对于 X 轴顺时针方向的,所以如果计算得到的向量在 X 轴上方,你需要添加 Math.PI。这就足够调用 DrawArc() 了。
编辑提示:此方法将找到一个圆形弧线,但根据期望的端点行为,不一定是“最佳拟合”弧线。

1
你尝试过使用DrawArc方法并尝试以某种方式操纵你的三个点吗?
也许可以试试。
Pen blackPen= new Pen(Color.Black, 3);
// Create rectangle to bound ellipse.
Rectangle rect = new Rectangle(initial x, initial y, final x, median y);
// Create start and sweep angles on ellipse.
float startAngle =  0F;
float sweepAngle = 270.0F;
// Draw arc to screen.
e.Graphics.DrawArc(blackPen, rect, startAngle, sweepAngle);

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc%28VS.71%29.aspx


我没有角度,也不知道如何计算它们,而且点可以在任何地方(它们是从Oracle中的FDO中的AutoMap 3D导出的)。 - Keeper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接