提升几何:多边形定义



你能告诉我为什么这个多边形定义不起作用吗?

namespace bg = boost::geometry;
int main()
{
typedef bg::model::point<double, 2, bg::cs::cartesian> point_type;
typedef bg::model::polygon<point_type> polygon_type;
polygon_type P;
int xi[] = {0,100,100,0,0};
int yi[] = {0,0,100,100,0};
bg::append(P, bg::make<point_type>(*xi, *yi));
double area = bg::area(P);
std::cout << "Area:" << area << std::endl;
Return 0; }

这显示面积 : 0

谢谢

了解如何使用库来诊断问题:

std::string reason;
bool ok = bg::is_valid(P, reason);
std::cout << "Polygon " << (ok?"valid":"invalid") << " (" << reason << ")n";

版画:住在科里鲁

Polygon invalid (Geometry has too few points)

您还可以在WKT/DSV(甚至SVG)中打印几何图形:Live On Coliru

POLYGON((0 0)) invalid (Geometry has too few points)
Area:0

这使得问题更加明显。


你不想加一个点,而要加一个环。实现此目的的最简单方法是显式地使其成为环:

ring_type points {
{   0,   0 },
{ 100,   0 },
{ 100, 100 },
{   0, 100 },
{   0,   0 },
};
bg::append(P, points);

仍然不行,但更好:住在科里鲁

POLYGON((0 0,100 0,100 100,0 100,0 0)) invalid (Geometry has wrong orientation)
Area:-10000

如您所见,我们的方向错误(应该是顺时针方向):

ring_type points {
{   0,   0 },
{   0, 100 },
{ 100, 100 },
{ 100,   0 },
{   0,   0 },
};

版画:住在科里鲁

POLYGON((0 0,0 100,100 100,100 0,0 0)) valid (Geometry is valid)
Area:10000

注意您可以使用bg::correct在简单的情况下更正有效性问题,如下所示。

样式和类型

实际上,环型是多边形类型的外环类型:

static_assert(std::is_same<ring_type, polygon_type::ring_type>{}, "synonyms");
static_assert(bg::point_order<ring_type>::value == bg::order_selector::clockwise, "orientation");

因此,可以直接从外环初始值设定项构造:

polygon_type P { {
{   0,   0 },
{   0, 100 },
{ 100, 100 },
{ 100,   0 },
{   0,   0 },
} };

将整个程序浓缩为一行:Live On Coliru

int main() {
typedef bgm::polygon<bgm::d2::point_xy<double> > polygon_type;
std::cout << "Area:" << bg::area(polygon_type { { {0, 0}, {0, 100}, {100, 100}, {100, 0}, {0, 0} } }) << std::endl;
}

或者你可以,确实从WKT/DSV阅读它:住在科里鲁

int main() {
bgm::polygon<bgm::d2::point_xy<double> > P;
bg::read_wkt("POLYGON((0 0,0 100,100 100,100 0,0 0))", P);
std::cout << "Area:" << bg::area(P) << std::endl;
}

仍在打印

Area:10000

最新更新