Geometry :

Subject: [ggl] Problem with sorting points in Polygon
From: Simonson, Lucanus J (lucanus.j.simonson)
Date: 2011-05-24 16:04:12

It looks to me like you could use the delaunay triangulation of the point cloud and discard all edges that are greater than your alpha threshold then merge to compute the alpha shape in n log n time. I'm sure there must be a more direct way with smaller constant factor. Nearest neighbor query could be used based on a query tree.

-----Original Message-----
From: ggl-bounces_at_[hidden] [mailto:ggl-bounces_at_[hidden]] On Behalf Of Markus Eich
Sent: Tuesday, May 24, 2011 4:58 AM
To: ggl_at_[hidden]
Subject: [ggl] Problem with sorting points in Polygon

Dear all

I am trying to recover the "concave" shape of a point cloud. For this I
use a method called Alpha Shapes (in CGAL) or Pivoting Ball Algroithm.
The shape is not convex (but could be).
The problem of th algorithm is that the points are not "ordered". For
instance, if I take a rectangular shape it looks like the screenshot
attached.

I though that using boost geometry would help. I filled the polygon_2d
structure and applied the "correct" method,

After filling the polygon Struct and applying the correct method, the
shape looks still like a spiderweb, not like a propper square, as it should.
I could of course apply the convex hull detection, but I want to
reconstruct the shape in a concave way.

Do you have any clues? Does the correct method really sort my points in
the polygon? What other sorting options to I have?

I am new go Boost::geometry

Cheers,

Markus

Here is my code snipped:

======================================================================

boost::geometry::polygon_2d sorted_poly;

//get points from the CGAL in an unorganized way

for(Vertice_iterator it = as.alpha_shape_vertices_begin(); it !=
as.alpha_shape_vertices_end(); it++){
Alpha_shape_2::Vertex_handle vh = *it;
boost::geometry::append(sorted_poly,
boost::geometry::make<boost::geometry::point_2d>(vh->point().x(),vh->point().y()));
}

boost::geometry::correct(sorted_poly);

std::size_t numPoints=boost::geometry::num_points (sorted_poly);

boost::geometry::linear_ring<boost::geometry::point_2d> outer=
sorted_poly.outer();

//Reproject points and fill PC structure
for (size_t i=0;i<numPoints;i++)
{
Eigen::Vector3f pbbx;
//take first and second dimension of the outer polygon ring

pbbx=boost::geometry::get<0>(outer[i])*u;
pbbx+=boost::geometry::get<1>(outer[i])*v;
pbbx+=p0;
alpha_shape.push_back(pcl::PointXYZ(pbbx[0],pbbx[1],pbbx[2]));
}

}

======================================================================

```--
Dipl. Inf. Markus Eich
Researcher
DFKI Bremen
Robotics Innovation Center
Mary-Somerville-Str. 9
28359 Bremen, Germany
Phone: +49 (0)421 17845-4105
Fax:   +49 (0)421 17845-4150
E-Mail: markus.eich_at_[hidden]
Weitere Informationen: http://www.dfki.de/robotik
-----------------------------------------------------------------------
Deutsches Forschungszentrum fuer Kuenstliche Intelligenz GmbH
Firmensitz: Trippstadter Stra?e 122, D-67663 Kaiserslautern
Geschaeftsfuehrung: Prof. Dr. Dr. h.c. mult. Wolfgang Wahlster
(Vorsitzender) Dr. Walter Olthoff
Vorsitzender des Aufsichtsrats: Prof. Dr. h.c. Hans A. Aukes
Amtsgericht Kaiserslautern, HRB 2313
Sitz der Gesellschaft: Kaiserslautern (HRB 2313)
USt-Id.Nr.:    DE 148646973
Steuernummer:  19/673/0060/3
-----------------------------------------------------------------------
```

Geometry list run by mateusz at loskot.net