检查3点是否在同一条线上

Hos*_*ein 26 pseudocode

我想知道一段代码,它实际上可以告诉我2D空间中的3个点是否在同一条线上.伪代码也足够了,但Python更好.

flo*_*rin 63

您可以检查ABC三角形的面积是否为0:

[ Ax * (By - Cy) + Bx * (Cy - Ay) + Cx * (Ay - By) ] / 2
Run Code Online (Sandbox Code Playgroud)

当然,你实际上不需要除以2.

  • 这样做要好得多,因为没有除以0的风险. (3认同)
  • 只是指出一些东西......这在数学上等同于@ dcp上面的答案(如果你忽略了`/ 2`),但是检查区域是否为0可以更容易地添加容差......(即`stuff < err_tolerance`而不是`stuff1 == stuff2`,正如@dcp所做的那样) (3认同)

dcp*_*dcp 54

这是C++,但你可以将它改编为python:

bool collinear(int x1, int y1, int x2, int y2, int x3, int y3) {
  return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);
}
Run Code Online (Sandbox Code Playgroud)

基本上,我们检查点1和点2之间以及点1和点3之间的斜率是否匹配.斜率是y的变化除以x的变化,因此我们得到:

y1 - y2     y1 - y3
-------  =  --------
x1 - x2     x1 - x3
Run Code Online (Sandbox Code Playgroud)

交叉乘法给出(y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);

注意,如果你使用双打,你可以检查epsilon:

bool collinear(double x1, double y1, double x2, double y2, double x3, double y3) {
  return fabs((y1 - y2) * (x1 - x3) - (y1 - y3) * (x1 - x2)) <= 1e-9;
}
Run Code Online (Sandbox Code Playgroud)

  • 好戏.但是,检查浮点数是否相等是不安全的.您可以根据预定义的阈值测试绝对差值,该阈值取决于您希望实现的分辨率(灵敏度) (2认同)
  • 角落案件?例如x1 == x2 (2认同)
  • @dtb - x1 == x2工作正常,请考虑以下情况:共线(-2,0,-2,1,-1,1)返回false,共线(-2,0,-2,1,-2, 2)返回true.我认为角落案件已被覆盖,如果您不同意,请告诉我. (2认同)
  • 这需要比@ florin的答案更少的计算,即使它是等价的(所以我投票). (2认同)