线段交叉
前提条件有三个点o,a,b,如何判断b在线段oa何方向,可以使用叉积;
1、向量的叉积公式
假设
-点o的坐标是 ( o x , o y ) (o_x, o_y) (ox,oy)
-点a的坐标是 ( a x , a y ) (a_x, a_y) (ax,ay)
-点b的坐标是 ( b x , b y ) (b_x, b_y) (bx,by)
从o出发的两个向量分别为:
1、oa = ( a x − 0 x , a y − o y ) (a_x - 0_x,a_y - o_y) (ax−0x,ay−oy)
2、ob = ( b x − 0 x , b y − o y ) (b_x - 0_x,b_y - o_y) (bx−0x,by−oy)
这两个向量的叉积定义为:
oa X ob = ( a x − o x ) (a_x - o_x) (ax−ox) * ( b y − o y ) (b_y - o_y) (by−oy) - ( a y − o y ) (a_y - o_y) (ay−oy) * ( b x − o x ) (b_x - o_x) (bx−ox)
函数实现:
函数的具体代码就是直接实现了这个公式:
function cross(o, a, b) {return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
};
- (a[0] - o[0]) 和 (a[1] - o[1]) 分别是向量oa的x和y分量
- (b[0] - o[0]) 和 (b[1] - o[1]) 分别是向量ob的x和y分量
2、叉积的几何意义
叉积的结果是一个标量,其几何意义为:
1、大小 :表示oa和ob为边的平行四边形的有向面积;
2、正负号:表示向量的相对方向;
- cross(0,a,b)>0:ob在oa的逆时针方向(点b在oa的左侧)
- cross(0,a,b)<0:ob在oa的顺时针方向(点b在oa的右侧)
- cross(0,a,b)=0:ob和oa共线(点 o、a 和 b 在一条直线上)
图示:
假设o、a、b 的位置如下:
b\\ (逆时针方向)o---------a
此时cross(0,a,b)>0
若点b在oa的右侧
a// (顺时针方向)o---------b
此时cross(0,a,b)>0
3、函数的应用场景
- 判断点的相对位置
-
可以判断点 a 和点 b 相对于点 o 的相对位置(左侧、右侧或共线)。
-
应用于几何算法,比如:
- 凸包算法:判断某点是否在凸包边界的左侧或右侧。
- 线段相交检测:判断两线段是否相交。
- 计算面积
如果 o 是坐标原点,a 和 b 是平面上的两点,叉积结果的绝对值等于三角形 OAB 的两倍面积:
面积 = 1 2 ∣ o a × o b ∣ \text{面积} = \frac{1}{2} \lvert \mathbf{oa} \times \mathbf{ob} \rvert 面积=21∣oa×ob∣