В этом разделе «Быстрый старт» показаны некоторые особенности Boost. Геометрия в виде аннотированных, относительно простых, фрагментов кода.
Код ниже предполагает, чтоповышает/геометрию.hpp
включено, и этопространство именУсиление:Используется геометрия
. Повышаю. Геометрия - это только заголовки, поэтому достаточно включить заголовки. Никакой связи с библиотекой не требуется.
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
using namespace boost::geometry;
Можно использовать только небольшую часть библиотеки. Например, расстояние между двумя точками является обычным вариантом использования. Повышаю. Геометрия может вычислить его из различных типов. Используя один из своих типов:
model::d2::point_xy<int> p1(1, 1), p2(2, 2);
std::cout << "Distance p1-p2 is: " << distance(p1, p2) << std::endl;
Если включены правильные заголовки и типы связаны с системой координат, в качестве точек могут использоваться различные другие типы: простые массивы C, Boost. Аррей, Буст. Тупле, Буст. Слияние импортных конструкций, собственных классов...
Регистрация и использование массива C:
#include <boost/geometry/geometries/adapted/c_array.hpp>
BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian)
int a[2] = {1,1};
int b[2] = {2,3};
double d = distance(a, b);
std::cout << "Distance a-b is: " << d << std::endl;
Другим часто используемым алгоритмом является точечный полигон. Реализуется в Boost. Геометрия под названиемв пределах
. Мы показываем его использование здесь, проверяя увеличение. Трубка (как точка), расположенная в пределах полигона, заполненная парами точек C Array.
Но сначала необходимо зарегистрировать буст. Тупл, как и массив C:
#include <boost/geometry/geometries/adapted/boost_tuple.hpp>
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
double points[][2] = {{2.0, 1.3}, {4.1, 3.0}, {5.3, 2.6}, {2.9, 0.7}, {2.0, 1.3}};
model::polygon<model::d2::point_xy<double> > poly;
append(poly, points);
boost::tuple<double, double> p = boost::make_tuple(3.7, 2.0);
std::cout << "Point p is in polygon? " << std::boolalpha << within(p, poly) << std::endl;
Можно рассчитать площадь полигона:
std::cout << "Area: " << area(poly) << std::endl;
По характеру библиотеки шаблонов можно смешивать типы точек. Мы снова вычисляем расстояние, теперь используя точку массива C и увеличение. Трубная точка:
double d2 = distance(a, p);
std::cout << "Distance a-p is: " << d2 << std::endl;
Перечисленные выше фрагменты генерируют следующий результат:
Distance p1-p2 is: 1.41421
Distance a-b is: 2.23607
Point p is in polygon? true
Area: 3.015
Distance a-p is: 2.87924
Также можно использовать некартезианские точки. Например, точки на сфере. Когда затем используется алгоритм, такой как расстояние, библиотека «проверяет», что она обрабатывает сферические точки и вычисляет расстояние над сферой, вместо применения теоремы Пифагора.
![[Note]](/img/note.png) | Note |
---|
Повышаю. Геометрия поддерживает географическую систему координат, но это в расширении и не выпущено в текущем выпуске Boost. |
Мы приблизим Землю к шару и вычислим расстояние между Амстердамом и Парижем.
typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::degree>
> spherical_point;
spherical_point amsterdam(4.90, 52.37);
spherical_point paris(2.35, 48.86);
double const earth_radius = 3959;
std::cout << "Distance in miles: " << distance(amsterdam, paris) * earth_radius << std::endl;
Он пишет:
Distance in miles: 267.02
Наконец, пример из совершенно другой области: разработка оконных приложений, например, с использованием QtWidgets. Как только классы Qt регистрируются в Boost. Геометрия позволяет их использовать. Мы можем, например, проверить, перекрываются ли два прямоугольника, и если да, переместить второй в другое место:
QRect r1(100, 200, 15, 15);
QRect r2(110, 210, 20, 20);
if (overlaps(r1, r2))
{
assign_values(r2, 200, 300, 220, 320);
}
В ссылке можно найти еще много примеров.