具有内部边界的区域的几何差异与增强几何
Geometric difference of regions with internal boundaries with boost geometry
我想用 Boost Geometry 计算两个几何对象的几何差异。第一个几何是:
我总是用线段构成几何图形。我有坐标和线段:
{{-1., -1.}, {1., -1.}, {1., 1.}, {-1., 1.}, {0.6, -1}, {0.6,1.}};
{Line[{{1, 5}, {5, 2}, {2, 3}, {3, 6}, {6, 4}, {4, 1}}], Line[{{5, 6}}]};
行中的每个索引都是指一个坐标。任何一个几何图形都可以有内部边界(和孔)。
第二个几何:
我期待得到这个:
我从 多边形 开始,但我不明白如何包含第一个几何对象的内部边界。虽然一个人可以有内部孔,但我想念如何像一条线一样拥有 'degenerated' 多边形。我也不清楚这两个多边形中的哪一个是外多边形。然后我又想了想line,可是那里我加不了内部段。可以使用 Boost Geometry 为具有内部边界的几何查找几何布尔运算吗?那么,我该怎么做?
错过内部边界的多边形方法的代码;注释掉的是线型方式;再次没有第一个几何对象的内部边界。
#include <iostream>
#include <fstream>
#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::d2::point_xy<double> point_type;
typedef boost::geometry::model::polygon<point_type > polygon;
//typedef boost::geometry::model::linestring<point_type > line;
polygon p1, p2;
//line l1, l2;
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 1 -1, 1 1, 0.6 1, -1 1))", p1);
boost::geometry::read_wkt(
"POLYGON((-0.5 -0.5, 2 -0.5, 2 0.5, -0.5 0.5))", p2);
/*
boost::geometry::read_wkt(
"LINESTRING(-1 -1, 0.6 -1, 1 -1, 1 1, 0.6 1, -1 1)", l1);
boost::geometry::read_wkt(
"LINESTRING(-0.5 -0.5, 2 -0.5, 2 0.5, -0.5 0.5)", l2);
*/
std::list<polygon> output;
boost::geometry::difference(p2, p1, output);
//std::list<line> loutput;
//boost::geometry::difference(l2, l1, loutput);
std::ofstream svg("my_map.svg");
boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400);
int i = 0;
BOOST_FOREACH(polygon const& p, output)
{
mapper.add(p);
mapper.map(p, "fill-opacity:0.3;fill:rgb(51,151,53);stroke:rgb(51,151,53);stroke-width:2");
}
/*
int i = 0;
BOOST_FOREACH(line const& l, loutput)
{
mapper.add(l);
mapper.map(l, "opacity:0.4;fill:none;stroke:rgb(212,0,0);stroke-width:5");
}
*/
return 0;
}
内线可以建模为尖峰,例如底端。这个近似值有效:
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, 0.60000000000001 -1, 1 -1, 1 1, -1 1))", p1);
创建了两个多边形:右下角的小矩形 (0.60000000000001 -1, 1 -1, 1 -0.5, 0.6 -0.5)
未与其余多边形相连。
这个精确的点列表
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, 0.6 -1, 1 -1, 1 1, -1 1))", p1);
由于自相交引发异常。当跳过自相交检查时,我们得到了一个结果,但它是不完整的(只计算了上面两个多边形中较大的一个)。
当然,将多边形 p1
分成两个矩形也行得通:
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, -1 1))", p11);
boost::geometry::read_wkt(
"POLYGON((0.6 -1, 1 -1, 1 1, 0.6 1))", p12);
然后用 p2
计算每个差异并将结果结合起来给出确切的预期答案(作为三个独立的矩形)。
我想用 Boost Geometry 计算两个几何对象的几何差异。第一个几何是:
我总是用线段构成几何图形。我有坐标和线段:
{{-1., -1.}, {1., -1.}, {1., 1.}, {-1., 1.}, {0.6, -1}, {0.6,1.}};
{Line[{{1, 5}, {5, 2}, {2, 3}, {3, 6}, {6, 4}, {4, 1}}], Line[{{5, 6}}]};
行中的每个索引都是指一个坐标。任何一个几何图形都可以有内部边界(和孔)。
第二个几何:
我期待得到这个:
我从 多边形 开始,但我不明白如何包含第一个几何对象的内部边界。虽然一个人可以有内部孔,但我想念如何像一条线一样拥有 'degenerated' 多边形。我也不清楚这两个多边形中的哪一个是外多边形。然后我又想了想line,可是那里我加不了内部段。可以使用 Boost Geometry 为具有内部边界的几何查找几何布尔运算吗?那么,我该怎么做?
错过内部边界的多边形方法的代码;注释掉的是线型方式;再次没有第一个几何对象的内部边界。
#include <iostream>
#include <fstream>
#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::d2::point_xy<double> point_type;
typedef boost::geometry::model::polygon<point_type > polygon;
//typedef boost::geometry::model::linestring<point_type > line;
polygon p1, p2;
//line l1, l2;
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 1 -1, 1 1, 0.6 1, -1 1))", p1);
boost::geometry::read_wkt(
"POLYGON((-0.5 -0.5, 2 -0.5, 2 0.5, -0.5 0.5))", p2);
/*
boost::geometry::read_wkt(
"LINESTRING(-1 -1, 0.6 -1, 1 -1, 1 1, 0.6 1, -1 1)", l1);
boost::geometry::read_wkt(
"LINESTRING(-0.5 -0.5, 2 -0.5, 2 0.5, -0.5 0.5)", l2);
*/
std::list<polygon> output;
boost::geometry::difference(p2, p1, output);
//std::list<line> loutput;
//boost::geometry::difference(l2, l1, loutput);
std::ofstream svg("my_map.svg");
boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400);
int i = 0;
BOOST_FOREACH(polygon const& p, output)
{
mapper.add(p);
mapper.map(p, "fill-opacity:0.3;fill:rgb(51,151,53);stroke:rgb(51,151,53);stroke-width:2");
}
/*
int i = 0;
BOOST_FOREACH(line const& l, loutput)
{
mapper.add(l);
mapper.map(l, "opacity:0.4;fill:none;stroke:rgb(212,0,0);stroke-width:5");
}
*/
return 0;
}
内线可以建模为尖峰,例如底端。这个近似值有效:
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, 0.60000000000001 -1, 1 -1, 1 1, -1 1))", p1);
创建了两个多边形:右下角的小矩形 (0.60000000000001 -1, 1 -1, 1 -0.5, 0.6 -0.5)
未与其余多边形相连。
这个精确的点列表
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, 0.6 -1, 1 -1, 1 1, -1 1))", p1);
由于自相交引发异常。当跳过自相交检查时,我们得到了一个结果,但它是不完整的(只计算了上面两个多边形中较大的一个)。
当然,将多边形 p1
分成两个矩形也行得通:
boost::geometry::read_wkt(
"POLYGON((-1 -1, 0.6 -1, 0.6 1, -1 1))", p11);
boost::geometry::read_wkt(
"POLYGON((0.6 -1, 1 -1, 1 1, 0.6 1))", p12);
然后用 p2
计算每个差异并将结果结合起来给出确切的预期答案(作为三个独立的矩形)。