Boost C++ 库

……这是世界上备受推崇且设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ Coding Standards

Boost Polygon Library:区间概念 - Boost C++ 函数库

Interval Concept

区间概念的标签是interval_concept

要将用户定义的类型注册为区间概念的模型,请为该类型特化 geometry concept 元函数。在下面的示例中,CInterval 被注册为区间概念的模型。

template <>
struct geometry_concept<CInterval> { typedef interval_concept type; };

区间语义是指它有一个低坐标和一个高坐标,并且存在一个不变式:低小于或等于高。此不变式由操作区间的通用库函数强制执行,并不期望数据类型本身或通过其 traits 将数据类型映射到区间概念。通过这种方式,只需要通过 traits 提供对元素的间接访问,就可以使 std::pair<int, int>、boost::tuple<int, int> 或 boost::array<int, 2> 都成为区间模型。

下面展示了默认的区间 traits。对于不符合默认行为的类型,需要特化这些 traits。

template <typename T>
struct interval_traits {
  typedef typename T::coordinate_type coordinate_type;

  static inline coordinate_type get(const T& interval, direction_1d dir) {
    return interval.get(dir);
  }
};

template <typename T>
struct interval_mutable_traits {
 
typedef typename T::coordinate_type coordinate_type;

  static inline void set(T& interval, direction_1d dir,

                         typename interval_traits<T>::coordinate_type value) {
    interval.set(dir, value);
  }
  static inline T construct(typename interval_traits<T>::coordinate_type low_value,
                            typename interval_traits<T>::coordinate_type high_value) {
    return T(low_value, high_value);
  }
};

函数

template <typename T>
coordinate_type get(const T& interval, direction_1d)
期望一个区间模型。根据 direction_1d 的值,返回区间的低坐标或高坐标。
 
template <typename T, typename coordinate_type>
void set(T& interval, direction_1d, coordinate_type)
期望一个区间模型。根据 direction_1d 的值,将区间的低坐标或高坐标设置为 coordinate。如果此更改后低坐标将大于高坐标,则两者都设置为输入坐标值。
template <typename T>
T construct(coordinate_type low, coordinate_type high)
给定低高坐标值,构造一个区间模型对象。
template <typename T1, typename T2>
T1& assign(T1& left, const T2& right)
将数据从模拟区间的右对象复制到模拟区间的左对象。
template <typename T, typename T2>
bool equivalence(const T& interval1, const T2& interval2)
给定两个区间模型对象,进行比较并返回 true,如果它们的低值和高值分别相等。
template <typename T>
bool contains(const T&, coordinate_type,
              bool consider_touch=true)
给定一个区间模型对象和一个坐标,如果区间包含该坐标,则返回 true。如果 consider_touch 标志为 true,则当坐标等于区间端点之一时,返回 true。
template <typename T1, typename T2>
bool contains(const T1& a, const T2& b,
              bool consider_touch = true)
当区间模型 a 包含区间模型 b 的两个端点时,返回 true。如果 consider_touch 标志为 true,即使 b 的端点等于 a 的端点,也认为 b 的端点包含在 a 中。
template <typename interval_type>
coordinate_type low(const interval_type& interval)
返回区间模型对象的低端点。
template <typename interval_type>
coordinate_type high(const interval_type& interval)
返回区间模型对象的高端点。
// get the center coordinate
template <typename interval_type>
coordinate_type center(const interval_type& interval)
返回区间模型对象的中心坐标。
template <typename interval_type>
void low(interval_type& interval, coordinate_type )
将区间模型对象的低端点设置为 coordinate 值。如果低端点将设置为大于高端点,则两者都设置为 coordinate 值。
template <typename interval_type>
void high(interval_type& interval, coordinate_type )
将区间模型对象的高端点设置为 coordinate 值。如果高端点将设置为小于低端点,则两者都设置为 coordinate 值。
template <typename interval_type>
coordinate_difference delta(const interval_type& interval)
返回区间模型对象从低端点到高端点的距离。
template <typename interval_type>
interval_type& flip(interval_type& interval,
                    coordinate_type axis = 0)
围绕 axis 坐标翻转区间模型对象。如果未提供 axis,则区间将围绕原点翻转。
template <typename interval_type>
interval_type& scale_up(interval_type& interval,
                        unsigned_area_type factor)
将区间模型对象的低端点和高端点乘以 unsigned 因子。
template <typename interval_type>
interval_type& scale_down(interval_type& interval,
                          unsigned_area_type factor)
将区间模型对象的低端点和高端点除以 unsigned 因子。
template <typename interval_type>
interval_type& scale(interval_type& interval,
                     double factor)
将区间模型对象的低端点和高端点乘以浮点值。
template <typename interval_type>
interval_type& move(interval_type& interval,
                    coordinate_difference displacement)
将 displacement 值加到区间模型对象的低端点和高端点。
template <typename interval_type>
interval_type& convolve(interval_type& interval,
                        coordinate_type b)
将 coordinate 值加到区间模型对象的低端点和高端点。
template <typename interval_type>
interval_type& deconvolve(interval_type& interval,
                          coordinate_type b)
