【问题标题】:How to find Edges and Vertices of a hand drawn polygon如何找到手绘多边形的边和顶点
【发布时间】:2011-09-08 05:20:26
【问题描述】:

我想制作一个形状识别程序,它可以跟踪鼠标并以每 1/2 秒记录它的位置。我怎样才能使用这些点来找到一个粗糙的多边形?换句话说,如果你只是画一个类似三角形或正方形的形状,它很可能是 50-100 边形,我怎样才能简化它以获得我想要绘制的形状?我知道你可以做一个遗传算法,但不知道具体是如何工作的,我想知道任何替代方案。

编辑:凸包不起作用,需要保留凹面。

【问题讨论】:

    标签: algorithm gesture-recognition image-recognition vertices edges


    【解决方案1】:

    对于沿 100 边形的每个点,找到由该点和两边的点形成的小三角形的面积。删除创建最小三角形的点。重复直到最小的三角形大于某个阈值。

    【讨论】:

    • 或者重复,直到最小的三角形比主要形状面积的某个百分比大。
    • 哪个更有效,尺寸或角度测量?
    • 例如,对于[P1, P2, P3 ... PN]中的Pi,如果m∠p(i-1)p(i)p(i+1) > threshold ?
    • 我不知道。我想你得试试看。我的猜测是尺寸会更有效,因为当鼠标缓慢移动并且生成的点靠得很近时,即使它不是预期形状的真实角度,也可能会发生角度的大变化。
    • 但是当它移动得更快时,三角形变得比它移动慢时更大......我几乎有角度运行,我会尝试两个。也许混合动力车效果最好?
    【解决方案2】:

    我会试一试。

    1. 让我们在鼠标点击事件发生点START时调用位置
    2. 每个区间都采用另一个名为 CURR 的位置
    3. 让我们调用之前的 CURR,PREV
    4. 计算 CURR 和 PREV 之间的斜率(delta y/delta x),
    5. 计算 CURR 和 START 之间直线的斜率
    6. 为两个斜率之间的差异定义一些阈值
    7. 如果斜率超过阈值,
      1. 将 START 和 CURR 之间的行存储为 SIDE
      2. 将 CURR 定义为新的 START
    8. 重复直到 CURR 在原始 START 的某个半径范围内或穿过之前的一侧

    你可以简单地通过边数来确定形状。

    【讨论】:

    • 我喜欢这个解决方案,但我只能接受一个答案,另一个更直观一点,所以我先从它开始。
    • +1 恕我直言,使用斜率比计算三角形区域要好得多,作为丢弃共线点的更广泛的解决方案,尤其是在处理像素坐标时。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2011-09-19
    • 2019-10-23
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多