按坡度对线条进行排序



任何CGAL包中是否有按斜率对行(Line_2)排序的函数?或者有人能推荐一种考虑退化情况(如垂直线)的排序算法吗?

Line_2对象有CGAL::compare_slopes自由函数,以及相应的K::Compare_slope_2函子(可以通过k.compare_slope_2_object()K的给定实例k中提取)。

您可以在以下示例中看到它:

#include <algorithm>
#include <iostream>
#include <vector>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef typename K::Line_2 Line_2;
struct Slope_comparator {
  // K k;
  // Slope_comparator (const K &k = K()) : k(k) {}
  bool operator() (const Line_2 &l1, const Line_2 &l2) const {
    return (CGAL::compare_slopes (l1, l2) < 0);
    // return (k.compare_slope_2_object()(l1, l2) < 0);
  }
};
int main () {
  std::vector< Line_2 > l;
  l.push_back (Line_2 (    1.,     1., 0.));
  l.push_back (Line_2 (    1.,    -1., 0.));
  l.push_back (Line_2 (    0.,     1., 0.)); // vertical
  l.push_back (Line_2 (1e-100,     1., 0.)); // almost vertical
  l.push_back (Line_2 (1e-100,    -1., 0.)); // almost vertical
  l.push_back (Line_2 (    0.,    -1., 1.)); // also vertical
  l.push_back (Line_2 (1e-100,     1., 2.)); // also almost vertical
  l.push_back (Line_2 (1e-100,    -1., 3.)); // also almost vertical
  l.push_back (Line_2 (    1.,     0., 0.)); // horizontal
  l.push_back (Line_2 (    1., 1e-100, 0.)); // almost horizontal
  l.push_back (Line_2 (   -1., 1e-100, 0.)); // almost horizontal
  l.push_back (Line_2 (   -1.,     0., 4.)); // also horizontal
  l.push_back (Line_2 (   -1., 1e-100, 5.)); // also almost horizontal
  l.push_back (Line_2 (    1., 1e-100, 6.)); // also almost horizontal
  std::cout << "insertion order:" << std::endl;
  for (int i = 0; i < l.size(); ++i)
    std::cout << "    " << l[i] << std::endl;
  std::sort (l.begin(), l.end(), Slope_comparator());
  std::cout << "sorted order:" << std::endl;
  for (int i = 0; i < l.size(); ++i)
    std::cout << "    " << l[i] << std::endl;
}

注意,compare_slopes比较了方向的线,本质上是方向;如果这不是你想要的,你必须规范你的线(例如,确保所有y-坐标为正)。

您可以使用CGAL::Direction_2Line_2中有一个构造函数,Direction_2之间有一个operator <,可以对它们进行排序。

例如,您可以使用std::map<CGAL::Direction_2, CGAL::Line_2>,在此映射中插入对of Direction_2及其对应的Line_2。您在对std::map进行排序时直接获得了排序行。

实际上并不需要定义struct Slope_comparator并使其调用全局函数。您可以直接将函数CGAL::Compare_slope_2传递给std::sort()函数。

相关内容

  • 没有找到相关文章

最新更新