我刚刚开始在平面上使用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
为什么这六种射线?
答案 0 :(得分:2)
从documentation到explorer
:
通过递归组合二进制和一元运算,可以以非常复杂的直线结构结束。为了探索这种结构,有一个数据类型Nef_polyhedron_2 :: Explorer允许对直线结构进行只读探索。
因此,平面细分被象征性地以最大坐标为中心的坐标轴平行的方形框界定。所有扩展到无穷大的结构都被盒子修剪。线条和光线在框上具有符号端点。面是圆形封闭的。这里的非最大意味着它的几何扩展总是足够大(但是对于我们的直觉来说是有限的)。假设您以仿射点接近盒子,那么这个点总是在盒子内部。直线也是如此;他们总是与盒子相交。
这是一个正方形,所以这就是为什么您会得到0, 0 -> -1, 1
和0, 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。