gpt4 book ai didi

c++ - 几何、交集

转载 作者:行者123 更新时间:2023-11-28 00:14:37 26 4
gpt4 key购买 nike

我有一个问题。我想将四边形与四边形相交。

int main(){
typedef boost::geometry::model::point_xy<double> TBoostPoint;
typedef boost::geometry::model::polygon<TBoostPoint> TBoostPoly;
TBoostPoint point;
TBoostPoly firstPoly, secondPoly;
boost::geometry::read_wkt("POLYGON(
(1.504477611940313, 3.761194029850755),
(1.504477611940305, 3.573134328358203),
(1.316417910447765, 3.573134328358206),
(1.316417910447769, 3.761194029850752))", firstPoly);
boost::geometry::read_wkt("POLYGON(
(1.504477611940313, 3.761194029850755),
(1.504477611940305, 3.573134328358203),
(1.316417910447765, 3.573134328358206),
(1.316417910447751, 3.761194029850769))", secondPoly);
std::vector<TBoostPoly> outPoly;
boost::geometry::intersection(firstPoly,secondPoly,outPoly);
}

outPoly - 是空的,但事实并非如此。

最佳答案

有两个主要问题。

输出未定义,因为输入无效。

  1. 输入的 WKT 指定了许多无效的内环(由单个点组成),而不是您预期的 5 个点的单个外环(不包括关闭点)。修复它:

    bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447769 3.761194029850752))", first);
    bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447751 3.761194029850769))", second);
  2. Boost Geometry 自始至终都假定您永远不会在记录的先决条件下犯错。如果您阅读多边形概念页面和 intersection 的先决条件,您将看到完整列表¹。

    如果不这样做,您将不会遇到友好的错误,只会出现无声的失败、损坏或错误的答案。是的。这很糟糕。

    更糟糕的是,在 Boost 1_57 (IIRC) 之前,BGeo 甚至没有 is_valid 工具来测试大量需求。好消息是,如果您升级到此版本或以后,您的生活会简单得多。

在这种情况下,您会了解到多边形未正确闭合:

Live On Coliru

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/multi_polygon.hpp>
#include <boost/geometry/io/io.hpp>
#include <boost/geometry/algorithms/intersection.hpp>
#include <boost/geometry/algorithms/correct.hpp>
#include <boost/geometry/algorithms/is_valid.hpp>

namespace bg = boost::geometry;

int main(){
typedef bg::model::d2::point_xy<double> TPoint;
typedef bg::model::polygon<TPoint> TPoly;
TPoly first, second;

bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447769 3.761194029850752))", first);
bg::read_wkt("POLYGON(( 1.504477611940313 3.761194029850755, 1.504477611940305 3.573134328358203, 1.316417910447765 3.573134328358206, 1.316417910447751 3.761194029850769))", second);

std::string reason;
// polys not closed!
if (!bg::is_valid(first, reason)) std::cout << "First polygon not valid: " << reason << "\n";
if (!bg::is_valid(second, reason)) std::cout << "Second polygon not valid: " << reason << "\n";

bg::correct(first);
bg::correct(second);

// no more output!
if (!bg::is_valid(first, reason)) std::cout << "First polygon not valid: " << reason << "\n";
if (!bg::is_valid(second, reason)) std::cout << "Second polygon not valid: " << reason << "\n";

std::vector<TPoly> out;
bg::intersection(first, second, out);

for (auto& g : out)
std::cout << "\nresult: " << bg::wkt(g) << "\n";
}

打印:

First polygon not valid: Geometry is defined as closed but is open
Second polygon not valid: Geometry is defined as closed but is open

糟糕。 geos 没有关闭! correct(poly) 自动修复了这个问题:

result: POLYGON((1.50448 3.57313,1.31642 3.57313,1.31642 3.76119,1.50448 3.76119,1.50448 3.57313))

¹ 外圈必须逆时针,内圈顺时针,多边形必须闭合...诸如此类。

关于c++ - 几何、交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167768/

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