如何处理线段包含点算法中的浮点错误
How to handle floating point error in line segment contains point algorithm
我正在研究一些几何算法,并且我一直在努力缓解浮点错误。
更具体地说,我写了一个方法来检查线段是否包含一个点,通过将这个点到线段两个端点的距离之和与线段的长度进行比较。
我目前使用固定的 epsilon 值,但当点离端点太近或线段太长时,它似乎返回无效输出。
下面Java中的示例代码:
public boolean lineSegmentContainsPoint(Vec3D line, Vec3D point) {
final float eps = 0.001f;
final float lineLength = line.startPt.distanceTo(line.endPt);
final float distanceToStart = point.distanceTo(line.startPt);
final float distanceToEnd = point.distanceTo(line.endPt);
return Math.abs(lineLength - (distanceToStart + distanceToEnd)) < eps;
}
我知道问题是由累积的浮点错误引起的,但我不太清楚如何解决它。我尝试使用 double 而不是 float,但它在上述边缘情况下并没有真正帮助。非常感谢任何建议或帮助!
这样的点的轨迹
D0 + D1 - L < ε
(由三角不等式,不用取绝对值)是长轴椭圆的内部
L + ε/2
和短轴
√(2Lε + ε²).
它可能包含您意想不到的要点。我不会认为此测试对 "line segment insideness" 有好处。我怀疑你的问题与浮点数不准确有关。
我正在研究一些几何算法,并且我一直在努力缓解浮点错误。
更具体地说,我写了一个方法来检查线段是否包含一个点,通过将这个点到线段两个端点的距离之和与线段的长度进行比较。
我目前使用固定的 epsilon 值,但当点离端点太近或线段太长时,它似乎返回无效输出。
下面Java中的示例代码:
public boolean lineSegmentContainsPoint(Vec3D line, Vec3D point) {
final float eps = 0.001f;
final float lineLength = line.startPt.distanceTo(line.endPt);
final float distanceToStart = point.distanceTo(line.startPt);
final float distanceToEnd = point.distanceTo(line.endPt);
return Math.abs(lineLength - (distanceToStart + distanceToEnd)) < eps;
}
我知道问题是由累积的浮点错误引起的,但我不太清楚如何解决它。我尝试使用 double 而不是 float,但它在上述边缘情况下并没有真正帮助。非常感谢任何建议或帮助!
这样的点的轨迹
D0 + D1 - L < ε
(由三角不等式,不用取绝对值)是长轴椭圆的内部
L + ε/2
和短轴
√(2Lε + ε²).
它可能包含您意想不到的要点。我不会认为此测试对 "line segment insideness" 有好处。我怀疑你的问题与浮点数不准确有关。