我目前正在开发一个私有项目,它依赖于使用Boost C ++库对多边形的一些操作。
我目前正在尝试使用内部多边形/负多边形概念。
我现在需要做的是连接三个多边形,其中两个具有正(逆时针)外多边形和负(顺时针)内多边形。
第三个是负多边形,一个具有负面积的新多边形对象 - 顺时针方向的点。这就是我不能完全确定如何处理这种情况的地方。
这是这三个多边形的图片。连接左上多边形和右下多边形的中间是负面多边形。
现在我想做的是通过union函数连接所有三个多边形。 我期望联盟做的是切掉多边形1和3的正面部分(正多边形)并返回剩余的两个多边形1和3。
我实际得到的是我的多边形1和3未触及,因为没有负多边形2。
任何帮助将不胜感激。
编辑:
我需要得到的是一个矢量而不是位图或图片或其他什么。 这些图片仅用于更好地可视化我拥有的和我需要的东西。
这三个多边形实际上不超过x和y点的向量。
以下是我希望所有三个多边形结合的正确结果的图片:
Edit2:更正了结果
答案 0 :(得分:0)
您希望工会如何工作? Usually a union of polygons 1 and 2 would result in polygon 3,但是对于您的用例,我怀疑您希望它生成多边形4。如果是这种情况,您可以简单地对所有顺时针路径进行合并,然后对逆时针路径进行合并,然后采用前者与后者的区别。如果您希望联合产生多边形3,那么我认为没有一致的方法可以执行所需的操作。
答案 1 :(得分:-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;
};