【问题标题】:java circle recognition from an arraylist of points来自点数组列表的java圆识别
【发布时间】:2012-11-19 11:27:05
【问题描述】:

我目前有一个来自画布上的手绘点的数组列表。我想知道是否有一个简单的算法来检测该形状是否代表一个圆圈。我已经对此进行了一些研究,我指出的主要项目是霍夫变换或位图图像,但这两者似乎都有点过头了我需要它的顶部。任何指向算法或实现的指针都会非常有帮助。

提前感谢sansom,

【问题讨论】:

  • 您到底想检查什么?列表中的所有点到某个中心的距离是否大致相同,或者是闭环(不是 350° 弧线或螺旋线),还是两者兼而有之?
  • 基本上是检查它是否更像一个圆而不是一条直线。它不需要是一个完美的圆圈。只是如果用户想在画布上添加一个圆圈,他们可以使用鼠标绘制一个圆圈,它可以替换为我可以用 graphics.draw(new Ellipse2D.Double(x, y,rectwidth,rectheight) 绘制的圆圈));

标签: java arraylist detection geometry


【解决方案1】:

如果我正确解释了您的问题,您想知道所有点是否都在一个圆圈上。

如图所示,我们从列表中选择三个点 A、B、C,并计算假定圆的原点 O。通过检查 O 与列表中每个点之间的距离,我们可以判断这些点是否在一个圆上。

【讨论】:

    【解决方案2】:

    如果您不知道用户想要绘制什么(例如,圆、椭圆、直线或矩形),您可以使用一些基本的优化算法来找到与手绘点最匹配的形状。

    • 对于每个基本形状(椭圆形、矩形、三角形、直线等),创建该形状的随机实例并测量误差 w.r.t。给定点
    • (单独)优化每个形状,直到获得与给定点最匹配的椭圆、与点最匹配的矩形、最佳三角形等。
    • 选择误差最小的形状并绘制它

    【讨论】:

    • 非常感谢,这让它更清楚了,我开始搜索优化算法,这很有帮助
    【解决方案3】:

    也许这个答案能给你一些想法:https://stackoverflow.com/a/940041/12860

    简而言之:计算二阶导数。如果它相当一致,它可能是一个圆圈。

    【讨论】:

      【解决方案4】:

      阅读您的评论,绘制圆的更简单方法是用户单击中心点,然后拖动圆的半径。计算量少了很多,用户画起来也更容易。

      您可以对矩形或任何其他凸多边形做同样的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多