使用“消化鸭”上显示的漏斗算法,我不确定漏斗的检测如何工作。
有人可以向我清楚地说明该方法,或者建议其他检测漏斗的方法,以及漏斗侧面是否重叠?
使用“消化鸭”上显示的漏斗算法,我不确定漏斗的检测如何工作。
有人可以向我清楚地说明该方法,或者建议其他检测漏斗的方法,以及漏斗侧面是否重叠?
Answers:
该算法从您先前找到的路径开始,在这种情况下为三角形列表:
Mikko博客文章底部的代码构造了portals数组,该数组是代表路径多边形之间的线段的线段列表。这些是平滑路径必须经过的“门户”(或者来自“让我们跟踪多边形边缘中点”的多边形边缘)。请注意,门户网站列表的起点和终点以退化的线段为起点和终点。
该门户网站列表在他的图片中显示为黄色虚线段。
该算法从宽漏斗开始,然后通过沿入口侧边点(线段的端点)迭代地向前移动漏斗边来进行,只要这能拉紧漏斗(AD)。
这意味着每次向前移动都应将漏斗边缘向内移动,这可以通过代表旧边和潜在新边的向量的叉积来检查(下图中的P × Q;另请参见triarea2
Mikko的代码)。如果向前移动某一边不会使漏斗变紧,则我们不会针对门户网站的当前迭代(E)更新该边。
另一个需要处理的情况是漏斗退化为线段时。为了解决这个问题,算法再次使用叉积检查了边的一侧是否在“错误的”侧,这一次是由漏斗顶点和右侧和左侧端点(R × S in下图)。
如果是这种情况,则将来自漏斗顶点的矢量和正确的侧端点添加到平滑路径(上图中的R),并以其端点作为新顶点(FG)重新开始算法,除非,当然,如果这是目标。