Как можно отсортировать вектор ниже описанным образом?
У меня есть набор точек(x,y,z) в векторе, например такие:
struct Vector3D
{
float x,y,z;
}
std::vector<Vector3D>
{
Vector3D(-0.5, -0.5, -0.5)
Vector3D(0.0, -0.5, -0.5)
Vector3D(0.5, -0.5, -0.5)
Vector3D(0.5, -0.5, 0.0)
Vector3D(0.5, -0.5, 0.5)
Vector3D(0.0, -0.5, 0.5)
Vector3D(-0.5, -0.5, 0.5)
Vector3D(-0.5, -0.5, 0.0)
}
Можно заметить что это точки плоскости заданной в counter clockwise порядке. Мне эти точки нужно отсортировать таким образом, чтобы была сначала некоторая точка X, следом все точки чьи Z равны этой точке X, потом следующая точка X и все соответствующие ей Z и.т.д
Вот такой вывод я хочу получить:
std::vector<Vector3D>
{
Vector3D(-0.5, -0.5, -0.5)
Vector3D(-0.5, -0.5, 0.5)
Vector3D(-0.5, -0.5, 0.0)
Vector3D(0.0, -0.5, -0.5)
Vector3D(0.0, -0.5, 0.5)
Vector3D(0.5, -0.5, -0.5)
Vector3D(0.5, -0.5, 0.0)
Vector3D(0.5, -0.5, 0.5)
}
Можно заметить, что все точки сгруппированы по X Бьюсь об заклад, не могу написать такую сортировку, буду рад получить помощь.Спасибо
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Если компилятор достаточно современный -
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct Vector3D
{
float x,y,z;
};
int main(int argc, char * argv[])
{
vector<Vector3D> v = {
{-0.5, -0.5, -0.5},
{0.0, -0.5, -0.5},
{0.5, -0.5, -0.5},
{0.5, -0.5, 0.0},
{0.5, -0.5, 0.5},
{0.0, -0.5, 0.5},
{-0.5, -0.5, 0.5},
{-0.5, -0.5, 0.0}
};
sort(v.begin(),v.end(),[](auto a, auto b) { return tie(a.x,a.y,a.z) < tie(b.x,b.y,b.z); });
for(int i = 0; i < v.size(); ++i)
cout << v[i].x << " " << v[i].y << " " << v[i].z << endl;
}
Результат:
-0.5 -0.5 -0.5
-0.5 -0.5 0
-0.5 -0.5 0.5
0 -0.5 -0.5
0 -0.5 0.5
0.5 -0.5 -0.5
0.5 -0.5 0
0.5 -0.5 0.5
Если староват - ну, например,
struct Vector3D
{
float x,y,z;
};
bool operator < (const Vector3D& a, const Vector3D& b)
{
if (a.x < b.x) return true;
if (a.x > b.x) return false;
if (a.y < b.y) return true;
if (a.y > b.y) return false;
if (a.z < b.z) return true;
if (a.z > b.z) return false;
return false;
}
int main(int argc, char * argv[])
{
vector<Vector3D> v = {
{-0.5, -0.5, -0.5},
{0.0, -0.5, -0.5},
{0.5, -0.5, -0.5},
{0.5, -0.5, 0.0},
{0.5, -0.5, 0.5},
{0.0, -0.5, 0.5},
{-0.5, -0.5, 0.5},
{-0.5, -0.5, 0.0}
};
sort(v.begin(),v.end());
for(int i = 0; i < v.size(); ++i)
cout << v[i].x << " " << v[i].y << " " << v[i].z << endl;
}
Ну, а там смотрите, как вам сортировать надо. Тут по x, затем по y, затем по z.