我有一个用 Objective C 编写的 iPhone 应用程序,我在其中收集用户在屏幕上绘制的触摸点以创建路径。
我希望能够精简这些数据。我的目标之一是检查点的角度是否超过某个阈值。例如,如果我在名为 a、b、c 的线上取任意三个相邻点,如果角度 ABC 在 180 度的 5 度范围内,那么我可以删除点 b,而不会对该线产生太大影响。
我试图通过将三角形 ABC 分成 2 个直角三角形来实现此目的。然后我使用 acosf() 求 a 处的角度 (BAC) 和 c 处的角度 (BCA)。然后我可以用 180 减去这两个角度来找到 ABC 的角度。
我的问题是 acosf() 经常返回 NaN。当它返回一个数字时,我在计算器上检查了它,该值是正确的。我尝试过返回 NaN 的值,但它们也不适用于计算器。我知道这是因为它们超出了 acosf() 的范围。我怎样才能避免这种情况?
这是我正在使用的代码:
float prevToNextDist = ccpDistance(prevPoint.location, nextPoint.location);
//work out the next point angle
float pointToNextDistance = ccpDistance(point.location, nextPoint.location);
float nextPointAngle = acosf((prevToNextDist/2)/pointToNextDistance);
nextPointAngle = CC_RADIANS_TO_DEGREES(nextPointAngle);
//work out the previous point angle
float prevToPointDistance = ccpDistance(prevPoint.location, point.location);
float prevPointAngle = acosf((prevToNextDist/2)/prevToPointDistance);
prevPointAngle = CC_RADIANS_TO_DEGREES(prevPointAngle);
//work out the point angle
float pointAngle = 180 - nextPointAngle - prevPointAngle;
有任何想法吗?
一个经典问题acos(x)
and acosf(x)
确保参数在范围内。
有时计算出来的x
is just由于各种 FP 问题,超出了 -1 x可能在范围内,但舍入/精度有时会出现类似的值1.0000001
。有了这个值x
(to 8小数位),那么acosf(x)
is NaN?
另一种方法是测试是否x
超出安排并将其带入。
if (x > 1.0) {
x = 1.0;
}
else if (x < -1.0) {
x = -1.0;
}
angle = acos(x);
更远:acosf()
仅提供 180 度 [0 到 pi] 的范围。对于您的任务,您可能需要使用atan2f()
。它提供了一个完整的答案“圈”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)