Search code examples
c++sorting3doutlining

Sorting algorithm for mesh slicing


I got a problem with the sorting algorithms for a 3D printer software. I get the xyz Data of the slices of a given .stl File as a vector with three columns and n rows, where n is the number of points for each slice.

So the code for the vector looks like this:

        x=matrix[n][0];
        y=matrix[n][1];
        z=matrix[n][2];

So matrix is my vector containing all coordinates for all points in the mesh.

When I print out the coordinates of the points I get an unsorted list. So the following list shows the points of the first layer/slice of a cube, with the dimensions of 10x10x10mm.

X=-5.000000, Y=2.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=-5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000

So the result of this is shown in this figur. Unsorted points

My first approach was to sort the points, but the result is far away from what I need to have. sorted

The sorted list looks like this

X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=5.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-2.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=5.000000, Y=-5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=2.000000, Y=5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-2.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=5.000000, Z=-2.000000 
X=-5.000000, Y=2.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 
X=-5.000000, Y=-5.000000, Z=-2.000000 

The only idea, how I could sort the points is to start in the first quadrant of a Cartesian coordinate system and then move to the following quadrants. As I'm computing layer by layer the z-coodrinate can be ignored. But for this, I don't know how to start the code. Does someone have a hint for me?

What I want to achieve is to sort the list of points in the following way:

X=-5.000000, Y=5.000000, Z=-2.000000
X=-5.000000, Y=2.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000

enter image description here


Solution

  • With the update, this is now fairly trivial. You want to sort the points by atan2(p1.y,p1.x) < atan2(p2,y, p2,x).