从区间模型对象的低端点和高端点减去 coordinate 值。
template <typename T1, typename T2>
T1& convolve(T1& a, const T2& b)
将 b 的低端点加到 a 的低端点,并将 b 的高端点加到 a 的高端点。
template <typename T1, typename T2>
T1& deconvolve(T1& a, const T2& b)
将 b 的低端点从 a 的低端点减去,并将 b 的高端点从 a 的高端点减去。
template <typename T1, typename T2>
T1& reflected_convolve(T1& a, const T2& b)
将 b 的高端点加到 a 的低端点,并将 b 的低端点加到 a 的高端点。
template <typename T1, typename T2>
T1& reflected_deconvolve(T1& a, const T2& b)
将 b 的高端点从 a 的低端点减去,并将 b 的低端点从 a 的高端点减去。
template <typename T>
coordinate_difference euclidean_distance(const T&,
                      coordinate_type)
返回区间模型对象到坐标的距离。如果坐标等于区间的一个端点或包含在区间内,则返回零。
template <typename T1, typename T2>
bool intersects(const T1& interval, const T2& b,
                bool consider_touch = true)
当两个区间模型对象重叠时返回 true。如果 consider_touch 标志为 true,则触碰端点被视为重叠。
template <typename T1, typename T2>
bool boundaries_intersect(const T1& interval, const T2& b,
                          bool consider_touch = true)
当两个区间模型对象部分重叠,使得每个对象的一个端点包含在另一个对象内时,返回 true。如果 consider_touch 标志为 true,即使坐标等于端点,也认为该坐标被包含。
template <typename T1, typename T2>
bool abuts(const T1& a, const T2& b,
           direction_1d dir)
如果区间 b 紧邻区间 a 但不在其上重叠(在 dir 指定的 a 的端点处),则返回 true。
template <typename T1, typename T2>
bool abuts(const T1& a, const T2& b)
如果区间 b 紧邻区间 a 但不在其上重叠,则返回 true。
template <typename T1, typename T2>
bool intersect(T1& a, const T2& b,
               bool consider_touch = true)
将区间 a 设置为区间 a 和区间 b 的交集,并返回 true。如果两个区间不相交,则区间 a 不变,函数返回 false。如果 consider_touch 标志为 true,则相邻的区间被视为相交。
template <typename T1, typename T2>
T& generalized_intersect(T1& a, const T2& b)
与 intersect 相同,但如果它们不相交,则将 a 设置为 a 和 b 之间的区间。
template <typename T>
T& bloat(T& interval, coordinate_type)
将 coordinate 值加到区间的高端点,并从区间的低端点减去它。
template <typename T>
T& bloat(T& interval, direction_1d, coordinate_type)
根据 direction_1d,将 coordinate 值加到区间的高端点或从区间的低端点减去它。
template <typename T>
T& shrink(T& interval, coordinate_type)
从区间的高端点减去 coordinate 值,并将其加到区间的低端点。
template <typename T>
T& shrink(T& interval, direction_1d, coordinate_type)
根据 direction_1d,从区间的高端点减去 coordinate 值或加到区间的低端点。
template <typename T1, typename T2>
bool encompass(T1& a, const T2& b)
将 a 的 low 设置为 min(a.low, b.low),并将 a 的 high 设置为 max(a.high, b.high)。如果 b 最初不包含在 a 中,则返回 true。
template <typename T>
bool encompass(T& a, coordinate_type)
将 a 的 low 设置为 min(a.low, coordinate value),并将 a 的 high 设置为 max(a.high, coordinate value)。如果 coordinate value 最初不包含在 a 中,则返回 true。

区间数据

该库提供了一个区间概念的模型,声明为template<typename T> interval_data其中 T 是坐标类型。

此数据类型在需要区间时在内部使用,并且可供库用户使用,这些用户发现使用库区间数据类型而不是提供自己的类型更方便。该数据类型实现为便于与库 traits 一起使用。

成员

geometry_type interval_concept
coordinate_type T
interval_data() 默认构造区间的两个坐标值。
interval_data(T low, T high) 构造一个具有两个坐标的区间。
interval_data(const interval_data& that) 拷贝构造
interval_data& operator=(const interval_data& that) 赋值运算符。
template <typename IntervalType> 
interval_data& operator=(
const IntervalType& that) const
从一个区间模型对象赋值。
bool operator==(constinterval_data& that) const 相等运算符重载。
bool operator!=(constinterval_data& that) const 不等运算符重载。
bool operator<(constinterval_data& that) const 比较低坐标,然后比较高坐标以打破平局。
bool operator<=(constinterval_data& that) const 比较低坐标,然后比较高坐标以打破平局。
bool operator>(constinterval_data& that) const 比较低坐标,然后比较高坐标以打破平局。
bool operator>=(constinterval_data& that) const 比较低坐标,然后比较高坐标以打破平局。
T get(direction_1d dir) const 获取给定方向的坐标。
T low() const 检索低值。
T high() const 检索高端点。
void set(direction_1d dir, T value) 将给定方向的坐标设置为 value。
interval_data& low(T value) 设置低值。
interval_data& high(T value) 设置高值。
 
版权 Copyright © Intel Corporation 2008-2010.
License 根据 Boost Software License, Version 1.0 分发。(请参阅随附文件 LICENSE_1_0.txt或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)