顶点坐标从General_polygon_2

时间:2015-01-03 21:46:19

标签: c++ polygon vertex cgal

显示如何从General_Polygon_2提取顶点坐标的说明,指针或示例将非常感激。

用例是一个简单的多边形抵消(带圆圈的Minkowski和)。施工精度并不重要。我似乎可以构造源多边形以提供给approximated_offset_2,但是一旦构造了偏移多边形,我就无法弄清楚如何从General_polygon_2中提取顶点来自outer_boundary()方法。

示例代码如下:

#include <vector>
#include <cmath>
#include <cstdio>

// CGAL includes
#include <CGAL/Cartesian.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/approximated_offset_2.h>
#include <CGAL/offset_polygon_2.h>
#include <CGAL/Lazy_exact_nt.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>

// typedefs for CGAL items
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Polygon_2<Kernel> Polygon_2;
typedef CGAL::Point_2<Kernel> Point_2;
typedef CGAL::Gps_circle_segment_traits_2<Kernel> Gps_traits_2;
typedef Gps_traits_2::Polygon_with_holes_2 Offset_polygon_with_holes_2;
typedef CGAL::Lazy_exact_nt<CGAL::Quotient<CGAL::MP_Float> > NT;

typedef struct {double x; double y;} vertex_2;

void init_regular_ngon_2(std::vector<vertex_2>& ngon_vertices, const double center_x, const double center_y, const double r)
{
  unsigned int i, num_subdiv;
  double theta;

  num_subdiv = ngon_vertices.size();

  for (i = 0; i < num_subdiv; i++)
  {
    theta = 2.0 * M_PI * (double)i / (double)num_subdiv;
    ngon_vertices[i].y = center_y + (r * sin(theta));
    ngon_vertices[i].x = center_x + (r * cos(theta));
  }
}

void ngon_2_to_CGAL_poly(const std::vector<vertex_2>& ngon_vertices, Polygon_2& dest_poly)
{
  unsigned int i;

  for (i = 0; i < ngon_vertices.size(); i++)
  {
    dest_poly.push_back(Point_2(ngon_vertices[i].x, ngon_vertices[i].y));
  }
}

int main(void)
{
  CGAL::Lazy_exact_nt<NT>::set_relative_precision_of_to_double(1E-8);

  Polygon_2 test_poly;
  Offset_polygon_with_holes_2 offset_poly;
  std::vector<vertex_2> ngon(8);

  init_regular_ngon_2(ngon, 0.0, 0.0, 5.0);
  ngon_2_to_CGAL_poly(ngon, test_poly);

  offset_poly = approximated_offset_2(test_poly, 0.85, 1E-5);
  printf("The offset polygon has %d verts and %d holes\n", offset_poly.outer_boundary().size(), offset_poly.number_of_holes());

  // How to obtain vertex coordinates comprising offset polygon boundary??  Goal is to to store these in a vector of vertex_2 for later manipulation.

  return 0;
}

2 个答案:

答案 0 :(得分:1)

以下内容应该可以胜任:

typedef Gps_traits_2::General_polygon_2 General_polygon_2;
const General_polygon_2& outer_boundary = offset_poly.outer_boundary();
General_polygon_2::Curve_const_iterator cit=outer_boundary.curves_begin(),
                                        cit_end=outer_boundary.curves_end();

for(;cit!=cit_end;++cit)
{
  bool is_linear = cit->is_linear();
  std::cout << cit->source() << " " << cit->target() << "\n";  
}

所有成员函数的列表都是here

答案 1 :(得分:0)

approximated_offset_2返回Polygon_with_holes outer_boundary()你可以获得General_polygon_2,但你不能只通过它的曲线遍历它的顶点然后你就可以得到正如sloriot所提到的那样,曲线的目标和来源。目标点和来源点不是Kernel::Point_2成员,因此您无法使用=运算符,但您可以获得target.x()target.y()作为其坐标并且是类的成员CoordNT这不是 double / float 数字,而是3个数字(alpha, beta, gamma),您可以从等式 x = a + b * sqrt(c)计算精确值)

typedef Gps_traits_2::General_polygon_2 General_polygon_2;
const General_polygon_2& outer_boundary = offset_poly.outer_boundary();
General_polygon_2::Curve_const_iterator cit;

for(cit = outer_boundary.curves_begin();
            cit !=outer_boundary.curves_end();++cit){

        source = Point2((cit->source().x().alpha())+
                (cit->source().x().beta()*sqrt(cit->source().x().gamma())),
                (cit->source().y().alpha())+
                (cit->source().y().beta()*sqrt(cit->source().y().gamma())));

        target = Point2((cit->target().x().alpha())+
                (cit->target().x().beta()*sqrt(cit->target().x().gamma())),
                (cit->target().y().alpha())+
                (cit->target().y().beta()*sqrt(cit->target().y().gamma())));