计算几何

计算几何

1. 输入和输出

输入的几何对象一般是点集(二维)、线段集(点对)、多边形(顶点集)。

输出的是几何对象的查询。

一般问题有三种:

①一个线段是在与其共享端点的另一线段的哪侧?(顺时针或逆时针)→叉积

②判断两个线段是否相交?

③旋转扫除法求点集的凸包?

2.几何概念

①凸组合:

若P1(x1, y1)、p2(x2, y2),则有p3(x3,y3)。

x3 = αx1 + (1-α)x2; 其中0≦α≦1

y3 = αy1 + (1-α)y2;

②线段、有向线段

③向量

3.叉积(p1,p2代表向量)

P1(x1, y1)、p2(x2, y2)

P1×p2 = x1y2 - x2y1;

方向判定:求p1×p2结果,如果大于0,p1位于p2的顺时针方向。如果小于0,p1位于p2的逆时针方向。如果等于0,则p1和p2共线。

4. 判断线段p1p2、p3p4是否相交的判断条件?

①线段p1p2、p3p4是否相互跨越

②一条线段的某个端点是否在另一线段上(边界)

算法:

SEGMENTS-INTERSECT(p1, p2, p3, p4)
d1 = DIRECTION(p3, p4, p1)  //DIRECTION中第一个参数p3是共享端点
                         //判断p3p4相对于p3p1的方向
d2 = DIRECTION(p3, p4, p2)  //判断p3p4相对于p3p2的方向
d3 = DIRECTION(p1, p2, p3)      //判断p1p2相对于p1p3的方向
d4 = DIRECTION(p1, p2, p4)      //判断p1p2相对于p1p4的方向
If ((d1 > 0) and (d2<0) or(d1 < 0) and(d2 > 0) )
and ((d3 < 0) and (d4 > 0) or (d3 > 0) and(d4 < 0))
return TRUE;
elseif d1 == 0 and ON-SEGMENT(p3, p4, p1)    //d1==0说明共线,判断此点是否在线段                          //上,如果在,说明相交。不在的话,说明点在线段的延长线上,那就不相交。
return RTUE;
elseif d2 == 0 and ON-SEGMENT(p3, p4, p2)
return RTUE;
elseif d3 == 0 and ON-SEGMENT(p1, p2, p3)
return RTUE;
elseif d4 == 0 and ON-SEGMENT(p1, p2, p4)
return RTUE;
else return FALSE;

DIRECTION(pi, pj, pk)  //叉乘之积
return (pk - pi) × (pj - pi);

ON-SEGMENT(pi, pj, pk)
If min(xi, xj) << xk << max(xi, xj) and min(yi, yj) << yk << max(yi, yj)
return TRUE:
else return FALSE;

5. 求凸包

①简单多边形:没有相交的边
凸多边形:多边形的内部或边界上的任两点连线在多边形内部
凸包:点集Q的凸包是一个最小凸多边形P,满足Q中每个点都存在P的边界上或在P的内部,用CH(Q)表示Q的凸包。(|Q| ≧ 3)
问题:对于p0p1、p1p2,如果沿p0p1到p1p2,在p1处左拐?右拐?
p1×p2 >0 右拐

​ <0 左拐

​ =0 不拐

Graham Scan

  1. 确定p0,找出所有点中纵坐标最小的点。如果点有多个,则再在已找出的点中找出横坐标的最小的点。(p0符合的要求是最靠下最偏左)

  2. 按相对的p0的极角大小,找出p1,p2,….pm(其中m为除p0点外的其他点的个数)

  3. 栈 S


TOP(S)  栈顶点坐标
NEXT-TO-TOP(S)栈顶下一个点坐标
if m < 2 无凸包
else 初始化S
PUSH(p0, S) PUSH(p1, S) PUSH(P2, S)
for i = 3 to m 
    While (通过叉积找NEXT-TO-TOP(S)、TOP(S),pi非左拐)
        pop(S);
 PUSH(Pi, S)
return S;

推荐:
计算几何常用算法概览:http://blog.csdn.net/hoya5121/article/details/1462498
计算几何基础——【点积和叉积的用处】:http://blog.csdn.net/y990041769/article/details/38258761
计算几何总结:http://blog.csdn.net/clover_hxy/article/details/53966405
计算几何题目推荐:
http://www.cnblogs.com/kuangbin/archive/2013/05/20/3088268.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值