4

我正在编写 iPhone 代码,它可以模糊地识别刷过的线是否是直线。我得到两个端点的方位,并将其与 0、90、180 和 270 度进行比较,公差为正负 10 度。现在我用一堆 if 块来做,这看起来超级笨重。

如何编写一个函数,在给定轴承0..360、公差百分比(比如 20% = (-10° 到 +10°))和90 度等直角的情况下,返回轴承是否在公差范围内?

更新: 也许我太具体了。我认为一个很好的通用函数可以确定一个数字是否在另一个数字的百分比范围内,在许多领域都有用。

例如:数字swipeLength是否在maxSwipe的10%范围内?那会很有用。

 BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      // dunno how to calculate
 }

 BOOL result;

 float swipeLength1 = 303; 
 float swipeLength2 = 310; 

 float tolerance = 10.0; // from -5% to 5%
 float maxSwipe = 320.0;

 result = isNumberWithinPercentOfNumber(swipeLength1, tolerance, maxSwipe); 
 // result = NO

 result = isNumberWithinPercentOfNumber(swipeLength2, tolerance, maxSwipe);
 // result = YES

你明白我在说什么吗?

4

3 回答 3

4
int AngularDistance (int angle, int targetAngle) 
{

    int diff = 0;
    diff = abs(targetAngle - angle)

    if (diff > 180) diff = 360 - diff;

    return diff;
}

这应该适用于任何两个角度。

于 2009-08-24T05:16:39.537 回答
1

20% 作为小数等于 0.2。只需除以 100.0 即可得到小数。除以 2.0 得到可接受范围的一半。(合并为 200.0 除数)

从那里,加减 1.0 得到 90% 和 110% 的值。如果第一个数字在范围之间,那么你就有了。

BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
      float decimalPercent = percent / 200.0;
      float highRange = secondN * (1.0 + decimalPercent);
      float lowRange = secondN * (1.0 - decimalPercent);
      return lowRange <= firstN && firstN <= highRange;
 }

注意:这里没有检查 NaN 或负值的错误。您需要将其添加到生产代码中。

更新:使百分比包括 +/- 范围。

于 2009-08-25T06:52:13.393 回答
0

回答您的精致/新问题:

bool isNumberWithinPercentOfNumber (float n1, float percentage, float n2)
{

if (n2 == 0.0) //check for div by zero, may not be necessary for float
   return false; //default for a target value of zero is false
else
   return (percentage > abs(abs(n2 - n1)/n2)*100.0);
}

为了解释,您将测试值和目标值之间的绝对差除以目标值(两个“绝对”调用确保这也适用于负目标和测试数字,但不适用于负百分比/公差) . 这为您提供了以小数部分表示的差异百分比,将其乘以 100 以给出百分比的“常见”表达式(10% = 0.10),

于 2009-08-25T06:18:13.993 回答