Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Quick Start

Boost , Chapter 1. Geometry , Chapter 1. Geometry

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

В этом разделе «Быстрый старт» показаны некоторые особенности Boost. Геометрия в виде аннотированных, относительно простых, фрагментов кода.

Код ниже предполагает, чтоповышает/геометрию.hppвключено, и этопространство именУсиление:Используется геометрия. Повышаю. Геометрия - это только заголовки, поэтому достаточно включить заголовки. Никакой связи с библиотекой не требуется.

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
using namespace boost::geometry;

Cartesian

Можно использовать только небольшую часть библиотеки. Например, расстояние между двумя точками является обычным вариантом использования. Повышаю. Геометрия может вычислить его из различных типов. Используя один из своих типов:

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

Non-Cartesian

Также можно использовать некартезианские точки. Например, точки на сфере. Когда затем используется алгоритм, такой как расстояние, библиотека «проверяет», что она обрабатывает сферические точки и вычисляет расстояние над сферой, вместо применения теоремы Пифагора.

[Note]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; // miles
std::cout << "Distance in miles: " << distance(amsterdam, paris) * earth_radius << std::endl;

Он пишет:

Distance in miles: 267.02

Adapted structs

Наконец, пример из совершенно другой области: разработка оконных приложений, например, с использованием 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);
}

More

В ссылке можно найти еще много примеров.


PrevUpHomeNext

Статья Quick Start раздела Chapter 1. Geometry Chapter 1. Geometry может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Geometry ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:28:01/0.0043909549713135/0