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

Example: Adapting a legacy geometry object model

Boost , Chapter 1. Geometry , Examples

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. Геометрия и причина ее довольно сложной реализации на основе шаблонов заключается в том, что она позволяет интегрироваться с унаследованными классами / объектами.

Определяя отношения между Ростом. Геометрические концепции и существующая, унаследованная объектная модель, унаследованные объекты могут использоваться вместо Boost. Собственные классы геометрии.

Повышаю. Затем геометрия будет с удовольствием читать и писать непосредственно от и к объекту наследия, рассматривая его как родной буст. Геометрический объект.

Это означает, что можно адаптировать алгоритмы и методы от Boost. Геометрия для любой существующей модели объекта унаследованной геометрии с очень небольшой стоимостью выполнения, что просто невозможно с большинством библиотек геометрии, где нужно сделать промежуточный объект, специфичный для библиотеки геометрии, которую вы используете.

Следующий пример продемонстрирует процесс адаптации модели объекта унаследованной геометрии для использования с Boost. Геометрия.

Adapting a shared geometry legacy object model

Example code: object hierarcy

class QPoint
{
    public:
        double x;
        double y;
        QPoint(double x, double y) : x(x), y(y) {}
};
class QLineString
{
    public:
        bool cw;
        std::vector<QPoint*> points;
};
class QRing
{
    public:
        std::vector<QLineString*> lines;
};
class QPolygon
{
    public:
        QRing* exterior;
        std::vector<QRing*> interiors;
};

Унаследованная иерархия объектов основана на топологии (например, два QRings могут совместно использовать одну QLineString) вместо точек напрямую (т.е. каждый объект не указывает непосредственно на его QPoints), и он также использует указатели для доступа.

Это еще один распространенный способ приблизиться к геометрии, чтобы обеспечить, например, общие границы между поверхностями. Повышаю. Подход геометрии использует простые функции и не имеет общих геометрий.

Несоответствие в представлении фиксируется созданием пользовательского итератора, который выставляет Boost. Диапазон точек для каждого объекта. Сюда, Буст. Функции геометрии будут работать на QRing, как если бы это был набор точек, что является обязательным требованием.

Adapting QPoint

Адаптация QPointдовольно проста, нужно просто выполнить требования.

Несмотря на то, что геометрия в нашей устаревшей объектной модели использует указатели QPoints, Boost. Геометрия автоматически обрабатывает преобразование из указателей в точки в ссылки в точки внутри, поэтому нам не нужно конвертировать их вручную.

В качестве альтернативы мы можем использовать макрос помощникаBOOST_GEOMETRY_REGISTER_POINT_2D (QPoint, double, cs::cartesian, x, y), который делает то же самое, что и наша ручная адаптация.

Образцовый код адаптирует QPoint кPoint Concept, используя специализацию класса признаков.

Adapting QLineString

адаптация QLineStringочень проста на поверхности, так как это просто «специализация черт::tag, определяющая Linestring_tag как тип». В качестве альтернативы мы можем использоватьBOOST_GEOMETRY_REGISTER_LINESTRING (QLineString)вспомогательный макрос, который делает то же самое, что и наша ручная адаптация.

Однако концепцияLineStringтакже требует, чтобы совокупность точек «должна вести себя как повышение. Range Random Access Range" и "тип, определяемый метафункцией range_value<...>::type, должен соответствовать Концепции Точки.

Это означает, что мы должны сделать две вещи:

  • Заставьте QLineString вести себя как буст. Диапазон с требованиями Random Access
  • Убедитесь, что рост. Диапазон итераций по QPoints, которые мы уже адаптировали

Это может показаться большой работой, но нам повезло: std::vector - это почти повышение. Диапазон, и уже повторяются над указателями-QPoints, которые обрабатываются Boost. Геометрия.Код для создания QLineString.Это довольно просто.

Adapting QRing

Адаптация QRingв основном равна QLineString в том, что есть тег и коллекция для итерации. В качестве альтернативы мы можем использовать макрос-помощникBOOST_GEOMETRY_REGISTER_RING(QRing), который делает то же самое, что и наша ручная адаптация.

Тем не менее, QRing выставляет указатели на QLineStrings, а не QPoints напрямую, чтотребуется в концепции Ring, поэтому недостаточно просто сделать std::vector в Boost. Диапазон. Нам нужно создать буст. Итератор, раскрывающий QPoints, и поскольку мы имеем дело с унаследованной объектной моделью, нам не разрешается изменять определение класса.

Итератор, который делает это, использует Boost. Фасад итератора не сильно отличается от примера, представленного в Boost. Собственная документация итератора(ссылка), за исключением того, что наш Boost. Диапазон должен быть случайным.

Теперь, с пользовательским итератором, мы можемопределить увеличение., которые проходят через QPoints.

Adapting QPolygon

Адаптация QPolygonкPolygon Conceptнемного более вовлечена, чем другие типы геометрии.

Единственное требование, которое не просто адаптировать, - это метод получения внутренних колец.

Повышаю. Геометрический полигон работает на объектах Кольца, и, к сожалению, Boost. Геометрия автоматически не обрабатывает преобразование из указателей в ссылки для колец внутри (только точки).

Поэтому нам нужно разоблачить QRings вместо указателей на QRings для внутренних колец, что означает немного больше работы, чем указатели на QPoints для QLineString и QRing.

Во-первых, мысоздаем рост. Итератор Фасад, который возвращается QRing вместо pointer-to-QRing:

Теперь у нас есть итератор, который может «преобразовать» наши указатели в QRing. Однако способ получения внутренних колец должен вернуть буст. Диапазон совместимого объекта, которым не является простой PolygonRingIterator.

Нам нужноопределить другой Boost.Range, который может быть построен с помощью PolygonRingIterators в качестве аргументов и возвращен из метода Get.

Conclusion

Вот так! Методы повышения. Геометрия теперь может использоваться непосредственно на примерах нашей модели объекта.


PrevUpHomeNext

Статья Example: Adapting a legacy geometry object model раздела Chapter 1. Geometry Examples может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Examples ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:25:57/0.0077941417694092/0