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

Boost Polygon Library: Polygon Set Concept

Boost , ,


Polygon Set Concept

Тег концепта polygon_set —polygon_set_concept

Семантика многоугольника_множества равна нулю или более геометрических областей. Концепция набора полигонов может быть определена с координатами с плавающей точкой, но расстояние округления щелчка одной целочисленной единицы все еще будет применяться, кроме того, геометрия вне области, где одна целочисленная единица достаточна для обеспечения надежности, может привести к неопределенному поведению в алгоритмах.   Рекомендуется использовать целочисленные координаты для надежных операций.   В случае, если представленные данные содержат только геометрию Манхэттена, проверка времени выполнения будет по умолчанию для алгоритма Манхэттена.   Результаты, которые идентичны тому, что сделал бы общий алгоритм, но получены более эффективно.   В случае, если представленные данные содержат только Манхэттен и 45-градусную геометрию, проверка времени выполнения будет по умолчанию для более быстрого 45-градусного алгоритма.   Результаты могут незначительно отличаться от того, что делает общий алгоритм, потому что нецелочисленные пересечения будут обрабатываться по-разному.

Пользователям рекомендуется использовать std::vector и std::list of userdefined polygons или библиотеку polygon_set_dataobjects.  Списки и векторы моделей полигона_concept или полигона_with_holes_concept автоматически являются моделями полигона_set_concept.

Пример кодаcustom_polygon_set.cppдемонстрирует отображение определенного пользователем класса в библиотечном многоугольнике_set_concept

Объект, являющийся модельюpolygon_set_conceptможно рассматривать как модельpolygon_90_set_conceptилиpolygon_45_set_conceptесли во время выполнения определено соответствие ограничениям этих понятий.   Эта концепция литья осуществляется черезview_as<>()Функция.

view_as(polygon_set_object)
view_as(polygon_set_object)

Возвратное значениеview_as<>()может быть передан в любой интерфейс, который ожидает объект концептуального типа, указанного в его шаблонном параметре. Наборы полигонов не могут рассматриваться как одиночные полигоны или прямоугольники, поскольку обычно не может быть известно, содержит ли набор полигонов только один полигон без преобразования в полигоны.

Operators

Тип возврата некоторых операторов — тип шаблона оператораpolygon_set_view.   Этот тип сам по себе является моделью многоугольника 90, но, кроме того, может использоваться в качестве аргумента для конструктора и оператора присваиваниямногоугольника_множества_данных.   Шаблон оператора существует для устранения временных копий промежуточных результатов, когда булевы операторы связаны друг с другом.

Операторы объявляются внутри пространства именboost::polygon::operators.

template <typename T1, typename T2>
polygon_set_view operator|(const T1& l, const T2& r)
Булева операция ИЛИ (полигоновое соединение).   Принимает два объекта, которые моделируют полигон_множество или одно из его уточнений.   Возвращает шаблон оператора, который выполняет операцию по требованию, когда он прикован цепью или вложен в вызов функции библиотеки, такой как assign().   Ожидаемое n log n время выполнения, худший случай квадратичное время выполнения wrt. вершины + пересечения.
template <typename T1, typename T2>
polygon_set_view operator+(const T1& l, const T2& r)
То же, что и оператор.  Знак плюс также используется для операций ИЛИ в булевых логических выражениях.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
polygon_set_view operator&(const T1& l, const T2& r)
Булева и операция (пересечение полигона).   Принимает два объекта, которые моделируют полигон_множество или одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
polygon_set_view operator*(const T1& l, const T2& r)
Как оператор &.  Символ умножения также используется для операций И в логических выражениях Булева.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
polygon_set_view operator^(const T1& l, const T2& r)
Булева операция XOR (полигон устанавливает разъединение).   Принимает два объекта, которые моделируют полигон_множество или одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
polygon_set_view operator-(const T1& l, const T2& r)
Булева операция SUBTRACT (разница полигона).   Принимает два объекта, которые моделируют полигон_множество или одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator|=(const T1& l, const T2& r)
Так же, как оператор, но с самоназначением, левый операнд должен моделировать многоугольный набор, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator+=(T1& l, const T2& r)
Так же, как оператор +, но с самостоятельным назначением, левый операнд должен моделировать многоугольный набор, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator&=(const T1& l, const T2& r)
Так же, как оператор & но с самоназначением, левый операнд должен моделировать многоугольник_множество, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator*=(T1& l, const T2& r)
Так же, как оператор*, но с самостоятельным назначением, левый операнд должен моделировать многоугольный_множество, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator^=(const T1& l, const T2& r)
Так же, как оператор, но с самостоятельным назначением, левый операнд должен моделировать многоугольный набор, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator-=(T1& l, const T2& r)
Так же, как оператор, но с самостоятельным назначением, левый операнд должен моделировать многоугольный набор, а не одно из его уточнений.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1>
T1 operator+(const T1&, coordinate_type bloating)
Выполняет операции с изменением размера, раздуваясь путем вздутия амплитуды.   Если отрицательный результат — это усадка вместо вздутия.   Примечание: возвращает результат по стоимости.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1 operator-(const T1&, coordinate_type shrinking)
Выполняет операцию по изменению размера, сдуваясь путем вздутия амплитуды.   Если отрицательный результат — это вздутие, а не усадка.   Примечание: возвращает результат по стоимости.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator+=(const T1&, coordinate_type bloating)
Выполняет операции с изменением размера, раздуваясь путем вздутия амплитуды.   Если отрицательный результат — это усадка вместо вздутия.   Возвращает ссылку на измененный аргумент.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
T1& operator-=(const T1&, coordinate_type shrinking)
Выполняет операцию по изменению размера, сдуваясь путем вздутия амплитуды.   Если отрицательный результат — это вздутие, а не усадка.   Возвращает ссылку на измененный аргумент.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.

