4

我目前正在从事一个私人项目,该项目依赖于使用 Boost C++ 库对多边形进行的一些操作。

我目前正在尝试使用内部多边形/负多边形概念。

我现在需要做的是连接三个多边形,其中两个有一个正(逆时针)外多边形和一个负(顺时针)内多边形。

第三个是负多边形,一个具有负面积的新多边形对象 - 指向顺时针方向。这就是我不完全确定如何处理这种情况的地方。

这是这三个多边形的图片。连接左上多边形和右下多边形的中间那个是负多边形。

包括负数的多边形

现在我想做的是通过联合函数连接所有三个多边形。我期望 union 做的是切掉多边形 1 和 3(正多边形)的正部分,并返回剩余的两个多边形 1 和 3。

我实际上得到的是我的多边形 1 和 3 未触及,因为不会有负多边形 2。

任何帮助将不胜感激。

编辑:

我需要得到的是矢量而不是位图或图片或其他任何东西。这些图片只是用来更好地可视化我拥有的和需要的。

这三个多边形实际上不超过 x 和 y 点的向量。

这是我期望的所有三个多边形联合的正确结果的图片:

Edit2:更正了结果

结果

4

2 回答 2

0

你希望工会如何运作?通常多边形 1 和 2 的联合会产生多边形 3,但我怀疑对于您的用例,您希望它产生多边形 4。如果是这种情况,您可以简单地对所有顺时针路径进行联合,然后执行逆时针路径的并集,然后取前者与后者的差异。如果您希望联合产生多边形 3,那么我认为没有一致的方法可以做您想做的事情。

于 2018-06-19T19:56:27.323 回答
-1

好的计划是将您的多边形视为(布尔值)位图:每个多边形都将被 blit 到 (R,R)->bool 类型的位图。一旦它是位图格式,负多边形只是布尔运算而不是操作:

class Bitmap { virtual bool Map(float x, float y) const=0; };
class AndNot : public Bitmap {
public:
   AndNot(Bitmap &bm1, Bitmap &bm2) : bm1(bm1), bm2(bm2) { }
   bool Map(float x, float y) const {
      return b1.Map(x,y) && !b2.Map(x,y);
   }
private:
   Bitmap &bm1, &bm2;
};
于 2012-12-05T16:36:31.193 回答