Skip to content

HGX-DJK/polygonSelfIntersecting

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

线段交叉

前提条件有三个点o,a,b,如何判断b在线段oa何方向,可以使用叉积;

1、向量的叉积公式

假设 -点 o 的坐标是$(o_x, o_y)$ -点 a 的坐标是$(a_x, a_y)$ -点 b 的坐标是$(b_x, b_y)$

o 出发的两个向量分别为: 1、oa = $(a_x - 0_x,a_y - o_y)$ 2、ob = $(b_x - 0_x,b_y - o_y)$

这两个向量的叉积定义为: $$ 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分量

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、函数的应用场景

  1. 判断点的相对位置
  • 可以判断点 a 和点 b 相对于点 o 的相对位置(左侧、右侧或共线)。

  • 应用于几何算法,比如:

    • 凸包算法:判断某点是否在凸包边界的左侧或右侧。
    • 线段相交检测:判断两线段是否相交。

2、计算面积

如果 o 是坐标原点,a 和 b 是平面上的两点,叉积结果的绝对值等于三角形 OAB 的两倍面积:

$\text{面积} = \frac{1}{2} \lvert \mathbf{oa} \times \mathbf{ob} \rvert$

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages