【问题标题】:How can i make a QList<QVector3D> unique我怎样才能使 QList<QVector3D> 独一无二
【发布时间】:2013-08-14 18:28:25
【问题描述】:

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

【问题讨论】:

    标签: qt unique qlist


    【解决方案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()));
    }
    

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

    【讨论】:

    • 它不起作用。我以前就是这样试过的。但是在这个代码行QSet&lt;QVector3D&gt; noDublicatesSet = QSet::fromList(originalVector); 我得到了一个需要重载参数列表的错误。我认为 QSet 无法处理 QVector3D。
    • +1:有趣!它在Qt代码中的某个地方吗?我怀疑宏会为许多值返回 0。
    • 谢谢。听起来可能很愚蠢,但我必须在什么地方实现用于更改哈希函数的片段?
    • @Valentin Heinitz:老实说,我不记得我很久以前把它们带到哪里了。我真的不关心 Qt 3D 但那次他们做了一份工作,我把这段代码保存在一些“方便”的地方图书馆
    • @Shulle: 内联 uint qHash(const QVector3D &v, uint seed)
    【解决方案2】:

    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。但我认为这对演示很有用。

    【讨论】:

    • 谢谢。它工作正常。它对于我的第一个解决方案来说已经足够快了。
    • 我发现,分数为 0 的选定答案看起来不完整。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多