分裂STL载体

时间:2009-03-24 01:01:05

标签: c++ geometry

假设我有一个(凸)多边形,顶点为0..n-1。我想将这个多边形分成两半,比如说,在verticies i和j之间。顶点i和j应出现在两个多边形中。

据我所知,只有两种情况。一个我< j,或当我>学家我永远不会等于j(它们也不相邻)。

我正在存储像vector<Point> poly这样的顶点。您可以假设Point只是一个基本结构,包含两个双精度xy,其中点以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);
}

3 个答案:

答案 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的帮助。