点是共线的,而不是同时共线

时间:2017-08-30 02:06:31

标签: c++ geometry

假设我有以下图表 - https://www.desmos.com/calculator/eabskyo0hk

我需要做以下事情:

  1. 确定apex(endpoint1),dest(newvertex)和endpoint1 是共线的。

  2. 如果它们不共线,请找到它们的交点。

  3. 我编写了以下代码来执行此操作 - http://coliru.stacked-crooked.com/a/c08cbe113e706a9c

    不幸的是,它没有正常工作。它表示这些点不是共线的,但它表示它们的交点是dest(newvertex),因此使第一个语句无效。

    我认为这必须归因于与浮点相关的问题,但我想知道如何在不改变坐标的情况下修复它?

    提前致谢。

1 个答案:

答案 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