SteveN - 1 year ago 109

C++ Question

Explanations, pointers, or examples that show how to extract vertex coordinates from a

`General_Polygon_2`

The use case is offsetting (Minkowski sum with a circle) a simple polygon. Construction accuracy is not critical. I can seem to construct the source polygon to supply to

`approximated_offset_2`

`General_polygon_2`

`outer_boundary()`

A reduced example code is below:

`#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;

}

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

Something like the following should do the job:

```
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";
}
```

The list of all member functions are given here.

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**