Functions

template <typename T1, typename T2>
T1& assign(T1& lvalue, const T2& rvalue)
Устраняет перекрытия в геометрии и копии с объекта, который моделирует полигон_множество или любые его уточнения, в объект, который моделирует полигон_множество. Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T1, typename T2>
bool equivalence(const T1& lvalue, const T2& rvalue)
Возвращается истинно, если объект, который моделирует полигон_множество или одно из его уточнений, охватывает точно такие же геометрические области, как и другой объект, который моделирует полигон_множество или одно из его уточнений.   Например, два объекта из полигона.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename output_container_type, typename T>
void get_trapezoids(output_container_type& output,
                    const T& polygon_set)
Выходной контейнер должен быть стандартным контейнером.   Срезы геометрии объекта, который моделирует полигон_множество или одно из его уточнений в неперекрывающиеся трапеции вдоль вертикальной ориентации нарезки и добавляет их к выходу, который должен иметь тип значения, который моделирует полигон или полигон_с_дырками.  Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename output_container_type, typename T>
void get_trapezoids(output_container_type& output,
                    const T& polygon_set,
                    orientation_2d orient)
Выходной контейнер должен быть стандартным контейнером.   Срезы геометрии объекта, который моделирует полигон_множество или одно из его уточнений в неперекрывающиеся трапеции вдоль указанной ориентации нарезки и добавляет их к выходу, который должен иметь тип значения, который моделирует полигон или полигон_с_дырками.  Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename polygon_set_type>
void clear(polygon_set_type& polygon_set)
Это делает объект пустым от геометрии.
template <typename polygon_set_type>
bool empty(const polygon_set_type& polygon_set)
Проверяет, пуст ли объект в геометрии.   Полигоны, которые полностью покрыты отверстиями, приведут к пустому возвращению истины.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T, typename rectangle_type>
bool extents(rectangle_type& extents_rectangle,
             const T& polygon_set)
Вычисляет ограничивающий ящик объекта, который моделирует набор полигонов, и хранит его в объекте, который моделирует прямоугольник.   Если многоугольник пустой, возвращается ложный.   Если есть отверстия вне раковин, они не способствуют протяженности многоугольника.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T>
area_type area(const T& polygon_set)
Вычисляет площадь, покрытую геометрией, в объекте, который моделирует полигон_set.  Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T>
T& bloat(T& polygon_set, unsigned_area_type bloating)
То же самое, что получить все полигоны, раздуть их и вернуть обратно.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T>
T& shrink(T& polygon_set, unsigned_area_type shrinking)
То же самое, что получить все полигоны, сжать их и перезаписать набор полигонов с полученными областями.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T, typename coord_type>
T& resize(T& polygon_set, coord_type resizing,
          bool corner_fill_arc = false,
          unsigned int num_circle_segments = 0)
