前提条件有三个点o,a,b,如何判断b在线段oa何方向,可以使用叉积;
假设 -点 o 的坐标是$(o_x, o_y)$ -点 a 的坐标是$(a_x, a_y)$ -点 b 的坐标是$(b_x, b_y)$
从 o 出发的两个向量分别为:
1、oa =
这两个向量的叉积定义为: $$ oa \times ob = (a_x - o_x) \cdot (b_y - o_y) - (a_y - o_y) \cdot (b_x - o_x) $$
函数实现:
函数的具体代码就是直接实现了这个公式:
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分量
叉积的结果是一个标量,其几何意义为:
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
- 判断点的相对位置
-
可以判断点 a 和点 b 相对于点 o 的相对位置(左侧、右侧或共线)。
-
应用于几何算法,比如:
- 凸包算法:判断某点是否在凸包边界的左侧或右侧。
- 线段相交检测:判断两线段是否相交。
2、计算面积
如果 o 是坐标原点,a 和 b 是平面上的两点,叉积结果的绝对值等于三角形 OAB 的两倍面积: