Math 如何确定一个数字是否在另一个数字的百分比范围内

Math 如何确定一个数字是否在另一个数字的百分比范围内,math,angle,gesture-recognition,fuzzy-comparison,Math,Angle,Gesture Recognition,Fuzzy Comparison,我正在编写iPhone代码,模糊地识别被刷过的线是否是直的。我得到两个端点的方位,并将其与0、90、180和270度进行比较,公差为10度正负。现在我用一堆if块来做,看起来超级笨重 如何编写一个函数,给定轴承0..360、公差百分比(比如20%=(-10°到+10°)和直线角度如90度,返回轴承是否在公差范围内 更新:我可能太具体了。我认为一个好的、通用的函数可以确定一个数字是否在另一个数字的百分比内,它在很多方面都很有用 例如:maxSwipe的10%范围内是否有swipeLength的数字

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

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

更新:我可能太具体了。我认为一个好的、通用的函数可以确定一个数字是否在另一个数字的百分比内,它在很多方面都很有用

例如:maxSwipe10%范围内是否有swipeLength的数字?这将是有益的

 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
你明白我的意思了吗

int AngularDistance (int angle, int targetAngle) 
{

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

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

    return diff;
}

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

回答您的精炼/新问题:

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),

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;
 }
BOOL isnumberwhithinpercentofnumber(浮点第一、浮点百分比、浮点第二){
浮动小数百分比=百分比/200.0;
浮点高量程=秒N*(1.0+分贝);
浮动下限=秒N*(1.0-分贝);

返回下限是相距180度的不同角度,例如从上到下90度绘制的垂直线和从下到上270度绘制的同一条线,或者它们是相同的?你真的认为公差是百分比吗?百分比是什么?我认为简单的角度差作为阈值更有意义。相关问题:(这显示了如何计算两个向量之间的角度)。您所说的“swipeLength数是否在maxSwipe的10%范围内?”仍然有点不清楚。我将其解释为:“swipeLength是否在maxSwipe的90%到110%的范围内?”(这也是我的第二个答案,也是Matt的答案所假设的).然而,在您的示例中,您说303不应被视为在您的目标范围内,这仅在您的目标范围应为maxSwipe的+/-5%(即总范围为10%)时才会发生,但可能您混淆了公差(对于角度)百分比。你在回答什么问题?这是关于将一个方位与目标方位(0°、90°、180°、270°)进行比较的原始问题.该函数给出了两者之间的角度,您可以将其与公差进行比较,比如说,正如Jim Lewis所指出的10°,百分比对于角度来说没有什么意义,而且它们通常有点复杂(因为它们的圆度:例如350°+20°=10°)。我没有明确说明如果容差为20%,则表示范围为-10%到+10%。我很抱歉。好的,那就除以200.0而不是100.0。这对两个负数不起作用。例如,如果传入-20和-20,则返回false。