C#绘制弧3点

前端之家收集整理的这篇文章主要介绍了C#绘制弧3点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要使用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().

编辑:此方法将找到圆弧,而不一定是“最佳拟合”弧,具体取决于您的预期端点行为.

猜你在找的C#相关文章