【问题标题】:Weird behavior with max functionmax 函数的奇怪行为
【发布时间】:2023-03-24 02:27:02
【问题描述】:

我有这个代码:

largestDeviation = max(max(max(angleBetweenVectors(robustNormal, normalAtA),
                               angleBetweenVectors(robustNormal, normalAtB)),
                           angleBetweenVectors(robustNormal, normalAtC)),
                       angleBetweenVectors(robustNormal, normalAtD)),
                       angleBetweenVectors(robustNormal, normalAtE);

方法:angleBetweenVectors 返回一个float

我看不出这段代码在做什么以及为什么它实际上在构建,括号没有正确匹配,我担心它会导致错误。我怎样才能获得所有对angleBetweenVectors 的调用的最大值?

【问题讨论】:

  • 我会通过创建一个std::vector<float> 来简化它,使用push_back() 将你的浮点数添加到向量中,然后调用std::max 来找到最大的。它可能不是超级快,但它是可读的。

标签: c++ max


【解决方案1】:

添加一些缩进,你会得到:

largestDeviation = 
max(
   max(
      max(
         angleBetweenVectors(robustNormal, normalAtA),
         angleBetweenVectors(robustNormal, normalAtB)
      ),
      angleBetweenVectors(robustNormal, normalAtC)
   ),
   angleBetweenVectors(robustNormal, normalAtD)
), 
angleBetweenVectors(robustNormal, normalAtE);

即它将返回 angleBetweenVectors(robustNormal, normalAtE); 的值,因为您缺少 max

【讨论】:

    【解决方案2】:

    您可以使用标准算法 std::max 作为参数 std::initializer_list 例如

    #include <algorithm>
    //...
    
    largestDeviation = std::max(
    {
       angleBetweenVectors( robustNormal, normalAtA ), 
       angleBetweenVectors( robustNormal, normalAtB ),
       angleBetweenVectors( robustNormal, normalAtC ), 
       angleBetweenVectors( robustNormal, normalAtD ), 
       angleBetweenVectors( robustNormal, normalAtE )
    } );
    

    至于您的代码,它确定函数angleBetweenVectors的相应调用返回的值中的最大值。该代码使用标准算法std::max,它有两个参数并确定两个参数之间的最大值。

    例如内部调用

    max( angleBetweenVectors(robustNormal, normalAtA ),
         angleBetweenVectors(robustNormal, normalAtB ) ),
    

    查找函数调用返回的两个值之间的最大值。函数std::max 的结果以及下一个调用(如果该函数又用于封闭的std::max 调用)。

    顺便说一句,您的代码有编译错误应该再调用一次std::max

    largestDeviation = 
    
    max(
       max(
          max(
             max( angleBetweenVectors(robustNormal, normalAtA ),
                  angleBetweenVectors(robustNormal, normalAtB) 
             ),
             angleBetweenVectors(robustNormal, normalAtC)
          ),
          angleBetweenVectors(robustNormal, normalAtD) 
       ),
       angleBetweenVectors(robustNormal, normalAtE)
    );
    

    【讨论】:

      【解决方案3】:

      你也可以这样写代码:

      maxAngle = angleBetweenVectors(robustNormal, normalAtA);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtB), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtC), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtD), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtE), maxAngle);
      

      或者,在为 maxAngle 选择一个好的初始值时,更一致,例如我会说-2*M_PI:

      maxAngle = -2 * M_PI;
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtA), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtB), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtC), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtD), maxAngle);
      maxAngle = max(angleBetweenVectors(robustNormal, normalAtE), maxAngle);
      

      【讨论】:

      • 这不是在回答问题。
      • 是的,没有回答,但我希望这会有所帮助。完整的答案由@Ed Heal 给出。
      【解决方案4】:

      C++11

      #include <algorithm>
      
      largestDeviation = std::max({
         angleBetweenVectors(robustNormal, normalAtA),
         angleBetweenVectors(robustNormal, normalAtB),
         angleBetweenVectors(robustNormal, normalAtC),
         angleBetweenVectors(robustNormal, normalAtD),
         angleBetweenVectors(robustNormal, normalAtE)
      });
      

      【讨论】:

        【解决方案5】:
        // Store all your normals in a vector
        std::vector<normal> normals;
        normals.push_back(normalAtA);
        normals.push_back(normalAtB);
        normals.push_back(normalAtC);
        normals.push_back(normalAtD);
        normals.push_back(normalAtE);
        
        // Iterate through your vector, and check each angle to see if it is the new max
        max_val = 0;
        vector<normal>::iterator it;
        for (it = normals.begin(); it != normals.end(); ++it)
        {
            max_val = max(max_val, angleBetweenVectors(robustNormal, *it));
        }
        

        【讨论】:

        • 似乎有点矫枉过正
        • @EdHeal 是的,对于这个简单的情况,它可能是。我只是想想一些更一般的东西,以防他们有更多的法线可以比较。
        猜你喜欢
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 2019-06-03
        • 2011-06-14
        • 2020-01-31
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多