gpt4 book ai didi

c++ - boost 几何交集给出奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-04 13:00:57 25 4
gpt4 key购买 nike

我想使用 boost geometry 中的 intersection 函数与一条线和一个多边形。我希望交点是位于多边形内部的线的一部分。

不幸的是,boost geometry 返回了位于多边形之外的线部分。这是 boost geometry 中的错误还是我的代码有问题?

#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/multi/geometries/multi_point.hpp>
#include <boost/geometry/multi/geometries/multi_linestring.hpp>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/algorithms/intersection.hpp>

namespace bg = boost::geometry;

using value_type = double ;
using cs_type = bg::cs::cartesian;
using point_type = bg::model::point< value_type , 2 , cs_type >;
using polygon_type = bg::model::ring< point_type > ;
using line_string_type = bg::model::linestring< point_type >;
using multi_line_type = bg::model::multi_linestring< line_string_type >;

int main( int argc , char *argv[] )
{
line_string_type line;
line.push_back( point_type { 13.37688020921095 , 53.66231710654281 } );
line.push_back( point_type { 13.3857295713429 , 53.6636835518369 } );
line.push_back( point_type { 13.39213495232734 , 53.66501934623722 } );
line.push_back( point_type { 13.39719615524716 , 53.66546436809296 } );
line.push_back( point_type { 13.40724694386097 , 53.66240690770171 } );

polygon_type polygon;
polygon.push_back( point_type { 13.35 , 53.64 } );
polygon.push_back( point_type { 13.39 , 53.64 } );
polygon.push_back( point_type { 13.39 , 53.68 } );
polygon.push_back( point_type { 13.35 , 53.68 } );
polygon.push_back( point_type { 13.35 , 53.64 } );

multi_line_type intersection;
bg::intersection( line , polygon , intersection );

return 0;
}

最佳答案

确保您的输入几何满足记录的先决条件。

您可以使用 bg::correct 来解决大多数问题(例如多边形中点的正确 CCW 排序、闭合未闭合的多边形等):

Live On Coliru

#include <boost/geometry/core/cs.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/multi/geometries/multi_point.hpp>
#include <boost/geometry/multi/geometries/multi_linestring.hpp>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/algorithms/intersection.hpp>

namespace bg = boost::geometry;

using value_type = double;
using cs_type = bg::cs::cartesian;
using point_type = bg::model::point<value_type, 2, cs_type>;
using polygon_type = bg::model::ring<point_type>;
using line_string_type = bg::model::linestring<point_type>;
using multi_line_type = bg::model::multi_linestring<line_string_type>;

int main()
{
line_string_type line;
line.push_back(point_type{13.37688020921095, 53.66231710654281});
line.push_back(point_type{13.3857295713429, 53.6636835518369});
line.push_back(point_type{13.39213495232734, 53.66501934623722});
line.push_back(point_type{13.39719615524716, 53.66546436809296});
line.push_back(point_type{13.40724694386097, 53.66240690770171});
bg::correct(line);

polygon_type polygon;
polygon.push_back(point_type{13.35, 53.64});
polygon.push_back(point_type{13.39, 53.64});
polygon.push_back(point_type{13.39, 53.68});
polygon.push_back(point_type{13.35, 53.68});
polygon.push_back(point_type{13.35, 53.64});
bg::correct(polygon);

multi_line_type intersection;
bg::intersection(line, polygon, intersection);

std::cout << bg::wkt(intersection);
}

这打印

MULTILINESTRING((13.3769 53.6623,13.3857 53.6637,13.39 53.6646))

enter image description here

如果输入未被正确编辑,它会打印如下:

MULTILINESTRING((13.39 53.6646,13.3921 53.665,13.3972 53.6655,13.4072 53.6624))

enter image description here

关于c++ - boost 几何交集给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com