簡體   English   中英

Boost幾何相交無法正確輸出

[英]Boost geometry intersection does not output correctly

從以下代碼中,我計算出兩個多邊形的交點。 我希望如果不是多邊形,則輸出可以為NULL。 但是輸出為((((240,52.9999),(240,53),(240,53),(240,52.9999))))。 這不是多邊形。 有什么方法可以檢查輸出是否真的是多邊形?

#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;
}

您可以清除無效的幾何圖形:

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

現在,結果將為空。

在Coliru上實時觀看


對我來說很有趣的是,“無效”的幾何形狀將如何產生第一位置。 您可能已經知道,多邊形的選擇非常好:

讓我們放大一點:

現在,您可能會遇到一些浮點精度問題,就像是使用long long或提高多精度的同一實驗一樣,例如:

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

所以看起來非常像我們只是獲得了一個奇異點。 如果您不希望這樣做,那么也許您應該只定義sorts的“ epsilon”值,即停止考慮重疊和重疊的閾值。

暫無
暫無

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

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