我需要使用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),startAngle,sweepAngle);
解决方法
我将使用由ANC_Michael建议的DrawArc().要找到一个通过3点的圆弧,您想要计算由点形成的三角形的
circumcircle.
一旦你有外接圆使用最小/最大尺寸(中心/ – 半径)计算一个使用DrawArc的圆的边框.现在通过翻译点来计算起始和终止角度,以便外接圆以原点为中心(由-circumcenter翻译),并使用X轴取代归一化的开始和结束向量的点积:
double startAngle = Math.Acos(VectorToLeftPoint.Dot(XAxis)); double stopAngle = Math.Acos(VectorToRightPoint.Dot(XAxis));
请注意,DrawArc期望从X轴顺时针旋转角度,因此如果计算的向量高于x轴,则应该添加Math.PI.这应该是足够的信息来调用DrawArc().
编辑:此方法将找到圆弧,而不一定是“最佳拟合”弧,具体取决于您的预期端点行为.