我正在使用C#,我有一个矢量点列表,并希望尝试近似它们看起来像圆圈的距离。
任何想法如何实现这个或其他人有吗?
答案 0 :(得分:3)
另一种可能性:
如果不了解更多关于积分来源的信息,很难提出最佳解决方案。
这些可能有用:http://link.springer.com/article/10.1007%2FBF02276879#page-1和http://www.dtcenter.org/met/users/docs/write_ups/circle_fit.pdf。这些方法将为您提供最佳点,但您仍需要确定您的数据点是否足够接近您的目的。
更新:基于'gesture'标记,有人已经实现了它:http://depts.washington.edu/aimgroup/proj/dollar/
答案 1 :(得分:3)
基于“手势”标签,我猜您不仅想知道这些点与最小圆圈的距离有多近(搜索“最小圆圈问题”),但您还必须关注它们的顺序和传播:
答案 2 :(得分:2)
1)从该列表中选择任意三个点,找到相应圆圈的中心
我们可以这样做,使用三角形外接圆构造方法,你可以找到三个边的中位数(两个就足够了),它们的交点是圆的中心。像这样:
public PointF findCenter(PointF a, PointF b, PointF c)
{
float k1 = (a.Y - b.Y) / (a.X - b.X) //Two-point slope equation
float k2 = (a.Y - c.Y) / (a.X - c.X) //Same for the (A,C) pair
PointF midAB = new PointF((a.X + b.X) / 2, (a.Y + b.Y) / 2) //Midpoint formula
PointF midAC = new PointF((a.X + c.X) / 2, (a.Y + c.Y) / 2) //Same for the (A,C) pair
k1 = -1*k1; //If two lines are perpendicular, then the product of their slopes is -1.
k2 = -1*k2; //Same for the other slope
float n1 = midAB.Y - k1*midAB.X; //Determining the n element
float n2 = midAC.Y - k2*midAC.Y; //Same for (A,C) pair
//Solve y1=y2 for y1=k1*x1 + n1 and y2=k2*x2 + n2
float x = (n2-n1) / (k1-k2);
float y = k1*x + n1;
return new PointF(x,y);
}
2)检查其他点是否与这个中心等距离,如果是,你有一个圆圈,如果不是,你没有。
P.S。我还没有测试过代码,所以要准备调试。询问您是否还需要其他任何东西
答案 3 :(得分:1)
从你的观点中取出任意三分。
如果这些点是co-linear
那么,你的点集并不是全部都在一个圆圈上。
找到三角形的circumcircle。直径由下式给出:d = (a*b*c)/2*area
。圆心是三边垂直平分线的交点。
现在对于点集中的每个剩余点,如果距中心的距离不等于半径,则点不在圆上。您可以通过将半径的平方与给定点与中心之间的距离的平方进行比较来加速计算。