2016-05-09 133 views

回答

1

因爲由Boost Geometry定義的概念不允許自交叉,所以你不能。

然而,間接然後可以使用驗證功能(新的,因爲我認爲1.59),以獲得對自我相交的一些信息:

std::string reason; 
poly p; 
bg::read_wkt("POLYGON((0 0, 0 4, 2 4, 2 2, 6 2, 6 6, 2 6, 2 4, 0 4, 0 8, 8 8, 8 0, 0 0))", expected); 
bool ok = bg::is_valid(p, reason); 
std::cout << "Expected: " << bg::dsv(p) << (ok?" valid":" invalid: '" + reason + "'") << "\n"; 

打印:

預期:(((0 ,(0,4),(2,4),(2,2),(6,2),(6,6),(2,6),(2,4),(0,4 ),(0,8),(8,8),(8,0),(0,0)))無效:'幾何有無效的自交。在(0,4)找到自交點;方法:t;操作:x/u; {0,-1,-1,0}/{0,-1,-1,7}'

+0

我突然意識到我認爲[標籤:升壓幾何。我不熟悉[tag:boost-polygon],所以如果這是上下文,我的答案可能不準確。 – sehe

+0

嘿,謝謝你的回覆。我確信你可以在polygon中找到自我交集。我已經看到了一個代碼。我只是不記得如何。我認爲有一個使用turn_info。但我在那裏迷路了。如果你知道如何使用get turn_info,那可能會有所幫助。 –

+0

我已經在Boost Geometry郵件列表中發現了一篇文章,其中...諷刺的是,Adam Wulkiewicz說:「我在其他電子郵件中看到你已經知道了它。」我認爲現在是時候讓你在這裏提供一些鏈接,甚至是自我回答 - 這真是一個有用的問答。事實上,在你已經認識到事情發生之後,你有意識地冒着讓輪子浪費時間的風險。 – sehe

1

所以這是獲取自我交叉。

namespace bg = boost::geometry; 
    using namespace std; 
    typedef bg::model::d2::point_xy<double> point_2d; 
    typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon; 

    Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25, 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 }, { 10, 0 }, { 10, 10 } }}; 


    typedef bg::point_type<Polygon>::type point_type; 
    typedef boost::geometry::detail::overlay::turn_info<point_type, boost::geometry::segment_ratio<double> > TurnInfoType; 

    bg::detail::no_rescale_policy robust_policy; 
    bg::detail::self_get_turn_points::no_interrupt_policy interrupt_policy; 
    std::vector<TurnInfoType> turns; 

boost::geometry::self_turns<boost::geometry::detail::overlay::assign_null_policy>(poly.outer(), robust_policy, turns, interrupt_policy); 

用於獲取信息只是使用類似:

turns[i].operations[0].seg_id.segment_index 
相關問題