按间隔循环

时间:2018-03-30 14:25:50

标签: c++ algorithm for-loop

这应该是一个非常容易的问题,但我被困住了。

我有一个数组代表一个圆的每个角度的某个度量,所以它有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值。

有没有一种优雅的方法来解决这个问题?

4 个答案:

答案 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。