2017-03-20 1 views
1

mir eine Lösung für folgendes Problem bin auf der Suche:Wie zu sortieren, gegen den Uhrzeigersinn alle Punkte eines Vektors in mit n elments

ich dies von Vektoren mit Art zu lösen geplant, aber es ist keine Lösung für all meinen Fall .

Ich schreibe vor this post about, wie Vektor Punkte mit (x, y, z) zu sortieren.

Ich werde hier erklären, was das Problem ist.

Ich habe diesen Vektor:

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] 

Erste Schritt Sortierung z: Dann

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] 

Zweite Schritt Sortierung y: Dann

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] 

Dritter Schritt Sortierung x: Dann

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] 

I einen Vektor mit der ersten Hälfte der sortierten Punkte in Gegenuhrzeigerrichtung möchte.

Würde jemand mir helfen?

+0

Ihre tripple Sortierung Sortierung nicht richtig, weil 'std :: sort' ist nicht [ stabil] (https://en.wikipedia.org/wiki/Sorting_algorithm#Stability). Sie müssten stattdessen 'std :: stable_sort' verwenden. Ein besserer Weg wäre jedoch, die Vergleichsfunktion zu 'return std :: tie (a.x, a.y, a.z) nwp

Antwort

0

Ich schreibe nicht die volle soution, aber Sie können einen Vergleich passieren 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. 
    } 
}); 
Verwandte Themen