2014-12-02 60 views
1

我有一個boost幾何框類型的序列,並希望找到包含所有這些對象的框的尺寸。如何找到包含所有給定框的框?

我注意到boost幾何提供了encompass函數,這似乎是我要求的一般幾何概念,但我不知道如何對一系列方框執行此操作。

基本上我不得不推出我自己的,但我想知道是否有可能簡單地將一系列盒子變成一個「幾何」,以便我可以簡單地應用envelope函數。這是我目前寫的:

// elsewhere in my code: 
using Location = boost::geometry::model::d2::point_xy<double>; 
using Box = boost::geometry::model::box<Location>; 

// calculate the smallest box that fully encompasses all provided boxes    
template <template <typename...> class IterableContainer>       
Box Envelope(const IterableContainer<Box>& sequence)        
{                     
    Location minCorner(               
     std::numeric_limits<double>::max(),           
     std::numeric_limits<double>::max());          

    Location maxCorner(               
     std::numeric_limits<double>::lowest(),           
     std::numeric_limits<double>::lowest());          

    for (auto& box : sequence)              
    {                    
     if (box.min_corner().x() < minCorner.x())         
      minCorner.x() == box.min_corner().x();         

     if (box.min_corner().y() < minCorner.y())         
      minCorner.y() == box.min_corner().y();         

     if (box.max_corner().x() > maxCorner.x())         
      maxCorner.x() == box.max_corner().x();         

     if (box.max_corner().y() > maxCorner.y())         
      maxCorner.y() == box.max_corner().y();         
    }                    

    return Box(minCorner, maxCorner);            
}                     
+0

不只是'框',而是「軸對齊的邊界框」。 – Yakk 2014-12-02 10:03:40

+0

沒有意義。從一組框中創建幾何是一個緩慢的操作。 – 2014-12-02 10:18:21

+0

@Yakk,在推動它們是相同的東西 – arman 2014-12-02 12:59:27

回答

2

你正在尋找的功能叫做std::accumulate。你需要爲它提供一個box-union函數。

using Location = boost::geometry::model::d2::point_xy<double>; 
using Box = boost::geometry::model::box<Location>; 
double pinfi = std::numeric_limits<double>::max(); 
double ninfi = std::numeric_limits<double>::lowest(); 

Box u = std::accumulate(container.begin(), container.end(), 
         Box(Location(pinfi,pinfi), Location(ninfi,ninfi)), 
         [](const Box& a, const Box& b) { 
          return Box(
            Location(
            std::min(a.min_corner().x(),b.min_corner().x()), 
            std::min(a.min_corner().y(),b.min_corner().y())), 
            Location(
            std::max(a.max_corner().x(),b.max_corner().x()), 
            std::min(a.max_corner().y(),b.max_corner().y()))); 

         }); 

更新:此函數的構建塊已經存在於boost :: geometry中。這裏是完整的測試代碼:

template <typename T> 
Box box_encompass (T beg, T end) 
{ 
    return std::accumulate(beg, end, boost::geometry::make_inverse<Box>(), 
       [](Box a, const Box& b) -> Box { 
        boost::geometry::expand(a,b); 
        return a; 
       }); 
} 
+0

'盒子&'?爲什麼一個可變參考?噢,'std :: next(container.begin())'和'container.front()'種子去除無窮大,並且使「空容器」的情況顯式而不是隱式的,我想這可能會明智嗎? – Yakk 2014-12-02 15:09:45

+0

@Yakk 1.馬虎編輯,這就是爲什麼。這是一個品味問題。我沒有看到有需要。 – 2014-12-02 15:44:48

+0

當然:但我花了一些時間,我找不到什麼「空」的盒子應該看起來像。 ([赫克,我甚至不知道一個盒子是半開還是封閉的區域!](http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/ models/model_box.html))也許你知道的更多,這是一個適當的'boost :: geometry :: model :: box'爲空框。 – Yakk 2014-12-02 16:27:41

相關問題