2014-01-03 5 views
0

Я пытаюсь сортировать набор точек OpenSG по координате x внутри набора, но он, похоже, не работает.Компаратор C++ не работает

Мой компаратор:

struct less_than_x { 
    inline bool operator() (const OSG::Pnt3f& p1, const OSG::Pnt3f& p2) { 
     return (p1.x() < p2.x()); 
    } 
}; 

Мой код:

std::set<OSG::Pnt3f, less_than_x> positions3D; 

OSG::GeoPnt3fPropertyRefPtr pos = OSG::GeoPnt3fProperty::create(); 

pos->addValue(OSG::Pnt3f(1,2,3)); 
pos->addValue(OSG::Pnt3f(5,2,1)); 
pos->addValue(OSG::Pnt3f(4,4,2)); 
pos->addValue(OSG::Pnt3f(6,4,0)); 
pos->addValue(OSG::Pnt3f(3,5,1)); 

// Remove the Z Axis from all of the points 
for(OSG::UInt32 i = 0; i < pos->size(); i++) {   
    OSG::Pnt3f p;    
    pos->getValue(p,i); 
    OSG::Pnt3f p2 = OSG::Pnt3f(p.x(), p.y(), 0); 
    positions3D.insert(p2); 
} 

for (std::set<OSG::Pnt3f>::iterator it = positions3D.begin(); it != positions3D.end(); it++) { 
    std::cout << *it << std::endl; 
} 

При печати из множества точек, они все еще не в порядке.

Любая помощь была бы принята с благодарностью.

Edit:

Vershov ответ, кажется, работает somwhat для меня, но при изменении ее в два раза и с помощью этого набора точек он терпит неудачу.

positions3D.insert(Pnt3f(-1, 0, 0)); 
positions3D.insert(Pnt3f(-0.850651, -0.309017, 0)); 
positions3D.insert(Pnt3f(-0.850651, 0, 0)); 
positions3D.insert(Pnt3f(-0.525731, 0, 0)); 
positions3D.insert(Pnt3f(-0.525731, 0.809017, 0)); 
positions3D.insert(Pnt3f(-0.525731, 0.5, 0)); 
positions3D.insert(Pnt3f(-0.447214, 0.525731, 0)); 
positions3D.insert(Pnt3f(-0.447214, 0.850651, 0)); 
positions3D.insert(Pnt3f(-0.447214, 0, 0)); 
positions3D.insert(Pnt3f(-1.05104e-007, 0.309017, 0)); 
positions3D.insert(Pnt3f(-7.00695e-008, 0.809017, 0)); 
positions3D.insert(Pnt3f(0, 1, 0)); 
positions3D.insert(Pnt3f(7.00695e-008, 0.809017, 0)); 
positions3D.insert(Pnt3f(1.05104e-007, -0.309017, 0)); 
positions3D.insert(Pnt3f(0.447214, 0, 0)); 
positions3D.insert(Pnt3f(0.447214, 0.850651, 0)); 
positions3D.insert(Pnt3f(0.447214, 0.525731, 0)); 
positions3D.insert(Pnt3f(0.525731, 0.5, 0)); 
positions3D.insert(Pnt3f(0.525731, 0.809017, 0)); 
positions3D.insert(Pnt3f(0.525731, 0, 0)); 
positions3D.insert(Pnt3f(0.850651, 0, 0)); 
positions3D.insert(Pnt3f(0.850651, 0.5, 0)); 
positions3D.insert(Pnt3f(1, 0, 0)); 

Они сортируются в следующем порядке:

-1, 0, 0 
-0.850651, -0.309017, 0 
-0.850651, 0, 0 
-0.525731, 0, 0 
-0.525731, 0.809017, 0 
-0.525731, 0.5, 0 
-0.447214, 0.525731, 0 
-0.447214, 0.850651, 0 
-0.447214, 0, 0 
-1.05104e-007, 0.309017, 0 
-7.00695e-008, 0.809017, 0 
0, 1, 0 
7.00695e-008, 0.809017, 0 
1.05104e-007, -0.309017, 0 
0.447214, 0, 0 
0.447214, 0.850651, 0 
0.447214, 0.525731, 0 
0.525731, 0.5, 0 
0.525731, 0.809017, 0 
0.525731, 0, 0 
0.850651, 0, 0 
0.850651, 0.5, 0 
1, 0, 0  
+0

Вы пробовали распечатать элементы, прежде чем вставлять их в комплект? – juanchopanza

+0

[OT]: Обратите внимание, что с вами компаратор, если у вас есть 2 записи с одним и тем же 'x', второй будет отброшен, так как' std :: set' рассмотрит '{x, 2, 3}' и '{x , 42, 42}. – Jarod42

+0

Последний порядок отсортирован по x. Что мне не хватает? – Macke

ответ

1

Пожалуйста, проверьте следующий код:

#include <set> 
#include <iostream> 

struct Pnt3f { 
     Pnt3f(int x, int y, int z) : m_x(x), m_y(y), m_z(z) {} 
     int x() const { return m_x; } 
     int y() const { return m_y; } 
     int z() const { return m_z; } 
private: 
     int m_x; 
     int m_y; 
     int m_z; 
}; 

struct less_than_x { 
    inline bool operator() (const Pnt3f& p1, const Pnt3f& p2) { 
     return (p1.x() < p2.x()); 
    } 
}; 

int main() { 

     std::set<Pnt3f, less_than_x> positions3D; 

     positions3D.insert(Pnt3f(1,2,0)); 
     positions3D.insert(Pnt3f(5,2,0)); 
     positions3D.insert(Pnt3f(4,4,0)); 
     positions3D.insert(Pnt3f(6,4,0)); 
     positions3D.insert(Pnt3f(3,5,0)); 

     for (std::set<Pnt3f>::iterator it = positions3D.begin(); it != positions3D.end(); ++it) { 
       std::cout << "(" << it->x() << ", " << it->y() << ", " << it->z() << ")" << std::endl; 
     } 
     return 0; 
} 

Выход следующим образом:

./a.out 
(1, 2, 0) 
(3, 5, 0) 
(4, 4, 0) 
(5, 2, 0) 
(6, 4, 0) 

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

positions3D.insert(p2); 
+0

Спасибо за ответ. Это исправило это для этих тестовых точек, но как только я попробую его с большими удвоениями, он начинает терпеть неудачу, например, я изменил структуру на использование double, а не int, и вставил эти точки (отредактировал оригинальный вопрос) – jmahony

+0

@jmahony: I не видите, где неправильный результат (с 'double'). (Я удивлен, что «дублированный» x все еще присутствует). – Jarod42

+0

Не могли бы вы предоставить образец «больших удвоений», который тормозит заказ? – vershov

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