c++ - std::find 在 glm::vec3 的 vector 中不起作用(OpenGLTriangle 法线具有折角)

标签 c++ opengl vector find duplicates

我是 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/

相关文章:

c++ - 如何手动删除类的实例?

c - OpenGL 中的 MyReshape 函数不起作用

c++ - 最好保留 vec4 而不是 vec3 以避免总是转换?

c++ - 将 '3d' vector Pod 类型写入二进制文件 C++

c++ - 为什么 C++ 中的 main() 函数不采用除 int 和 void 以外的任何其他返回类型

c++ - 查找字符串中的特殊部分

java vector 到arraylist

c++ - 您如何在数组的特定位置插入数字?

c++ - 初始化nullptr_t时,0与其他整数如何区分?

c++ - 如何将局部对象坐标转换为世界坐标?