ACM计算几何-叉积应用

 

定义

OA=(x1,y1)  OB=(x2,y2) 
定义叉积:OA×OB=x1y2x2y1

性质

  1. SOAB=12|OA×OB| 
    这里写图片描述 
    如图是一种简单情况,叉积表示的面积即最大的矩形面积减去P1P2T3所构成的矩形面积。又T4=S4,即要证

    2(T1+T2+T3)=S1+T1+S2+T2
    又已知S1+P1=T1+T3+P2,and S2+P2=T2+T3+P1两式左右相加即证。 
    另外的情况也可利用面积的加减证明。

  2. 已知直线上的两点s、e,可以求出ax+by+c=0的参数 
    a = s.y-e.y; 
    b = e.x-s.x; 
    c = s×e;

应用

1. 判断点与直线的相对位置

在直线上取两点P,Q,构成直线的方向向量PQ。需要判断的点A构成APAQ两个向量。则规定AP×AQ的符号反映了点与直线的相对位置。当值为0时A在直线PQ上。

POJ 2318 2398

2. 判断线段与直线的位置关系

在直线外的两个点分别作应用1中的叉积操作,若得到的结果同号则在同侧,异号则在异侧。

POJ 3304:原题等价为是否存在一条直线(投影路径)与所有的线段相交 
POJ 1039:求从管子的一端到最远到达哪里。暴力枚举所有可能的光线方向,与管子端点相交、与管重合均可穿过。需注意光线虽与管子不相交但超出管子的情况。

3. 判断直线与直线的位置关系

有以下两种方法。

  1. 容易理解的是利用性质2,得到直线方程a1x+b1y+c1=0a2x+b2y+c2=0。当a1b2=a2b1,直线平行(特判重合的情况);否则两直线相交,直接解得x=c1b2+c2b1a1b2a2b1
  2. 分别在直线上取两点,类似于应用2,将其中一条作为基准直线,得到两个叉积结果。若都为0,则两直线重合。若两者不为0且值相等,则两直线平行。否则相交。 
    用叉积,而不是求出斜率,这样能避免斜率不存在的情况。

POJ 1269:过滤掉前两种情况后,求直线的交点坐标时再列出直线方程(ax+by+c=0)求解。

4. 判断线段与线段的位置关系

线段1、2所在的直线为3、4,则当1、4与2、3均相交时可得两线段相交,否则不相交。也可以根据题目条件简化其一,视条件而定。 
线线 
也被称为跨接条件。即线段相交必须满足线段1的左端点在线段2的右端点的左边,其余三个方向同理。

POJ 1556:枚举任意两个端点是否存在直线通道时,需判断该线段与其余的竖直线段是否相交。 
POJ 2653:该break时就break,否则T无休…… 
POJ 3449:差不多可以当作模拟题来做。 
CF 589D:可以抽象成线段来做。

5.判断多边形是否是凸包

顺次给出多边形的点{pi}判断其是否构成凸包。由于不知道是顺时针还是逆时针给出的,所以先记录一组(p1p0)×(p2p1)的符号作为基准。之后每组(pi+1pi)×(pn+2pn+1)的符号都与之比对,若异号,则不为凸包。 
注意:若题意允许三点共线,则先找到第一个非0的符号,再进行判断。并且允许有0存在。

6.判断点是否在凸多边形内

  1. 先特判点O是否在边上(可利用叉积为零)。
  2. 将点O作为顶点,顺次连接多边形的端点,得到n个角度。用叉积顺次得到各个角度的符号,若全部同号则点在凸多边形内。否则不在凸多边形内。

POJ 1584:先判断给出的点是否构成凸包,再判断圆心是否在凸包内,再看是否能容纳下这个圆。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值