判断三点共线,一行代码搞定!
在游戏开发的时候,经常会需要对位置进行判断,其实会涉及三点共线问题的判断,即判断三个点是否在一条直线上。
或者我们在对图表数据进行分析的时候,需要知道哪些时间区间的数据是直线上升的,也需要判断几个数据点是否共线的问题。
思路一
首先,从数学的角度看,平面上任意三点都可以组成一个三角形,当三点共线时,就意味着三角形的面积为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);
}
判断它们增量是否相等即可。
如果你把这个公式展开,发现这其实就是一个公式,只是写法不同,但是对应的是两种不同的数学思路。
下一篇:java实现冒泡算法的几种方式