如何制作QList <qvector3d> unique </qvector3d>

时间:2013-08-13 08:20:56

标签: qt unique qlist

我的QListQVector3D组成。 QVector3D表示顶点或点。此列表还包含STL-File的所有顶点。问题是顶点在列表中存在多次。需要一个STL-File的唯一顶点列表。如何使用Qt 5.0.2实现它?

2 个答案:

答案 0 :(得分:4)

QSet使用哈希函数来确保值的唯一性(QMap使用运算符&lt;) Qt中没有QVector3D的qHash实现。 你可以实现自己的一个,例如例如:

//place anywhere in Qt-code
#include <QSet>
#include <QVector3D>
#include <QList>

uint qHash(const QVector3D &v)
{
    return qHash( QString( "%1x%2x%3" ).arg(v.x()).arg(v.y()).arg(v.z()) ) ;
}

int foo()
{
    QList<QVector3D> uvector3D_1;
    QSet<QVector3D> uvector3D_2;

    uvector3D_2 = QSet<QVector3D>::fromList(uvector3D_1);
return 0;
}

static int testFoo = foo();

因为它不是最快的,它依赖于Qt的函数qHash for QString。但我认为这对演示有好处。

答案 1 :(得分:1)

QList<QVector3D> originalVector = ...;

然后:

QSet<QVector3D> noDublicatesSet = QSet<QVector3D>::fromList(originalVector);

QSet<QVector3D> noDublicatesSet = originalVector.toSet();

你也可以添加一些东西,比如你需要QList ..

QList<QVector3D> destinationVector = QList<QVector3D>::fromSet(noDublicatesSet);

你也需要那些东西(对不起,我的代码已经很久了......忘了它们是外部的)..你可能想要改变哈希函数:

#define ROTL10(x) (((x) << 10) | (((x) >> 22) & 0x000000ff))
#define ROTL20(x) (((x) << 20) | (((x) >> 12) & 0x0000ffff))

uint qHash(double data)
{
union U {
    quint64 n;
    double f;
};
U u;
u.f = data;
return u.f;
}

inline uint qHash(const QVector3D &v, uint seed)
{
return qHash(v.x()) ^ ROTL10(qHash(v.y())) ^ ROTL20(qHash(v.z()));
}

P.S。这是Qt 5.0的代码,实际上是为向量添加缺少的qHash(),这就是为什么它们默认不适合QSet / QHash