2016-05-09 2 views
1

У меня возникла проблема с алгоритмами сортировки для программного обеспечения 3D-принтера. Я получаю xyz Данные срезов данного файла .stl как вектор с тремя столбцами и n строками, где n - количество точек для каждого среза.Алгоритм сортировки для среза сетки

Поэтому код для вектора выглядит следующим образом:

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

Так матрица мой вектор, содержащий все координаты для всех точек в сетке.

Когда я распечатываю координаты точек, я получаю несортированный список. Поэтому в следующем списке показаны точки первого слоя/куска куба с размерами 10x10x10 мм.

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 

Таким образом, результат этого показан на этом рисунке. Unsorted points

Мой первый подход состоял в том, чтобы сортировать точки, но результат далек от того, что мне нужно. sorted

отсортированный список выглядит следующим образом

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 

Единственной идея, как я могу сортировать точки, чтобы начать в первом квадранте декартовой системы координат, а затем перейти к следующему квадранту. Поскольку я вычисляю слой за слоем, z-coodrinate можно игнорировать. Но для этого я не знаю, как запустить код. У кого-то есть намек на меня?

То, что я хочу добиться того, чтобы отсортировать список точек следующим образом:

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

вам нужно знать, как соединяются ваши точки, нет никакого способа обойти это. если вы знаете, например, что ваши точки всегда определяют выпуклый набор (например, ваш куб), тогда [нахождение выпуклого корпуса] (https://en.wikipedia.org/wiki/Graham_scan) среза позволит вам восстановить это информации, иначе вы ввернуты. – BeyelerStudios

ответ

2

С обновлением, теперь это довольно тривиально. Вы хотите отсортировать очки по atan2(p1.y,p1.x) < atan2(p2,y, p2,x).

+0

@ MSalters: Я мог бы сделать что-то вроде этого: bool compare (vector const & s1, vector const & s2) { if (s1 [0]! = S2 [0]) return atan2 (s1 [1], s1 [0]) user3794592

+0

@ user3794592: Я не вижу причины для этого if-statement. Кроме того, в нем отсутствует условие else. – MSalters

Смежные вопросы