我有一个用 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;
有任何想法吗?