CGAL:为什么半平面用六射线表示?

时间:2020-06-16 04:04:47

标签: c++ computational-geometry cgal

我刚刚开始在平面上使用Nef多面体-下面的简单程序创建了一个半平面,由y=0行定义,然后由CGAL Explorer浏览该半平面。

#include <iostream>

#include <CGAL/Exact_integer.h>
#include <CGAL/Extended_cartesian.h>
#include <CGAL/Nef_polyhedron_2.h>

using Kernel = CGAL::Extended_cartesian<CGAL::Exact_integer>;
using Polyhedron = CGAL::Nef_polyhedron_2<Kernel>;
using Line = Polyhedron::Line;

using std::cout;
using std::endl;

int main()
{
  const Polyhedron p(Line(0, 1, 0), Polyhedron::INCLUDED);  
  const auto ex = p.explorer();
  for (auto it = ex.vertices_begin(); it != ex.vertices_end(); ++it)
  {
    if (ex.is_standard(it))
    {
      cout << "Point: " << ex.point(it) << endl;
    }
    else
    {
      cout << "Ray:   " << ex.ray(it) << endl;
    }
  }
}

程序输出:

Ray:   0 0 -1 -1
Ray:   0 0 -1 0
Ray:   0 0 -1 1
Ray:   0 0 1 -1
Ray:   0 0 1 0
Ray:   0 0 1 1

为什么这六种射线?

2 个答案:

答案 0 :(得分:2)

documentationexplorer

通过递归组合二进制和一元运算,可以以非常复杂的直线结构结束。为了探索这种结构,有一个数据类型Nef_polyhedron_2 :: Explorer允许对直线结构进行只读探索。

因此,平面细分被象征性地以最大坐标为中心的坐标轴平行的方形框界定。所有扩展到无穷大的结构都被盒子修剪。线条和光线在框上具有符号端点。面是圆形封闭的。这里的非最大意味着它的几何扩展总是足够大(但是对于我们的直觉来说是有限的)。假设您以仿射点接近盒子,那么这个点总是在盒子内部。直线也是如此;他们总是与盒子相交。

假设这些顶点在盒子上,我的最佳猜测是: diagram

这是一个正方形,所以这就是为什么您会得到0, 0 -> -1, 10, 0 -> 1, 1之类的对角线的原因。我不是专家。

编辑:工程图是颠倒的,半平面是y >= 0,而不是y <= 0

答案 1 :(得分:1)

我在回答自己的问题。根据CGAL在线手册上的these解释,每个2D多面体都由一个无限大的 frame 界定,该框架由四个无限远距离的顶点表示。这些边界顶点具有扩展的坐标(+infinity, +infinity)(+infinity, -infinity)(-infinity, +infinity)(-infinity, -infinity)。 CGAL中的这些非标准顶点由射线表示-例如,点(+infinity, -infinity)被存储为始于原点{{1}的射线}和方向(0,0)

因此,由单个半平面(1,-1)组成的多面体将具有六个非标准顶点-四个属于框架,另外两个则描述了行y>0。它所有的脸都看起来像这样:

y=0

也请参见CGAL在线手册中的图17.3。