假设我有一个(凸)多边形,顶点为0..n-1。我想将这个多边形分成两半,比如说,在verticies i和j之间。顶点i和j应出现在两个多边形中。
据我所知,只有两种情况。一个我< j,或当我>学家我永远不会等于j(它们也不相邻)。
我正在存储像vector<Point> poly
这样的顶点。您可以假设Point
只是一个基本结构,包含两个双精度x
和y
,其中点以CCW顺序依次编制索引。
如果我&lt; j,然后我只需要将顶点从i复制到j(包括)到一个向量,然后从j到n-1加0到i到另一个向量。或者反之亦然,对吧?
这是我正在使用的代码,但它似乎不正常(让j == nearestIndex):
if (i < closestIndex) {
lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + closestIndex + 1);
upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.end());
upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1);
} else {
lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.end());
lowerPoly.insert(lowerPoly.end(), poly.begin(), poly.begin() + closestIndex + 1);
upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.begin() + i + 1);
}
答案 0 :(得分:4)
我认为除了我永远不会等于j之外,还需要包含另一个限制。
你还需要确保如果我是你没有在i-1或i + 1分裂的起点。如果边是线性的,则在连续点处分割意味着分割线只是边缘,因此您可以返回原始多边形和边缘线,这看起来不是很有趣。
我建议使用一个2D点阵列,而不是两个数组x和y,其中顶点在多边形的逆时针方向上连续编号。
所以这两个多边形将是:
多边形1:从i开始,迭代到结束点j,并以j的边缘结束回i;
多边形2:从i开始,到结束点j,然后从j + 1,j + 2开始,再回到i。
答案 1 :(得分:2)
作为旁注:
你真的没有2个案例。如果我&gt;然后只需交换i和j。那么你总是在我&lt; j,假设我!= j。
我可能会编写如下代码:
if (i > closestIndex)
std::swap (i, closestIndex);
assert(closestIndex - i > 1);
// make sure i != closestIndex and i is not adjacent to closestIndex
lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + closestIndex + 1);
upperPoly.insert(upperPoly.end(), poly.begin() + closestIndex, poly.end());
upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1);
答案 2 :(得分:0)
我的坏。上面的代码很好,我的显示例程有问题。我把太多的多边形推到堆栈上,所以它看起来不正确。应该是显而易见的,但我没有发现它。感谢duffymo的帮助。