2017-10-08 206 views
1

我想创建一个GLM向量(glm :: vec3专门)的std :: set。由于C++不知道如何对向量执行<操作,因此我必须传入比较函数。如何使用GLM矢量关系函数?

我可以通过创建像这样的结构写我自己:

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

如何传递的这些比较函数到我的集合中的一个?

+0

一个很好的例子,为什么我应该使用GLM的比较函数! – StickyBits

+0

小题目:你不应该实现<像这样,因为你可能有lhs

+0

你可以尝试set myset(&compareVec);' –

回答

0

好吧,几乎在那里! glm :: lessThan返回一个向量类型,而不是bool。这就是为什么你的比较器不起作用。你可以使用glm::all来获得布尔值。从glm::all

布尔GLM ::所有的文档(vecType <布尔>常量& V)

返回true,如果x的所有组件都是如此。

模板参数 vecType布尔矢量类型。

如果这是有道理的,你必须自己决定,即使我建议反对,因为这,据我了解,会导致以下问题:

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; 
} 

也许这会有所帮助。