2016-05-09 12 views
1

Ich habe ein Problem mit den Sortieralgorithmen für eine 3D-Drucker-Software. Ich erhalte die xyz-Daten der Schichten einer gegebenen .stl-Datei als Vektor mit drei Spalten und n Zeilen, wobei n die Anzahl der Punkte für jede Schicht ist.Sortieralgorithmus für Mesh-Slicing

So ist der Code für den Vektor wie folgt aussieht:

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

So Matrix mein Vektor ist, alle Koordinaten für alle Punkte in dem Gitter enthalten.

Wenn ich die Koordinaten der Punkte ausdrucke bekomme ich eine unsortierte Liste. Die folgende Liste zeigt also die Punkte der ersten Schicht/Scheibe eines Würfels mit den Abmessungen 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 

Also das Ergebnis davon ist in dieser Figur gezeigt. Unsorted points

Mein erster Ansatz war es, die Punkte zu sortieren, aber das Ergebnis ist weit weg von dem, was ich haben müssen. sorted

Die sortierte Liste sieht wie folgt aus

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 

die einzige Idee, wie ich die Punkte sortieren könnte, ist im ersten Quadranten eines kartesischen Koordinatensystem und dann zu bewegen, um den folgenden Quadranten zu starten. Während ich Schicht für Schicht rechne, kann der Z-Koodrinat ignoriert werden. Aber ich weiß nicht, wie ich den Code starten soll. Hat jemand einen Tipp für mich?

Was ich erreichen will, ist die Liste der Punkte in der folgenden Art und Weise zu sortieren:

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

+0

Sie müssen die Konnektivität Ihrer Punkte kennen, daran ist kein Weg vorbei. Wenn Sie beispielsweise wissen, dass Ihre Punkte immer eine konvexe Menge definieren (wie Ihr Würfel), dann würde [das Auffinden der konvexen Hülle] (https://en.wikipedia.org/wiki/Graham_scan) der Scheibe Ihnen erlauben, dies wiederherzustellen Informationen, sonst bist du geschraubt. – BeyelerStudios

Antwort

2

Mit dem Update, das jetzt ziemlich trivial. Sie möchten die Punkte nach atan2(p1.y,p1.x) < atan2(p2,y, p2,x) sortieren.

+0

@ MSalters: So konnte ich etwas tun, wie folgt aus: vergleichen bool (Vektor konst & s1, Vektor konst & s2) { if (! S1 [0] = s2 [0]) return atan2 (s1 [1], s1 [0]) user3794592

+0

@ user3794592: Ich sehe den Grund für diese if-Anweisung nicht. Außerdem fehlt eine else-Klausel. – MSalters