То же самое, что вздутие, если изменение размера является положительным, то же самое, что уменьшение, если изменение размера является отрицательным.   Оригинальная топология при острых угловых вершинах сохраняется по умолчанию, сегментированные круглые дуги вставляются, если угловая_fill_arc верна.  num_circle_segments указывает количество сегментов для введения по полному кругу при заполнении острых угловых углов круглыми дугами.  Ожидаемая n log n время выполнения, худший случай квадратичная время выполнения wrt. вершины + пересечения.
template <typename T>
T& scale_up(T& polygon_set, unsigned_area_type factor)
Геометрия масштаба по неподписанному фактору.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T>
T& scale_down(T& polygon_set, unsigned_area_type factor)
Снижает геометрию по неподписанному фактору.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T, typename transformation_type>
T& transform(T& polygon_set,
             const transformation_type& transformation)
Применяет transformation.transform() на всех вершинах.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename T>
T& keep(T& polygon_set,
        unsigned_area_type min_area,
        unsigned_area_type max_area,
        unsigned_area_type min_width,
        unsigned_area_type max_width,
        unsigned_area_type min_height,
        unsigned_area_type max_height)
Сохраняет только области, удовлетворяющие критериям min/max в списке аргументов. Примечание: полезно для визуализации, чтобы отсеять слишком маленькие многоугольники.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.

Polygon Set Data Object

Тип набора данных полигона инкапсулирует внутренний формат данных, который служит вводом в алгоритм линии разметки, который реализует булевы операции полигона.   Он также отслеживает, были ли эти данные отсортированы или отсканированы, и сохраняет инвариант, который, когда его флаги указывают, что данные отсортированы или отсканированы, данные не были изменены, чтобы нарушить это предположение.   Использование типа Polygon Set Data напрямую может быть более эффективным, чем использование списков и векторов полигонов в вышеперечисленных функциях из-за инвариантов, которые он может применять, которые обеспечивают возможность поддерживать сортированную форму данных, а не выходить на полигоны, а затем прибегать к этим вершинам для последующей операции.

Декларация Polygon Set Data выглядит следующим образом:

шаблон
класс polygon_set_data;

Класс параметризуется по типу координатных данных. Алгоритмы, которые извлекают выгоду из знаний об инвариантах, применяемых классом, реализуются в качестве функций-членов, чтобы предоставить им доступ к информации об этих инвариантах.  

Пример кодаpolygon_set_usage.cppдемонстрирует использование библиотеки предоставленного полигона набора типов данных и функций

Member Functions

polygon_set_data() Конструктор по умолчанию.
template <typename iT>
polygon_set_data(iT input_begin, iT input_end)
Конструкция со сканирующей ориентацией из диапазона итераторов вставляемых объектов.
polygon_set_data(const polygon_set_data& that) Копировать конструкцию.
template <typename l, typename r, typename op>
polygon_set_data(const polygon_set_view<l,r,op>& t)
Копировать конструкцию из шаблона булевого оператора.
polygon_set_data&
operator=(const polygon_set_data& that)
Назначение из другого набора многоугольников может изменить ориентацию сканирования.
template <typename l, typename r, typename op>
polygon_set_data&
operator=(const polygon_set_view<l, r, op>& that)
Назначение от шаблона булевого оператора.
template <typename geometry_object>
polygon_set_data& operator=(const geometry_object& geo)
Назначение от вставляемого объекта.
template <typename iT>
void insert(iT input_begin, iT input_end)
Вставьте объекты диапазона итераторов.   Вставлены линейные вершины wrt.
void insert(const polygon_set_data& polygon_set) Вставьте набор многоугольников.  Вставлены линейные вершины wrt.
template <typename geometry_type>
void insert(const geometry_type& geometry_object,
            bool is_hole = false)
