【发布时间】:2013-08-14 18:28:25
【问题描述】:
我有一个QList 由QVector3D 组成。 QVector3D 代表一个顶点或一个点。该列表还包含STL-File 的所有顶点。问题是一个顶点在列表中存在多次。需要一个 STL 文件的唯一顶点列表。如何使用Qt 5.0.2 实现它?
【问题讨论】:
我有一个QList 由QVector3D 组成。 QVector3D 代表一个顶点或一个点。该列表还包含STL-File 的所有顶点。问题是一个顶点在列表中存在多次。需要一个 STL 文件的唯一顶点列表。如何使用Qt 5.0.2 实现它?
【问题讨论】:
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()));
}
附:这是 Qt 5.0 的代码,实际上是为向量添加缺少的 qHash(),这就是为什么它们默认不适合 QSet/QHash
【讨论】:
QSet<QVector3D> noDublicatesSet = QSet::fromList(originalVector); 我得到了一个需要重载参数列表的错误。我认为 QSet 无法处理 QVector3D。
QSet 使用哈希函数来确保值的唯一性(QMap 使用运算符
//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。但我认为这对演示很有用。
【讨论】: