我的QList
由QVector3D
组成。 QVector3D
表示顶点或点。此列表还包含STL-File
的所有顶点。问题是顶点在列表中存在多次。需要一个STL-File的唯一顶点列表。如何使用Qt 5.0.2
实现它?
答案 0 :(得分:4)
QSet使用哈希函数来确保值的唯一性(QMap使用运算符<) 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