CGAL:2D约束Delaunay三角剖分 - 向约束添加信息

时间:2014-01-17 12:50:55

标签: constraints triangulation cgal delaunay

可以在将信息添加到三角形对象之前将信息(如整数)附加到点。我这样做是因为我一方面需要一个int-flag,我用它来定义我的纹理坐标,另一方面我使用的索引,以便我可以创建一个索引的VBO。 http://doc.cgal.org/latest/Triangulation_2/Triangulation_2_2info_insert_with_pair_iterator_2_8cpp-example.html

但是我只想插入约束边而不是点。如果我插入两个CGAL返回奇怪的结果,因为点被馈送两次(一次作为点,一次作为约束边缘的点)。 http://doc.cgal.org/latest/Triangulation_2/Triangulation_2_2constrained_8cpp-example.html

是否可以以与点信息相同的方式连接到“约束”,以便在迭代结果面之前我只能使用此函数cdt.insert_constraint( Point(j,0), Point(j,6));

当我遍历三角形时,我需要一些方法来访问我之前定义的int-flags。像这样但不是在实际点上,而是由约束边缘定义的段的“末端”:

for(CDT::Finite_faces_iterator fit = m_cdt.finite_faces_begin(); fit != m_cdt.finite_faces_end(); ++fit, ++k) {

    int j = k*3;
    for(int i=0; i < 3; i++) {

        indices[j+i] = fit->vertex(i)->info().first;
    }
}

这个问题是我在此发布的另一个问题的一部分:Constrained (Delaunay) Triangulation。 由于这是我自己的问题,我是第二次独立发布。

1 个答案:

答案 0 :(得分:0)

问题的作者为自己找到了解决方案,但没有发布答案。所以,我会这样做。

答案位于官方网站examplesexplanation上。

当您需要Point的自定义类时,将描述这种情况。

获取MyPointC2的来源并修改/添加您需要的内容。

#ifndef MY_POINTC2_H
#define MY_POINTC2_H
#include <CGAL/Origin.h>

class Point_i2 {
private:
  double vec[2];
  int ind;
public:
  Point_i2() : ind(0)
  {
    *vec = 0;
    *(vec+1) = 0;
  }
  Point_i2(const double x, const double y, int i = 0) : ind(i)
  {
    *vec = x;
    *(vec+1) = y;
  }
  const double& x() const  { return *vec; }
  const double& y() const { return *(vec+1); }
  double & x() { return *vec; }
  double& y() { return *(vec+1); }
  int index() const { return ind; }
  int& index() { return ind; }
  bool operator==(const Point_i2 &p) const
  {
    return ( *vec == *(p.vec) )  && ( *(vec+1) == *(p.vec + 1) && ( ind == p.ind) );
  }
  bool operator!=(const Point_i2 &p) const
  {
      return !(*this == p);
  }
};
#endif // MY_POINTC2_H

然后创建新内核:

#ifndef MYKERNEL_H
#define MYKERNEL_H
#include <CGAL/Cartesian.h>
#include "Point_i2.h"

// K_ is the new kernel, and K_Base is the old kernel
template < typename K_, typename K_Base >
class MyCartesian_base
  : public K_Base::template Base<K_>::Type
{
  typedef typename K_Base::template Base<K_>::Type   OldK;
public:
  typedef K_                                Kernel;
  typedef Point_i2                         Point_2;

  template < typename Kernel2 >
  struct Base { typedef MyCartesian_base<Kernel2, K_Base>  Type; };
};
template < typename FT_ >
struct MyKernel
  : public CGAL::Type_equality_wrapper<
                MyCartesian_base<MyKernel<FT_>, CGAL::Cartesian<FT_> >,
                MyKernel<FT_> >
{};

现在我们可以使用新内核而不是默认内核:

typedef MyKernel<double>                   MK;
typedef CGAL::Filtered_kernel_adaptor<MK>  K;