【发布时间】:2025-12-04 21:20:07
【问题描述】:
我正在编写 iPhone 代码,它可以模糊地识别刷过的线是否是直线。我得到两个端点的方位,并将其与 0、90、180 和 270 度进行比较,公差为正负 10 度。现在我用一堆 if 块来做这件事,看起来超级笨重。
如何编写一个函数,给定 bearing 0..360,tolerance 百分比(比如 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
你明白我在说什么吗?
【问题讨论】:
-
相隔 180 度的角度是否有区别,例如从上到下 90 绘制的垂直线和从下到上 270 绘制的同一条线,还是它们相同?
-
你真的是说容忍度是一个百分比吗?百分之几?我认为一个简单的角度差异作为阈值更有意义。
-
一个相关问题:*.com/questions/338762/…(这显示了如何计算两个向量之间的角度)。
-
“swipeLength 的数字是否在 maxSwipe 的 10% 范围内?”的意思还有些不清楚。我将其解释为:“swipeLength 是否在 maxSwipe 的 90% 到 maxSwipe 的 110% 的范围内?” (这也是我的第二个答案和马特的答案所假设的)。但是,在您的示例中,您说不应将 303 视为在您的目标范围内,只有当您的目标范围应为 maxSwipe 的 +/- 5%(即总范围为 10%)时才会出现这种情况,但是也许您将公差(角度)与百分比混淆了。
标签: math angle gesture-recognition fuzzy-comparison