欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算几何

程序员文章站 2022-04-01 12:57:08
...

计算几何

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