我是 OpenGL 和 C++ 的新手,我的代码有问题:
vector<glm::vec3> vTempNormals;
glm::vec3 normal{...};
...
if (angle < glm::radians(creaseAngle))
{
if (angle != 0.0f)
{
if (std::find(vTempNormals.begin(), vTempNormals.end(), normal) == vTempNormals.end())
vTempNormals.push_back(normal);
}
}
我试图通过检查 normal
是否已经在 vector 中然后添加它来避免在我的 vector 容器中重复 glm::vec3 normal
.但它并不像我期望的那样工作。有时我仍然会重复。我做错了什么?
示例 - 有时有效:
角度
( 0.19509, 0, 0.980785 )
和
要检查的法线:
( 0.19509, 0, 0.980785 )
( 0.19509, 0, 0.980785 )
(-0.19509, 0, 0.980785 )
( 0, -1, -0 )
( -0.19509, 0, 0.980785 )
( 0, -1, 0 )
( 0, -1, 0 )
结果:
( -0.19509, 0, 0.980785 )
( 0, -1, -0 )
示例 - 有时它不起作用:angle
between ( 0.19509, 0, 0.980785 )
和要检查的法线:
( 0, 1, 0 )
( 0, 1, 0 )
( 0.555571, 0, 0.831469 )
( 0.19509, 0, 0.980785 )
( 0.19509, 0, 0.980785 )
( 0, 1, 0 )
( 0.555571, -0, 0.831469 )
结果:
( 0, 1, 0 )
( 0.555571, 0, 0.831469 )
( 0, 1, 0 )
最佳答案
您不能仅使用简单的 x == y
表达式来比较浮点值,就好像它们是整数一样。
您必须使用“阈值”、“容差” 来比较它们,例如像这样的东西:
// Assuming x and y are doubles
if (fabs(x - y) < threshold) {
// x and y are "near enough", so assume "x == y"
...
}
This document ,在这种情况下经常被引用,详细介绍了这个主题。
如果是 vector ,您可以使用差分 vector 检查它们是否“几乎相等”,例如
// I don't know the details of your glm::vec3 class;
// anyway, this code assumes that there is a 3D vector class
// that properly overloads operator-(), returning
// the vector difference between the two vector operands.
Vector3D delta = v2 - v1;
if (delta.Length() < threshold)) {
// ... Assume "v1 == v2"
}
或者,如果您只是比较单位 vector (就像您问题中的“法线”似乎暗示的那样),您可以使用点积来更有效地比较它们,检查这些单位 vector 的方向之间的角度是否“足够小”(即小于某个阈值)。
假设您定义了一种比较 vector 的正确方法,您可以使用 std::find_if()
(而不是 std::find()
)为您的自定义比较代码提供适当的 lambda。
关于c++ - std::find 在 glm::vec3 的 vector 中不起作用(OpenGLTriangle 法线具有折角),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30479561/