我该如何使用GLM向量关系函数?

3

我想创建一个存储GLM向量(glm::vec3)的std::set。由于C++不知道如何在向量上执行<操作,因此必须传入Compare函数。

我可以通过创建以下结构自己编写:

struct compareVec
{
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        return lhs.x < rhs.x && lhs.y < rhs.y && lhs.z < rhs.z;
    }
};
std::set< glm::vec3, compareVec > myset;

然而,我确信GLM包含了自己的向量比较函数。

我找到了以下资源,但我不确定该如何使用它: https://glm.g-truc.net/0.9.4/api/a00137.html

我应该如何将其中一个比较函数传递给我的集合?


一个很棒的例子,说明我应该使用GLM的比较函数! - StickyBits
有一点题外话:你不应该这样实现,因为可能出现 lhs < rhs 和 rhs < lhs 的情况... - user4290866
你能尝试使用以下代码吗:set<glm::vec3, bool(*)(const glm::vec3& lhs, const glm::vec3& rhs)> myset(&compareVec); - user4290866
你的 glm::vec3 有哪种模板类型? - user4290866
我不确定...这只是标准的glm核心库吗?这不是我自己的定义。 - StickyBits
显示剩余2条评论
2个回答

7
好的,快完成了!glm::lessThan返回的是一个向量类型,而不是bool类型。这就是为什么你的比较器不起作用的原因。你可以在它上面使用glm::all来得到一个bool值。从glm::all的文档中可以看到:
bool glm::all ( vecType< bool > const & v )
如果x的所有分量都为true,则返回true。
如果这对你有意义,你必须自己决定,即使我建议不要这样做,因为据我所理解,这将导致以下问题:
Consider:
lhs = (1,2,3)
rhs = (0,1,4)

Than:

lhs < rhs ==> false, since lhs.x and lhs.y are larger than the corresponding components of rhs
rhs < lhs ==> false, since rhs.z component is larger than lhs.z

由于两个向量都不能被排序为较小的,这意味着它们是相等的。我怀疑这不是你想要的行为(我已经警告过你了)。

如果你仍然决定使用它,在MSVC2010上测试过的最小工作示例如下:

#include <set>
#include <glm/vec3.hpp>
#include <glm/detail/func_vector_relational.hpp>

struct compareVec
{
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        return glm::all(glm::lessThan(lhs, rhs));
    }
};

int main()
{

    std::set<glm::vec3, compareVec> myset;

    return 0;
}

也许这能帮到您。

1
通过优先考虑vec的早期组件,我们可以避免(1,2,3)和(0,1,4)同时小于彼此。我们想要的是与此相同的功能:
lh.x != rh.x ? 
    lh.x < rh.x
: lh.y != rh.y ? 
    lh.y < rh.y 
:   lh.z < rh.z

我认为这应该可以作为compareVec:

struct compareVec {
    bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
    {
        glm::vec3 nequ = glm::notEqual(lhs, rhs);
        return glm::lessThan(lhs, rhs)[nequ[0] ? 0 : nequ[1] ? : 1 : 2];
    }
};

我找不到一个返回第一个为真的索引的glm函数,所以我只是使用了 nequ[0] ? 0 : nequ[1]? : 1 : 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接