zoukankan      html  css  js  c++  java
  • [Boost::Polygon]多边形相减得到新的多边形序列

    #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 = 0; 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



  • 相关阅读:
    Linux 安全工具之extundelete误删除恢复
    Linux安全工具之fail2ban防爆力破解
    构建高效安全的Nginx Web服务器
    必读说明
    U盘因格式化 NTFS 中断造成无法识别,生产平台同样无法识别的修复处理方案
    计算机等级考试【二级C语言程序设计】知识点整理
    MD 使用 i5ting_toc 转换成 HTML
    Windows10 图标变白修复
    【已解决】老型号电脑需要按F1键才能进入系统
    【已解决】什么是心跳包?
  • 原文地址:https://www.cnblogs.com/dawnWind/p/boost_003.html
Copyright © 2011-2022 走看看