如何使用 GLM 向量关系函数?
How do I use GLM Vector Relational Functions?
我正在尝试创建一个 std::set 的 GLM 向量(特别是 glm::vec3)。由于 C++ 不知道如何对向量执行 < 操作,我必须传入一个比较函数。
我可以通过创建如下结构来编写自己的结构:
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::lessThan returns 是向量类型,不是 bool。这就是为什么您的比较器不起作用的原因。您可以在其上使用 glm::all
来获取布尔值。来自 glm::all
的文档
bool glm::all ( vecType< bool > const & v )
Returns true if all components of x are true.
Template Parameters
vecType Boolean vector types.
如果这对你有意义,你必须自己决定,即使我不建议这样做,据我所知,这将导致以下问题:
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;
}
也许这有帮助。
通过优先处理 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];
}
};
我找不到 returns 第一个索引为真的 glm 函数,所以我只使用了 nequ[0] ? 0 : nequ[1]? : 1 : 2
我正在尝试创建一个 std::set 的 GLM 向量(特别是 glm::vec3)。由于 C++ 不知道如何对向量执行 < 操作,我必须传入一个比较函数。
我可以通过创建如下结构来编写自己的结构:
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::lessThan returns 是向量类型,不是 bool。这就是为什么您的比较器不起作用的原因。您可以在其上使用 glm::all
来获取布尔值。来自 glm::all
bool glm::all ( vecType< bool > const & v )
Returns true if all components of x are true.
Template Parameters vecType Boolean vector types.
如果这对你有意义,你必须自己决定,即使我不建议这样做,据我所知,这将导致以下问题:
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;
}
也许这有帮助。
通过优先处理 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];
}
};
我找不到 returns 第一个索引为真的 glm 函数,所以我只使用了 nequ[0] ? 0 : nequ[1]? : 1 : 2