假设我有以下图表 - https://www.desmos.com/calculator/eabskyo0hk
我需要做以下事情:
确定apex(endpoint1),dest(newvertex)和endpoint1 是共线的。
如果它们不共线,请找到它们的交点。
我编写了以下代码来执行此操作 - http://coliru.stacked-crooked.com/a/c08cbe113e706a9c
不幸的是,它没有正常工作。它表示这些点不是共线的,但它表示它们的交点是dest(newvertex),因此使第一个语句无效。
我认为这必须归因于与浮点相关的问题,但我想知道如何在不改变坐标的情况下修复它?
提前致谢。
答案 0 :(得分:1)
您的坐标值具有非常大的幅度,因此将叉积幅度与std::numeric_limits<T>::epsilon()
进行比较会得到错误的结果。
修改:std::numeric_limits<T>::epsilon()
不适合作为“此处的小值”。
您可以尝试相应地将“小值”缩放到坐标。例如:
my_eps = 1.0E-9;
eps = my_eps * Max(abs(x1), abs(y1)....
请注意,两个大值的微小差异已经包含较大的相对误差,因此接下来的方法是错误的:
eps = my_eps * Max(abs(y1 - y2), abs(x1 - x3), abs(y1 - y3), abs(x1 - x2));
描述的方法应该改进结果,但不会提供“银弹” - 有强大的,容易出错的交叉计算的特殊计算方法(问题是全局的)。 Example - orientation test