Как можно отсортировать вектор ниже описанным образом?

У меня есть набор точек(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.

→ Ссылка