我正在编写iPhone代码,模糊地识别滑动线是否是直线的。我得到两个端点的方位,并将其与0度,90度,180度和270度进行比较,公差为10度加或减。现在我用一堆if块来做,这看起来很笨重。
如果编写一个函数,给定方位 0..360,容差百分比(比如说20%=(-10°到+ 10°))和一个直的角度,如90度,返回轴承是否在公差范围内?
更新: 我或许太具体了。我认为一个很好的通用函数可以确定一个数字是否在另一个数字的百分比范围内具有效用很多领域。
例如:数字 swipeLength 10% maxSwipe ?那会很有用。
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
你看到我得到了什么吗?
答案 0 :(得分:4)
int AngularDistance (int angle, int targetAngle)
{
int diff = 0;
diff = abs(targetAngle - angle)
if (diff > 180) diff = 360 - diff;
return diff;
}
这应该适用于任何两个角度。
答案 1 :(得分: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或负值。您需要为生产代码添加它。
更新:使百分比包含+/-范围。
答案 2 :(得分: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),