计算几何
计算几何
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
确定p0,找出所有点中纵坐标最小的点。如果点有多个,则再在已找出的点中找出横坐标的最小的点。(p0符合的要求是最靠下最偏左)
按相对的p0的极角大小,找出p1,p2,….pm(其中m为除p0点外的其他点的个数)
栈 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
上一篇: 注册服装商标多少钱,服装商标申请费用明细