Вставьте объект геометрии, если это_дыра, то вставленная область является субтрактивной, а не аддитивной.   Вставлены линейные вершины wrt.
template <typename output_container>
void get(output_container& output) const
Ожидает стандартный контейнер из полигонов объектов.   Будет сканировать и устранять перекрытия. Преобразует геометрию многоугольника в объекты типа многоугольника и добавляет их к контейнеру.   Полигоны будут выведены с обмоткой против часовой стрелки, дырочные полигоны будут выведены с обмоткой по часовой стрелке.   Последняя вершина выходного полигона является дубликатом первой, и число точек равно числу кромок плюс 1.  Если требуется выходным типом данных, то у полигонов будут пробиты отверстия к внешней границе вдоль положительного направления y и внесетевые пересечения на внешней границе, введенные этим разрывом, будут усечены вниз.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename output_container>
void get_trapezoids(output_container& output) const
Ожидает стандартный контейнер из полигонных объектов.   Будет сканировать и устранять перекрытия.   Срезы многоугольника устанавливают геометрию для трапеции вертикально и прикрепляют их к контейнеру.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename output_container>
void get_trapezoids(output_container& output,
  orientation_2d slicing_orientation) const
Ожидает стандартный контейнер из полигонных объектов.   Будет сканировать и устранять перекрытия.   Срезы многоугольника устанавливают геометрию на трапеции вдоль заданной ориентации и прикладывают их к контейнеру.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
bool operator==(const polygon_set_data& p) const После сканирования представление данных геометрии в многоугольном множестве находится в математически канонической форме. Сравнение между двумя множествами является линейной операцией времени, когда они находятся в сканируемом состоянии. Будет сканировать и устранять перекрытия в обоих наборах полигонов.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections. 
bool operator!=(const polygon_set_data& p) const Обратная логика оператора эквивалентности.
void clear() Сделайте полигон пустым.   Примечание: не удаляет память.   Используйте сокращение, чтобы соответствовать идиоме и назначить по умолчанию построенный многоугольник для де-распределения.
bool empty() const Проверьте, не содержит ли многоугольник геометрии.   Будет сканировать и устранять перекрытия, потому что субтрактивные области могут сделать многоугольник пустым.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
void clean() const Сканировать и устранять перекрытия.   Ожидаемое n log n время выполнения, худший случай квадратичное время выполнения wrt. вершины + пересечения в первый раз, постоянное время впоследствии.
template <typename input_iterator_type>
void set(input_iterator_type input_begin,
         input_iterator_type input_end)
Перезаписывающая геометрия в многоугольном наборе с вставляемыми объектами в диапазоне итераторов.
template <typename rectangle_type>
bool extents(rectangle_type& extents_rectangle) const
Учитывая объект, который моделирует прямоугольник, сканирует и устраняет перекрытия в наборе полигонов, потому что субтрактивные области могут изменять его протяженность, затем вычисляет ограничивающий ящик и присваивает его протяженности. Ожидаемое n log n время выполнения, худший случай квадратичное время выполнения wrt. вершины + пересечения в первый раз, линейные впоследствии.
polygon_set_data&
resize(coord_type resizing,
       bool corner_fill_arc = false,
       unsigned int num_circle_segments = 0)
Накачайте, если изменение размера является положительным, дефлируйте, если изменение размера является отрицательным.   Оригинальная топология при острых угловых вершинах сохраняется по умолчанию, сегментированные круглые дуги вставляются, если угловая_fill_arc верна.  num_circle_segments указывает количество сегментов для введения по полному кругу при заполнении острых угловых углов круглыми дугами.  Указание нуля для num_circle_segments приводит только к одному сегменту, вставленному в острые углы.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename transformation_type>
polygon_set_data&
transform(const transformation_type& transformation)
Применяет transformation.transform() на вершинах, хранящихся в наборе полигонов.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
polygon_set_data& scale_up(unsigned_area_type factor) Масштабные вершины, хранящиеся внутри полигона, устанавливаются по фактору.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
polygon_set_data& scale_down(unsigned_area_type factor)  Масштабные вершины, хранящиеся в полигоне, устанавливаются по фактору.   Ожидаемый n log n runtime, худший случай квадратичный runtime wrt. vertices + intersections.
template <typename scaling_type>
polygon_set_data&
scale(const scaling_type& f)
Масштабные вершины, хранящиеся в полигоне, устанавливаются путем применения f.scale().   Ожидаемое n log n время выполнения, худший случай квадратичное время выполнения wrt. вершины + пересечения.
 
Copyright: Авторское право © Intel Corporation 2008-2010.
License: Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Статья Boost Polygon Library: Polygon Set Concept раздела может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:37:30/0.010080814361572/1