#include <iostream>
#include <boost/polygon/polygon.hpp>
#include <cassert>
namespace gtl = boost::polygon;
using namespace boost::polygon::operators; //lets construct a 10x10 rectangle shaped polygon
typedef gtl::polygon_data<int> Polygon;
typedef gtl::polygon_traits<Polygon>::point_type Point;
typedef gtl::polygon_set_data<int> PolygonSet;
typedef std::vector<Polygon> PolyDataSet; void getOBS(Polygon &oPrboundary, PolyDataSet &pinGroup)
{
PolygonSet o_full_set;
o_full_set.insert(oPrboundary, false); foreach (Polygon o_item, pinGroup)
{
//o_full_set.insert(o_item, true); // Insert As Hole, which works in 1_53 but not in 1_56
o_full_set -= o_item; // works in 1_53 and 1_56
} PolyDataSet o_OBS_set;
o_full_set.get(o_OBS_set); for (int i = ; i < o_OBS_set.size(); ++i)
{
Polygon o_poly = o_OBS_set.at(i);
std::vector<Point> poly_points;
poly_points.insert(poly_points.end(), o_poly.begin(), o_poly.end());
foreach(Point o_pos, poly_points)
{
std::cout << "(" << o_pos.x() << ", " << ") ";
}
std::cout << std::endl;
}
}

如上面代码所示,Boost::polygon库是十分强大的,通过输入一个多边形序列到polygon_set_data,

再调用get成员函数就可以获得这一系列多边形进行合并消除覆盖面积的新多边形序列。

如果是polygon_90_set_data还有get_rectangles函数,可以实现获得合并后的矩形划分,在芯片设计

中可以用来求取矩形的OBS区域。

但是在使用boost::polygon库的过程中发现,如果使用1_53版本,使用insert的方法是可以获得带孔的OBS图形的。

而在1_56版本中却发现,使用insert的效果是“OR”而不是期待的"SUBTRACT",于是如果传入一个大的矩形作为prboundary,

再传入一个在该prboundary中的一个小矩形为PIN,得到的并不是期待的一个带孔的多边形,而是直接得到了prboundary!

o_full_set.insert(o_item, true);

如上图,假设绿色是一个PIN,黑色边框围着的正方形是prboundary区域,那么OBS就是除去PIN的一个环形(带孔)的多边形。

但是使用insert(o_item, true)却并没有得到想要的效果,虽然从介绍上来说:

insert(o_item, true)和“-=”应该具有一样的效果。

在boost社区提交了一个bug:)

https://svn.boost.org/trac/boost/ticket/11575

												

[Boost::Polygon]多边形相减得到新的多边形序列的更多相关文章

  1. [Boost]图形处理库Boost::Polygon

    Background 工作中经师傅指导学习应用到了Boost::Polygon这个库,相对于Boost::Geometry,Polygon出自Intel.抽象于芯片流程,于是更贴近于芯片设计流程应用. ...

  2. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  3. 谈谈Boost网络编程(2)—— 新系统的设计

    写文章之前.我们一般会想要採用何种方式,是"开门见山",还是"疑问式开头".写代码也有些类似.在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用.在 ...

  4. [CareerCup] 7.2 Ants on Polygon 多边形上的蚂蚁

    7.2 There are three ants on different vertices of a triangle. What is the probability of collision ( ...

  5. 【boost】使用lambda表达式和generate_n生成顺序序列

    程序中经常用到顺序序列(0,1,2,3,4,5,6.....),一直羡慕python有range这样的函数,而C++中通常只有用循环来处理这种初始化. 现在,结合boost库lambda(虽然差C++ ...

  6. Java8的新特性,二进制序列转十进制数字

    package kata_007_二进制序列转十进制int; /** * java8 Lambda表达式转换binary序列->十进制数 */ import java.util.ArrayLis ...

  7. C++11 新特性之 序列for循环

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/lr982330245/article/details/30971195 在C++中在C++中for循 ...

  8. C++ GDI图形设备接口

    一.概念 1. GDI:(Graphics Device Interfase)图形设备接口,是一个应用程序与输出设备之间的中介. 一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以 ...

  9. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

随机推荐

  1. Codevs 4560 NOIP2015 D2T2 子串

    > 4560 NOIP2015 D2T2 子串 时间限制: 1 s 空间限制: 128000 KB 题目等级:黄金 Gold 题目描述 Description 有两个仅包含小写英文字母的字符串A ...

  2. 初学c++

    今天在计蒜客中学习了c++的语句编写方法.因为之前编程时候用的都是c,所以第一次看到c++的部分代码还是有点迷茫忙的. 初次接触c++,我学习到了c++中变量的定义以及输入输出. 代码如下: #inc ...

  3. MongoDB源码分析——mongod程序源码入口分析

    Edit 说明:第一次写笔记,之前都是看别人写的,觉得很简单,开始写了之后才发现真的很难,不知道该怎么分析,这篇文章也参考了很多前辈对MongoDB源码的分析,也有一些自己的理解,后续将会继续分析其他 ...

  4. SGU 239.Minesweeper

    题意: 如图,一列未知的区域长度为n(≤1000),给出第二列的数字,求区域中雷的排列有多少种. Solution: 搜索.这题看上去1000的范围很大,实际上加上合理的剪枝,状态数会变得非常非常少. ...

  5. Headfirst设计模式的C++实现——简单工厂模式(Simple Factory)

    Pizza.h #ifndef _PIZZA_H #define _PIZZA_H #include <iostream> #include <string> class Pi ...

  6. nagios 完全配置手册

    Linux下Nagios的安装与配置   一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机 ...

  7. wap开发之滑动事件(swipe、tap、swipeleft、swiperight)等

    最近一直找在wap端可以实现的swipe等滑动事件的方法,开始研究了jquery-mobile,zepto,结果由于jqm太大.zepto有不少缺陷.为此研究了zepto,想把里面的swipe事件独立 ...

  8. Sencha Touch Guide

     1.一些命令 创建APP #  Make sure the current working directory is the Sencha Touch 2 SDK 例如D:\Program File ...

  9. 定位 - CoreLocation - 指南针

    #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ...

  10. PhoneGap 3 在 Mac 上安装使用

    1.下载安装 NodeJS . 2.安装 PhoneGap.打开终端执行: 1 $ sudo npm install -g phonegap 3.PhoneGap 3 不需要在Xcode中创建,而是在 ...