【发布时间】:2011-04-18 08:09:41
【问题描述】:
我想知道一段代码,它实际上可以告诉我 2D 空间中的 3 个点是否在同一条线上。伪代码也足够了,但 Python 更好。
【问题讨论】:
-
你的线是怎么定义的?二维平面上的函数?
-
你到底得到了什么?三分?还是三点和一条线?
标签: pseudocode
我想知道一段代码,它实际上可以告诉我 2D 空间中的 3 个点是否在同一条线上。伪代码也足够了,但 Python 更好。
【问题讨论】:
标签: pseudocode
这是 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);
}
基本上,我们正在检查点 1 和点 2 以及点 1 和点 3 之间的斜率是否匹配。斜率是 y 的变化除以 x 的变化,所以我们有:
y1 - y2 y1 - y3
------- = --------
x1 - x2 x1 - x3
交叉乘法得到(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;
}
【讨论】:
阅读this,并用它找到通过前两点的直线方程。按照说明查找m 和b。然后对于您的第三点,计算mx + b - y。如果结果为零,则第三个点与前两个点在同一条线上。
【讨论】:
规则 1:在任何线性二维空间中,两点总是在同一条线上。
取 2 个点并建立一个表示穿过它们的线的方程。 然后检查第三个点是否也在该线上。
祝你好运。
【讨论】:
可以检查ABC三角形的面积是否为0:
[ Ax * (By - Cy) + Bx * (Cy - Ay) + Cx * (Ay - By) ] / 2
当然,您实际上不需要除以 2。
【讨论】:
/2),但检查面积是否为0 可以更容易地添加容差。 ..(即stuff < err_tolerance 而不是stuff1 == stuff2 就像上面的@dcp 所做的那样)
- 进行调整,需要 2 次乘法和 5 次减法才能给出“应该为零”的结果。我会给@dcp打勾,而不是@florin。
y - y0 = a(x-x0) (1) 而a = (y1 - y0)/(x1 - x0) 和A(x0, y0) B(x1, y1) C(x2, y2)。查看C 是否满足 (1)。您只需替换适当的值。
【讨论】: