2017-03-20 2 views
1

Je suis à la recherche d'une solution pour le problème suivant:Comment trier dans le sens antihoraire tout point d'un vecteur n elments

je comptais pour résoudre ce genre de vecteurs avec mais il est pas une solution pour tout mon cas .

J'écris avant this post about, comment trier les vecteurs de points avec (x, y, z).

Je vais expliquer ici quel est le problème.

Je possède ce vecteur:

Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
Point [1] = [X: 3.00;Y: 0.00;Z: 3.00] 
Point [2] = [X: 3.00;Y: 5.00;Z: 0.00] 
Point [3] = [X: 3.00;Y: 5.00;Z: 3.00] 
Point [4] = [X: 0.00;Y: 5.00;Z: 0.00] 
Point [5] = [X: 0.00;Y: 5.00;Z: 3.00] 
Point [6] = [X: 0.00;Y: 0.00;Z: 0.00] 
Point [7] = [X: 0.00;Y: 0.00;Z: 3.00] 

Première étape trier par z: Alors

std::sort(std::begin(vector_points), std::end(vector_points), 
[](auto const& a, auto const& b) {return (a.z < b.z); }); 

Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
Point [1] = [X: 3.00;Y: 5.00;Z: 0.00] 
Point [2] = [X: 0.00;Y: 5.00;Z: 0.00] 
Point [3] = [X: 0.00;Y: 0.00;Z: 0.00] 
Point [4] = [X: 3.00;Y: 0.00;Z: 3.00] 
Point [5] = [X: 3.00;Y: 5.00;Z: 3.00] 
Point [6] = [X: 0.00;Y: 5.00;Z: 3.00] 
Point [7] = [X: 0.00;Y: 0.00;Z: 3.00] 

Deuxième étape trier par y: Alors

auto yComp = [](const auto& p1, const auto& p2){return p1.y < p2.y;}; 

std::sort(vector_points.begin(), vector_points.begin() + 4, yComp); 

std::sort(vector_points.begin() + 4, vector_points.begin() + 8, yComp); 

Point [0] = [X: 3.00;Y: 0.00;Z: 0.00] 
Point [1] = [X: 0.00;Y: 0.00;Z: 0.00] 
Point [2] = [X: 3.00;Y: 5.00;Z: 0.00] 
Point [3] = [X: 0.00;Y: 5.00;Z: 0.00] 
Point [4] = [X: 3.00;Y: 0.00;Z: 3.00] 
Point [5] = [X: 0.00;Y: 0.00;Z: 3.00] 
Point [6] = [X: 3.00;Y: 5.00;Z: 3.00] 
Point [7] = [X: 0.00;Y: 5.00;Z: 3.00] 

Troisième étape trier par x: Alors

std::sort(vector_points.begin(), vector_points.begin() + 2, xComp); 

std::sort(vector_points.begin() + 2, vector_points.begin() + 4, xComp); 

std::sort(vector_points.begin() + 4, vector_points.begin() + 6, xComp); 

std::sort(vector_points.begin() + 6, vector_points.begin() + 8, xComp); 

Point [0] = [X: 0.00;Y: 0.00;Z: 0.00] 
Point [1] = [X: 3.00;Y: 0.00;Z: 0.00] 
Point [2] = [X: 0.00;Y: 5.00;Z: 0.00] 
Point [3] = [X: 3.00;Y: 5.00;Z: 0.00] 
Point [4] = [X: 0.00;Y: 0.00;Z: 3.00] 
Point [5] = [X: 3.00;Y: 0.00;Z: 3.00] 
Point [6] = [X: 0.00;Y: 5.00;Z: 3.00] 
Point [7] = [X: 3.00;Y: 5.00;Z: 3.00] 

Je voudrais un vecteur avec la première moitié des points triés dans un sens anti-horaire.

Quelqu'un pourrait-il m'aider?

+0

Votre tri tripple ne pas correctement parce que 'sorte std :: sort' est pas [ stable] (https://en.wikipedia.org/wiki/Sorting_algorithm#Stability). Vous devrez utiliser 'std :: stable_sort' à la place. Un meilleur moyen serait cependant de changer la fonction de comparaison en 'renvoyer std :: tie (a.x, a.y, a.z) nwp

Répondre

0

Je ne suis pas en train d'écrire la soution complète, mais vous pouvez passer un comparateur à std :: sort:

std::sort(std::begin(vector_points), std::end(vector_points), [](const auto& a, const auto& b) 
{ 
    if (a.z < 0) 
    { 
     //compare x and y points and return true/false depending. 
    } 
    else 
    { 
     //compare x and y points and return false/true depending. 
    } 
});