这应该是一个非常容易的问题,但我被困住了。
我有一个数组代表一个圆的每个角度的某个度量,所以它有360个元素。我必须在+/- 10度角附近检查这些测量的最小值。这是一个功能,因此角度可以改变。功能是这样的:
double MyClass::FindMin(int angle) {
lower_limit = x-10;
upper_limit = x+10;
for(int i=lower_limit; i<upper_limit; i++) {
//Find the minimum
}
return minimum;
}
如果我的角度值是300,那么for循环就像这样:
for(int i=290; i<310; i++)
当角度在360左右时出现问题:
for(int i=355; i<365; i++)
这显然不起作用,因为数组有360值。
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:4)
您可以使用模数运算符计算正确包装的新索引j
:
double findmin(int angle) {
int lower_limit = angle + 350;
int upper_limit = angle + 370;
double minimum = 0.0;
for(int i = lower_limit; i < upper_limit; i++) {
// compute a new index j that wraps using the modulus operator
int j = i % 360;
// find minimum using j
}
return minimum;
}
修改:根据评论中@EdHeal的反馈修改。
答案 1 :(得分:0)
如果我是你,我会写这样的(考虑到评论后)
int numOfIterations = 0;
int minAngle = currentAngle + 350;
while(numOfIterations < 20) // as you want it from -10 to 10 from your angle
{
minAngle = minAngle % 360;
doSomething(i);
i++;
numOfIterations++;
}
答案 2 :(得分:0)
你不仅要在360左右的角度出现问题,还要在0左右的角度出现问题。另请注意,你已经错过了&#34; + 10&#34;角度。我的建议是(制定Ajris的答案):
double MyClass::FindMin( int angle ) {
int current_angle = ( x + 350 ) % 360;
for( int i = 0; i < 21; ++i, ++current_angle ) {
current_angle = current_angle % 360;
//Find the minimum
}
return minimum;
}
答案 3 :(得分:-1)
尽管upvotes或downvotes使用%的(预编辑的)答案都没有考虑到我可能是否定的事实。
在你的循环中使用:
j=i<360?i:i-360;
j=i<0?i+360:i;
并使用j
用于i
for。