【问题标题】:Identify shape based on arbitrary number of points根据任意数量的点识别形状
【发布时间】:2011-07-07 15:30:49
【问题描述】:

这是一个艰难的过程。我正在尝试编写代码来识别基于任意数量的点的形状。

基本上,通过触摸界面,用户将“绘制”一个形状(并通过一定数量的触摸点进行跟踪),然后我在二维表面上留下了一些点。

基于这些点,我需要估计轮廓的形状是三角形、正方形还是圆形。最简单的方法是什么?有什么想法吗?

【问题讨论】:

  • 机械土耳其人的又一项了不起的任务:D
  • @svth : +1 提问者分享代码

标签: geometry


【解决方案1】:

一个好的第一步是减少点的数量以找到用户试图绘制直线的位置 - Ramer–Douglas–Peucker 算法适用于此。

【讨论】:

  • 非常感谢您的指点!现在,我已经使用 Douglas-Peucker 让一切正常运行。
  • 顺便说一句,如果有人遇到这个线程并想要我的 Douglas-Peucker 的 Objective C 实现,这里是:sveinbjorn.org/files/software/dp-objc.zip
【解决方案2】:

尝试找到最适合最小二乘点的曲线、三角形和正方形。无论哪种形状具有最小的方差/标准偏差,都可能是可疑的。找到最合适的形状可能有点棘手。

将圆刻画为中心点和半径。找到最小化方差的点和半径。在这种情况下,对于给定的点和半径,很容易计算方差。快速 Google 搜索会找到一篇标题为 Finding a Circle that Best Fits a Set of Points 的论文,其中包含必要的数学知识。

正方形有一个中心点、边长和旋转角度(0 到 90 度)。方差计算起来有点棘手,因为您需要确定象限以找到距离需要最小化的最近边,或者计算到所有四个边的距离并只保留最小的边。原理相同,但你有三个变量而不是两个。

对于三角形,可能选择三个点作为角并最小化到边距的平方。与正方形一样,您需要弄清楚每个点实际上离哪一侧最近。

我猜如果您可以为用户假设良好的绘图技巧,那么您可能只需猜测每个形状的合适度,然后检查哪个形状最合适。圆 - 中心是所有点的平均值,半径是到中心的平均距离。三角形 - 以中心作为所有点的平均值,离中心最远的点是一个顶点,离那个顶点最远的点是另一个顶点,离它们之间的连线最远的点是第三个顶点。正方形 - 类似于三角形,但添加一个点,距第三个顶点最远,以获得一般四边形。不确定这种方法的容忍度如何,但是否足以满足您的目的?无论哪种方式,它都可能对解决最小二乘问题的数值方法做出很好的初步猜测。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多