起初,我认为这个问题等同于判断一个多边形是否为凸的,然而,似乎一个三角形扇仍然可以画出一个非凸的多边形。Consider this shape,非凸多边形。可以很容易地想象一些中心点区域,允许使用三角形扇形绘制此多边形(尽管可能会有其他中心点不会)。给定一个固定的中心点,我希望能够确定定义多边形的二维点集是否允许使用单个三角形扇子绘制多边形。
似乎关键是确保从中心点绘制到任何顶点的线都不会“挡路”,这意味着顶点的其他边线。然而,重要的是让计算成本尽可能低,我不确定是否有一个很好的数学捷径来做到这一点。
最终,我要让多边形的顶点移动,我需要确定一个顶点允许移动的“边界”,假设其余的都是固定的(也许稍后还会允许直接2个邻居的同时反应移动),以保持多边形能够在单个三角形扇形中绘制。但这是未来的事情,希望整个多边形的测试可以分解为计算的子集,以测试单个顶点移动的边界,并假设已经是凸多边形。
发布于 2012-04-25 17:35:15
如果从锚点到每个顶点的角度在同一方向上移动,则可以将多边形绘制为三角形扇形。测试这一点的最简单方法是检查连续顶点的叉积的点积。
它看起来像这样:
vector lastCross = cross_product( vector(vertex[0] - center), vector(vertex[numVerts - 1] - center) );
canBeFan = true;
for (n = 1; canBeFan && n < numVerts; ++n) {
vector testCross = cross_product( vector(vertex[n] - center), vector(vertex[n - 1] - center) );
if (0.0 >= dot_product(testCross, lastCross) ) {
canBeFan = false;
}
}
发布于 2012-04-25 17:25:30
您要查找的属性是"star-shaped“。星形多边形是通过具有一个点来定义的,从该点可以看到整个多边形。
要测试多边形是否为星形,可以构造整个多边形可见的区域。该区域将是一个凸集,因此您可以在O(log(n))
中将其与半平面相交。
这意味着您可以与边形成的半平面相交,并检查生成的可见性区域在O(n log n)
中是否是非空的。
发布于 2012-04-25 17:37:47
看起来所有潜在的中心点都需要位于多边形每条边的内侧。因此,把所有的边都当作半空格,并确定它们的交集是否为空。
正如@jpalecek所说,这个术语是星形的。如果您的多边形是星形的,那么将有一个凸多边形(原始多边形的内部),其点可以查看原始多边形的所有边--相反,如果不存在这样的子多边形,则原始多边形不是星形的,并且您不能用三角形扇子绘制它。
确定此子多边形基本上是convex hull问题的dual应用程序;它可以在O(n log n)
中计算。
https://stackoverflow.com/questions/10320475
复制