簡體   English   中英

Boost :: Geometry相交無法正常工作

[英]Boost::Geometry intersection not working as expected

我有一個小測試應用程序,用boost :: geometry相交一些矩形。

typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::cartesian
> point;

typedef boost::geometry::model::polygon<point > polygon;

polygon Intersect(polygon p1, polygon p2) {
    std::vector < polygon > result;
    boost::geometry::intersection(p1, p2, result);
    return result.front();
}

polygon IntersectionTest() {
    polygon one, two, three, four;

    boost::geometry::read_wkt("POLYGON((35 25, 35 35, 15 35, 15 25, 35 25))", one);
    boost::geometry::read_wkt("POLYGON((45 30, 45 50, 25 50, 25 30, 45 30))", two);
    boost::geometry::read_wkt("POLYGON((50  0, 50 40, 10 40, 10  0, 50  0))", three);
    boost::geometry::read_wkt("POLYGON((40 20, 40 60,  0 60,  0 20, 40 20))", four);

    return Intersect(Intersect(Intersect(one, two), three), four);
}

我必須做錯什么,因為我希望結果是類似(35 30, 35 40, 25 40, 25 30, 35 30) 30,35 40,25 40,25 30,35 (35 30, 35 40, 25 40, 25 30, 35 30)但是我得到了10個點長的多邊形,其中包含像50 0點,而平行矩形的交點應該總是是具有4 + 1點的矩形,並且50 0在邊緣,所以它根本不應該在相交處。 如果將其放入SVG中 ,則矩形似乎與我期望的一樣。

有什么事嗎 如果是boost::geometry的錯誤,如何確定呢? (我當前使用的是1.48。)如果存在錯誤,是否可以解決該問題?

多邊形類具有以下模板參數:

template
<
    typename Point,
    bool ClockWise = true,
    bool Closed = true,
    template<typename, typename> class PointList = std::vector,
    template<typename, typename> class RingList = std::vector,
    template<typename> class PointAlloc = std::allocator,
    template<typename> class RingAlloc = std::allocator
>
class polygon {...}

如您所見,第二個模板參數默認為true。 這意味着將定義多邊形的點視為/應該按順時針順序排列。

這實際上是您的問題。

如果您查看幾何的WKT形式,則會以逆時針順序寫入點。

因此,您應該:

typedef boost::geometry::model::polygon<point,false> polygon;

或按順時針順序在WKT字符串中寫入點。 即:

boost::geometry::read_wkt("POLYGON((35 25, 15 25, 15 35, 35 35, 35 25))", one);
boost::geometry::read_wkt("POLYGON((45 30, 25 30, 25 50, 45 50, 45 30))", two);

這樣,結果將達到您的預期。

作為個人評論,如果read_wkt可以在閱讀時強制執行正確的方向,那可能是一件好事。

我同意ds27680的答案。

第三種選擇是在read_wkt之后調用boost :: geometry :: correct(a geometry),如果不確定方向,建議用戶這樣做。

read_wkt確實沒有強制執行正確的方向。 原因是正確的函數需要進行面積計算,如果用戶知道多邊形的順序正確(通常已知的),則可以將其保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM