gpt4 book ai didi

c++ - 如何使用 C++ boost geometry 从两个多边形创建环( donut )?

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:46 28 4
gpt4 key购买 nike

我正在尝试计算 2 个多边形之间的差异(实际上,为简单起见,是直线形状)。例如,shape1 有点列表 {0 0, 100, 0, 100 100, 0 100},shape2 有点列表 {25 25, 75 25, 75 75, 25 75}。所以从概念上讲,我希望“shape1 - shape2”会为我提供 4 个矩形框,它们可以做成环形或 donut 形状。我不知道如何实现这一点,但我在网上找到了“boost”库并试了一下:

enter image description here

#include <iostream>
#include <list>

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

#include <boost/foreach.hpp>


int main()
{
typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon;

polygon green, blue;

boost::geometry::read_wkt( "POLYGON((0 0 100 0 100 100 0 100))", green);

boost::geometry::read_wkt( "POLYGON((25 25 75 22 75 75 25 75))", blue);

std::list<polygon> output;
boost::geometry::difference(green, blue, output);

int i = 0;
std::cout << "green - blue:" << std::endl;
BOOST_FOREACH(polygon const& p, output)
{
std::cout << i++ << ": " << boost::geometry::area(p) << std::endl;
}


output.clear();
boost::geometry::difference(blue, green, output);

i = 0;
std::cout << "blue - green:" << std::endl;
BOOST_FOREACH(polygon const& p, output)
{
std::cout << i++ << ": " << boost::geometry::area(p) << std::endl;
}


return 0;
}

然而,什么也没有打印出来......我的计划是想办法将输出结果转换为矩形框 {0 0 100 0 100 25 0 25} {0 75 100 75 100 100 0 100} {0 25 25 25 25 75 0 75} 和 {75 25 100 25 100 75 75 75},但令我感到沮丧的是,上面的代码根本没有打印出任何内容。谁能给我一些指导?我附上了一张图片,展示了我想要做什么。事实上,我已经有了表示这个 donut 的所有点坐标,所以也许我可以跳过“difference() function”?如果是这种情况,困难的部分将是将 donut 转换为矩形段。 (让我们假设这里的所有多边形都是直线形状。)谢谢。

最佳答案

The other answer will end your frustration/confusion, this answer will make you more productive :)

而且,是的,您可以跳过差异函数:

bg::read_wkt("POLYGON((0 0 0 100 100 100 100 0 0 0) (25 25 75 22 75 75 25 75 25 25))", donut);

这指定了内环(反向!)。

结果:

enter image description here

由这个程序生成:

Live On Coliru

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>

#include <iostream>
#include <fstream>

namespace bg = boost::geometry;

int main() {
typedef bg::model::d2::point_xy<double> point;
typedef bg::model::polygon<point> polygon;

polygon donut;
bg::read_wkt("POLYGON((0 0 0 100 100 100 100 0 0 0) (25 25 75 22 75 75 25 75 25 25))", donut);

std::ofstream svg("output.svg");
boost::geometry::svg_mapper<point> mapper(svg, 400, 400);
mapper.add(donut);

mapper.map(donut, "fill-opacity:0.5;fill:rgb(0,0,153);stroke:rgb(0,0,200);stroke-width:2");
}

关于c++ - 如何使用 C++ boost geometry 从两个多边形创建环( donut )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47685588/

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