线段的叉乘

叉乘的定义和几何含义

定义 :定义点 a ( x 1 , y 1 ) , b ( x 2 , y 2 ) a(x_1,y_1),b(x_2,y_2) a(x1,y1),b(x2,y2)的叉乘为
∣ x 1 y 1 x 2 y 2 ∣ = x 1 y 2 − x 2 y 1 \left |\begin{array}{cc} x_1 &y_1\\ x_2 &y_2\\ \end{array} \right| = x_1y_2 - x_2y_1 x1x2y1y2=x1y2x2y1
假定 p 0 ( 0 , 0 ) p_0(0,0) p00,0为原点,该值得绝对值表示 p 0 a ⃗ , p 0 b ⃗ \vec{p_0a},\vec{p_0b} p0a ,p0b 为邻边的平行四边形的面积。
如果该值为正,那么代表$\vec{p_0b}处于\vec{p_0a}的逆时针方向,为零则共线,为负则处于顺时针方向。

一个非常重要的事:一般在几何中应当尽量避免使用除法和三角函数,因为这些操作往往会损失精度

叉乘的几个相关操作

  1. 给定三个点的坐标 p 1 , p 2 , p 3 p_1,p_2,p_3 p1,p2,p3,判断当沿着 p 1 , p 2 , p 3 p_1,p_2,p_3 p1,p2,p3的顺序行走,在 p 2 p_2 p2是是否需要左转亦或是右转。根据定义我们显然有如下伪代码。我们相当于将 p 1 p_1 p1点看做原点。这份代码实际上能够让我们判断一个顶点位于一条直线的左侧或是右侧。
Direction(p1,p2p3):
    let x =  cross(p2-p1,p3-p1)
    if x>0 :
    	turn left
    else if x < 0 :
    	turn right
    else if x==0:
    	move along
  1. 给定两条分别有端点指定的线段 p 1 p 2 , p 3 p 4 p_1p_2,p_3p_4 p1p2,p3p4,判断这两条直线是否相交。事实上线段只存在以下四种情况。橡胶的情况事实上只有两种

边界情况:一个顶点位于另一条线段上
一般情况:对于任意线段的两个端点,他们分别位于另一条线段的两端

Segment_Intersect(p1,p2,p3,p4):
	d1 = Direction(p3,p4,p1)
	d2 = Direction(p3,p4,p2)
	d3 = Direction(p1,p2,p3)
	d4 = Direction(p1,p2,p4)
	if d1*d2 < 0 and d3*d4 < 0 :
		return true   //解决一般情况
	else if d1*d2*d3*d4 == 0:
		先判断是哪一个点
		其次,通过限定横纵坐标范围判断是否在线段上。

线段情况

  • 给定n个点 p 1 , p 2 , p 3 . . . p n p_1,p_2,p_3...p_n p1,p2,p3...pn,按照逆时针对n个点进行排序。即按照极角对这n个点进行排序。很显然,我们可以通过叉乘的正负来进行比较任意两个点之间的极角的大小,然后调用排序即可。

案例

  1. O ( n 2 log ⁡ n ) O(n^2\log n ) O(n2logn)的时间复杂度判断,在给定n的点中,是否存在三点共线的情况。
  2. 给定n个点,判断该n个点的组成的多边形是否为凸多边形。
  3. 给定n个顶点构成的多边形,给定一个点 p 0 p_0 p0,判断 p 0 p_0 p0是否在此多边形内部( p 0 p_0 p0不处于多边形边界)
  4. 给定n个点构成的多边形,求面积。
    以上给定的都是点的坐标

参考思路

  1. 使用极角解决,以每一个点为圆心,计算极角,排序(mod π \pi π
  2. 首先需要排除共线情况。然后对点按照极角排序,一个多边形是凸多边形当且仅当沿着顺序行走,只会向一个方向转弯。及对于所有相邻点的d值正负都应该一致。
  3. 以该点引一条射线,如果该射线与多边形的交点为奇数,则处于内部,否则处于外部。
  4. 涉及到数学知识,即所有相邻三个点的叉乘之和的绝对值(not 绝对值之和)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东风中的蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值