2014-12-06 100 views
0

從下面的代碼我計算兩個多邊形的交集。如果它不是多邊形,我希望輸出可以是NULL。然而,輸出是(((240,52.9999),(240,53),(240,53),(240,52.9999)))。這不是一個多邊形。有什麼方法可以檢查輸出是否真的是一個多邊形?Boost幾何交集不能正確輸出

#include <iostream> 
#include <deque> 
#include <vector> 
#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point_xy.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/io/wkt/wkt.hpp> 
#include <boost/geometry/algorithms/append.hpp> 

#include <algorithm> // for reverse, unique 
#include <iostream> 
#include <string> 


int main() 
{ 
    typedef boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian> point_2d; 
    typedef boost::geometry::model::polygon<point_2d> polygon_2d; 

    polygon_2d green; 
    boost::geometry::append(green, point_2d(286.188, 90.9575)); 
    boost::geometry::append(green, point_2d(274.902, 56.2215)); 
    boost::geometry::append(green, point_2d(274.238, 55.7393)); 
    boost::geometry::append(green, point_2d(246.908, 51.9765)); 
    boost::geometry::append(green, point_2d(194.477, 59.7441)); 
    boost::geometry::append(green, point_2d(159.213, 101.141)); 
    boost::geometry::append(green, point_2d(203.576, 149.537)); 
    boost::geometry::append(green, point_2d(286.188, 90.9575)); 

    polygon_2d blue; 
    boost::geometry::append(blue, point_2d(240, 53)); 
    boost::geometry::append(blue, point_2d(240, -53)); 
    boost::geometry::append(blue, point_2d(-60, -53)); 
    boost::geometry::append(blue, point_2d(-60, 53)); 
    boost::geometry::append(blue, point_2d(240, 53)); 

    boost::geometry::correct(green); 
    boost::geometry::correct(blue); 

    std::vector<polygon_2d> output; 
    boost::geometry::intersection(green, blue, output); 

    std::cout << "green && blue:" << std::endl; 
    if(output.size()) 
    { 
     std::cout<<boost::geometry::dsv(output[0])<<std::endl; 
     std::cout<<boost::geometry::area(output[0])<<std::endl; 
    } 

    return 0; 
} 

回答

1

可以淘汰無效的幾何圖形:

output.erase(
     std::remove_copy_if(output.begin(), output.end(), output.begin(), [](polygon_2d const&g) { return boost::geometry::is_valid(g); }), 
     output.end()); 

現在,隨着預期的結果將是空的。

看到它Live On Coliru


有趣的是我「無效」的幾何形狀會如何導致擺在首位。正如你可能知道,您的多邊形是很好的選擇:

讓我們在一個小變焦:

現在,你可能會尋找一些浮點精度的問題,因爲相同的實驗long long points或提高多倍,例如:

typedef boost::multiprecision::number<boost::multiprecision::cpp_bin_float<1024*128>> oopmh; // that's a lotta oomph 
typedef boost::geometry::model::d2::point_xy<oopmh, boost::geometry::cs::cartesian> point_2d; 

你會看到,我們得到

green && blue: 
(((2.4e+06, 530000), (-600000, 530000), (-600000, -530000), (2.4e+06, -530000), (2.4e+06, 530000))) 
nan 

所以它看起來非常像我們只是得到一個奇異點的區域。如果你不想要這個,那麼也許你應該定義一個「epsilon」類型的值,這是一個你不再考慮重疊的閾值。