gpt4 book ai didi

objective-c - acosf() 返回 NaN

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:11 26 4
gpt4 key购买 nike

我有一个用 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)acosf(x) 的一个经典问题是确保参数在范围内。

有时,由于各种 FP 问题,计算出的 x 刚好在 -1 <= x <= 1 范围之外。从数学上讲,x 可能在范围内,但舍入/精度有时会得出类似 1.0000001 的值。使用该值 x(到 8 小数点),那么 acosf(x) 是 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()。它提供了一个完整的“循环”答案。

关于objective-c - acosf() 返回 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com