假设我有以下图表-https://www.desmos.com/calculator/eabskyo0hk
我需要执行以下操作:
确定顶点(endpoint1),dest(newvertex)和endpoint1
是共线的。
如果它们不是共线的,则找到它们的交点。
我编写了以下代码来做到这一点-http://coliru.stacked-crooked.com/a/c08cbe113e706a9c
不幸的是,它不能正常工作。它说这些点不是共线的,但是然后说它们的交点是dest(newvertex),因此使第一条语句无效。
我想这一定是由于与浮点有关的问题,但是我想知道如何在不更改坐标的情况下进行修复?
提前致谢。
最佳答案
您的坐标值的幅度很大,因此将叉积幅度与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
关于c++ - 点是共线的,而不是同时共线的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45950821/