2014-04-13 50 views
0

怪异的行为我有这样的代码:用max函数

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

的方法:angleBetweenVectors返回float

我看不到这是什么代码在做什么,它为什么它实际上正在建设,括号不正确匹配,我怕它会导致错误。我怎么才能得到我所有拨打angleBetweenVectors的电话的最大值?

+1

我会通过使一个'的std ::矢量简化它',使用'的push_back()'添加你漂浮在矢量上,然后调用'std :: max'找到最大的。它可能不是非常快,但它是可读的。 – Steve

回答

4

添加一些indetation,你会得到:

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

即这将返回值angleBetweenVectors(robustNormal, normalAtE);因为你缺少一个max

+0

缩进能创造奇迹,谢谢。 – Ogen

3

您可以使用标准算法的std ::最大的是具有作为参数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) 
); 
2

你也可以写你这样的代码:

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); 
+0

这不是回答这个问题。 – juanchopanza

+0

是的,没有回答,但我希望这是帮助。完整的答案由@Ed Heal给出。 –

1

C++ 11

#include <algorithm> 

largestDeviation = std::max({ 
    angleBetweenVectors(robustNormal, normalAtA), 
    angleBetweenVectors(robustNormal, normalAtB), 
    angleBetweenVectors(robustNormal, normalAtC), 
    angleBetweenVectors(robustNormal, normalAtD), 
    angleBetweenVectors(robustNormal, normalAtE) 
}); 
0
// 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)); 
} 
+1

似乎有点矫枉过正 –

+0

@EdHeal是的,这可能是这个简单的情况。我只是想着想一些更一般的情况,以防他们有更多的法线可供比较。 – CoryKramer