Научитесь использовать библиотеку для диагностики ваших проблем:
std::string reason;
bool ok = bg::is_valid(P, reason);
std::cout << "Polygon " << (ok?"valid":"invalid") << " (" << reason << ")\n";
Отпечатки: Жить на Coliru
Polygon invalid (Geometry has too few points)
Вы также можете распечатать геометрию в формате WKT/DSV (или даже SVG): Живите на Колиру
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);
Все еще плохо, но лучше: Жить на Coliru кбд>сильный>
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 },
};
Отпечатки: Жить на Coliru
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: Live On Coliru
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
person
sehe
schedule
29.12.2017