我有一个点列表,并想确定它们是否形成一个圆圈

时间:2013-12-27 13:38:31

标签: c# list math vector gestures

我正在使用C#,我有一个矢量点列表,并希望尝试近似它们看起来像圆圈的距离。

任何想法如何实现这个或其他人有吗?

4 个答案:

答案 0 :(得分:3)

另一种可能性:

  1. 找到质心 (http://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points) 分数
  2. 确定每个点距离(半径)的位置 质心
  3. 计算分布并确定是否为分数 在可接受的公差范围内(例如标准偏差<±0.05×平均半径或类似的范围)
  4. 如果不了解更多关于积分来源的信息,很难提出最佳解决方案。

    这些可能有用:http://link.springer.com/article/10.1007%2FBF02276879#page-1http://www.dtcenter.org/met/users/docs/write_ups/circle_fit.pdf。这些方法将为您提供最佳点,但您仍需要确定您的数据点是否足够接近您的目的。

    更新:基于'gesture'标记,有人已经实现了它:http://depts.washington.edu/aimgroup/proj/dollar/

答案 1 :(得分:3)

基于“手势”标签,我猜您不仅想知道这些点与最小圆圈的距离有多近(搜索“最小圆圈问题”),但您还必须关注它们的顺序和传播:

enter image description here

  1. 我会从最小圆圈的距离开始。如果它们太远了,你就完成了,它不是一个圆圈。
  2. 如果它们足够接近您配置的阈值,请计算由圆心,第一个点和每个其他点(图片如下)定义的矢量之间的角度
  3. 检查每个角度是否大于之前的角度。
  4. 检查彼此相邻的任意两个角度之间的差异是否超过某个配置的阈值。
  5. 检查最后一个点是否与第一个点足够接近。
  6. 你最终可能会考虑其他一些检查,所以要简化扩展。
  7. enter image description here

答案 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。圆心是三边垂直平分线的交点。

现在对于点集中的每个剩余点,如果距中心的距离不等于半径,则点不在圆上。您可以通过将半径的平方与给定点与中心之间的距离的平方进行比较来加速计算。