Sorting 按坡度排序行

Sorting 按坡度排序行,sorting,line,computational-geometry,cgal,Sorting,Line,Computational Geometry,Cgal,在任何CGAL包中是否有按斜率对行(行2)排序的功能? 或者有人能推荐一种考虑退化情况(如垂直线)的排序算法吗?您可以使用CGAL::Direction\u 2。有一个来自Line_2的构造函数,有一个操作符有CGAL::compare_slopes自由函数用于Line_2对象,以及相应的K::compare_slope_2函子(可通过k从k的给定实例k中提取。比较\u slope\u 2\u object()) 您可以在以下示例中看到它: #include <algorithm>

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

您可以使用
CGAL::Direction\u 2
。有一个来自
Line_2
的构造函数,有一个
操作符有
CGAL::compare_slopes
自由函数用于
Line_2
对象,以及相应的
K::compare_slope_2
函子(可通过
k从
k
的给定实例
k
中提取。比较\u slope\u 2\u object()

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

#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;
}
#包括
#包括
#包括
#包括
typedef CGAL::精确谓词不精确结构内核K;
typedef typename K::Line_2 Line_2;
结构斜率比较器{
//K;
//斜率比较器(常数K&K=K()):K(K){
布尔运算符(){
返回(CGAL::比较斜率(l1,l2)<0);
//返回(k.比较斜率2对象()(l1,l2)<0);
}
};
int main(){
标准::向量l;
l、 向后推(线2(1,1,0.);
l、 向后推(线2(1.,-1,0.);
l、 向后推(线2(0,1,0.);//垂直
l、 向后推(线2(1e-100,1,0.);//几乎垂直
l、 向后推(线2(1e-100,-1,0.);//几乎垂直
l、 向后推(线2(0.,-1,1.);//也垂直
l、 向后推(线2(1e-100,1,2);//也几乎垂直
l、 向后推(线2(1e-100,-1,3.);//也几乎垂直
l、 向后推(线2(1,0,0.);//水平
l、 向后推(线2(1,1e-100,0.);//几乎水平
l、 向后推(线2(-1,1e-100,0.);//几乎水平
l、 向后推(线2(-1,0,4.);//也是水平的
l、 向后推(线2(-1,1e-100,5.);//也几乎水平
l、 向后推(线2(1,1e-100,6);//也几乎水平

std::cout事实上,实际上并不需要定义
struct Slope\u comparator
并使其调用全局函数。您可以直接将functor传递给
std::sort()
函数。

是否可以有两条线生成相同方向的对象?是的,如果两条线具有相同的方向,例如两条平行线。如果在应用程序中出现这种情况,可以使用std::multimap而不是std::map。