判断三点共线,一行代码搞定!

发表时间:2023-04-11 16:02:57点击:2148

在游戏开发的时候,经常会需要对位置进行判断,其实会涉及三点共线问题的判断,即判断三个点是否在一条直线上。

或者我们在对图表数据进行分析的时候,需要知道哪些时间区间的数据是直线上升的,也需要判断几个数据点是否共线的问题。

思路一

首先,从数学的角度看,平面上任意三点都可以组成一个三角形,当三点共线时,就意味着三角形的面积为0,这是非常重要的判断依据。所以我们只需要算出这个三角形的面积,再判断面积是否为零就行了。那么无凭无据如何算出三角形的面积呢?

无论是游戏开发还是图表分析,都可以做出坐标系,得到每个点的坐标,这就够了。在高等数学的线性代数中,已知三点坐标值,是可以直接算出三点所组成的三角形面积的。

假如有3个点的坐标(x1,y1),(x2,y2),(x3,y3),这3点可以组成一个数据矩阵,通过正反两次交叉相乘,再相减,即可得出面积。

面积S=y3*x2+y2*x1+y1*x3-(y3*x1+y2*x3+y1*x2)

判断面积S是否为0即可。将这个公式的运算换成代码去执行就行了,对应的java代码如下:

public static boolean isCollinear(int x1, int y1, int x2, int y2, int x3, int y3) {
        return y3*x2+y2*x1+y1*x3-y3*x1-y2*x3-y1*x2==0;
    }

思路二

三点在一条直线上,那么就意味着他们的增量相同,即(x2,y2)相对于(x1,y1)的增量,与(x3,y3)相对于(x2,y2)的增量相同,就有另外一个公式:

public static boolean isCollinear(int x1, int y1, int x2, int y2, int x3, int y3) {
        return (y3 - y2) * (x2 - x1) == (y2 - y1) * (x3 - x2);
    }

判断它们增量是否相等即可。

如果你把这个公式展开,发现这其实就是一个公式,只是写法不同,但是对应的是两种不同的数学思路。

*原创文章,转载请注明出处