计算几何学
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x1,x2 另一种定义: op1 × op2 =det y1,y2
= x1y2 – x2y1 x2,x1 = -det y2,y1 = - op2 × op1
p2(x2,y2) p(x1+x2,y1+y2)
α
O(0,0) p1(x1,y1)
3
右手法则可快速判断两个平面向量叉积的方向,继而判断两 个向量的相对位置关系。
计算几何学
朱成名 2014/4/18
大纲
计算几何的基本工具 叉积
点积
线段方面的问题
计算几何的常见问题
凸包方面的问题 最远/近点对问题
总结
2
计算几何的基本工具
叉积(向量积) 已知有向线段 op1 =(x1,y1),op2 =(x2,y2). op1 和 op2 的叉积为: op1 × op2 = op1 × op2 ×sin(α)。 几何意义:是以 op1和 op2为边的平行四边形的有向面积。
e d c b
设一序列T,当线段的左端点遇到 扫除线时,线段就按交点的y值递减 的插入到序列T中, 当其右端点遇 到扫除线时离开序列T。
11
对每条线段端点按x坐标从小到大排序,若x相同,左端点 放在右端点前,同属左或者右,按y值递增排序。 算法只能判断是否相交,不能求交点个数! for每个 3 c O(nlogn) 端点p
1
a
7 4
b
6
8
左端点
右端点 判断它的上下 相邻元素是否 相交
2 a y a c b a b 不 不 相 相 交 交 c a b 不 相 交
5 c b d 不 相 交
d
将线段插入T中
T 序 列
c b d 相 交
判断是否与其 相邻元素相交
删除
是 return true
否 否 比较下一 个端点
是 return true
性质:逆时针访问 凸包右链(左链)时, 下一个凸包顶点是 当前顶点在正x轴(负 x轴)上最小极角点。 左链 p
3
p2 p4
p1
p0
右链 18
Jarvis步进法
找最高点和最低点 O(nh)
从最低点开始找它的最小极角点,即为下一个凸包点, 再找出此点的下一个最小极角点… 左链 p 扫描到最高点,右链构造 完毕
不必排序,每次查找最小极角点O(n)。 总的是O(nh)
20
3.求凸包直径
旋转卡壳算法
p4
p3
思想:对每一条边求距离它最远 的顶点,求该点到边两端点的距 离,取max值,取最大的max值就 是凸包直径。
p2
p5 p1 p6
如何求距离一条边最远的顶点?
需要遍历除本边外的所有顶点吗?
p0
直观上:枚举,O(n2) 事实上:逆时针处理每条边时,最远点 也是逆时针变化。O(n) 21
bcbcq1123456q1q2123456q1q2131判断是否与其相邻元素相交交点插入顶Байду номын сангаас序列是否处理下一个顶点判断它的上下相邻元素是否相交交点插入顶点序列是否删除交换相交线段位置判断是否与其相邻位置相交处理下一个顶点是否t序列t序列yyaaaabbaa相交ccbaba不相交cacabb相交acacbb不相交acbacbcbcbbbonlogn大纲计算几何的基本工具计算何常线段方面的问题叉积点积14计算几何的常见问题总结凸包方面的问题最远近点对问题计算几何的常见问题凸包方面的问题1
判断连续线段转向 判断两线段是否相交 确定任一对线段是否相交 求凸包(Graham,Jarvis)
求凸包直径(旋转卡壳) 最远/近点对问题 求凸包直径 分治法
25
26
栈s p9 p7 p8
O(nlogn)
for i=3 to m(Q大小)
while次栈顶元素, 栈顶元素,pi组成 的角非左转 真
p6 p5 p4 p3 出栈
假
pi进栈
p12
p2
p1 p0
右 转
17
Graham扫描法 求凸包 Jarvis步进法
思想:从最低点开始沿外围拉绳子,包住各个点。
方法:以最低点和最高点为界构造凸包的右链和左链。
p1(x1,y1)
反向
4
计算几何的基本工具
点积(数量积) 已知有向线段 op1 =(x1,y1),op2 =(x2,y2)。 op1 和 op2 的点积为: op1 · op2 = op1 ×cos(α)× op2 。 几何意义:是op1在 op2 上的投影与op2 长度的乘积。 另一种定义: op1 · op2 = x1x2 + y1y2 = op2· op1 cos(2 Π - α) = cos(- α)= cos(α) 5
p2(x2,y2)
op1×op2 >0,表示op1到op2成逆时针, 即op2在op1的左边。
p1(x1,y1)
O(0,0)
op2×op1 < 0
若op1×op2 = 0,则表示op1和op2共线(同向或反向)。
p2(x2,y2) p1(x1,y1) O(0,0) O(0,0) p2(x2,y2)
共向
p7 性质: p1 凸包上按逆(顺)时针方向的连续顶点所构成 的夹角只包含左(右)转。
15
Graham扫描法 2.求凸包 Jarvis步进法
思想:维持一个栈s,点集Q中的每个点只进栈一次,非凸 包顶点会被弹出栈,最后栈s中仅包含凸包中的顶点。
选取p0作为y坐标最小的点,若有多个,选择x坐标最小的。 每个顶点按以p0为中心的极角递增排序。
a
d
return false
10
3.判断任意一对线段是否相交? 使用"扫除"的技术,即假设一条垂直扫除线沿X 轴方向从左 到右移动,每遇到线段端点,就进行一定的操作。
e a d
前提:无垂直线段; 没有三条输入线段相交于一个点。
c b
T 序 列
y
a a a d b c a b c b
d a c b
e d c b
p1(x1,y1) O(0,0) α
p2(x2,y2)
大纲
计算几何的基本工具 叉积
点积
线段方面的问题
计算几何的常见问题
凸包方面的问题 最远/近点对问题
总结
6
计算几何的常见问题
线段方面的问题
1.判断连续线段是向左转还是向右转? 计算叉积op1×op2。
若>0,即op2在op1的左边, 因此在p1点向左转。 若<0,即op2在op1的右边, 因此在p1点向右转。 若=0,即op2与op1共线。 7
方法二 : ad 〃 db>0 ( db (ad)指向ad (db)的前方 ) 9
判断两条线段是否相交?
ab ×ad与ab ×ac结果异号; 真 && cd ×ca与cd ×cb结果异号 假 有同号 无同号,有0 交点是否在 线段上 是 return true 否
c
return true
b
是
是否还存 在0 否 return false
p2 p1 p0
23
2.求最近点对
分治法 给定点集S,求距离最近的点对。 T(n) = 2T(n/2)+O(n) 选取直线L,把S分割成Sl , Sr。 O(nlogn)
d
d
p
R
递归地在Sl和Sr中找出其最小距离 dl , dr,并令d=min(dl,dr),则S中最 d 小距离或者是d,或者是点对{p,q} 其中p ∈ Sl,q ∈ Sr。
3
右链:p0, p1, p2, p3 再次扫描到最低点,左链 构造完毕
左链:p4
p2
p4
p1
p0
右链
19
比较:
Graham-Scan算法 每一步得到一个临时凸包
排序O(n log n) (合并或堆排) 扫描O(n) 总的是O(n log n)
Jarvis步进法算法 每一步求出凸包上的一条边
大纲
计算几何的基本工具 叉积
点积
线段方面的问题
计算几何的常见问题
凸包方面的问题 最远/近点对问题
总结
22
计算几何的常见问题
最远/近点对问题
1.求最远点对
先求凸包;再求凸包直径。 最远点对:<p2,p5>
p5
p4 p3
求凸包: O(nlogn), 求凸包直径: O(n), 求最远点对: O(nlogn)。
凸包方面的问题 最远/近点对问题
总结
14
计算几何的常见问题
凸包方面的问题
1.凸包的概念 ?
定义: 平面上给定的点集Q,它的凸包 p 是指一个最小凸多边形,满足Q 12 中的点或者在多边形边上或者 在其内。
引入:篱笆围树,求最小篱笆周长,就是求这些树的凸包!
p9 p11 p10 p8 p6 p3 p2 p5 p4
c Q1
Q2
1
T y a 序 列
b a 相 交
c c b a a b 不 相 相 交 交
a c b 不 相 交
a c b
O(nlogn)
判断它 的上下 相邻元 素是否 否 相交 处理 否 下一 删 是 个顶 除 交点 插入 点 顶点 序列
13
大纲
计算几何的基本工具 叉积
点积
线段方面的问题
计算几何的常见问题
p10
p11 p12 p9
p8
p7
p6
p5 p4
除p0外的按极角严格单调 递增的顶点组成点集Q。
p3
p2
p1 p0
若极角相同,选最远的。
16
点集Q: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
p0,p1,p2进栈
p10
p11
p12 p10 4 5 p3 2 p1 p0
ab×ad<0,即ad在ab的右边; ab×ac>0,即ac在ab的左边。 线段ab和线段cd相交 ac和ad分别在A所在直线 的左右两侧。 即点c、d分别在线段A 所在直线的两侧 8
即点c、d分别在线段A所在直 线的两侧,同时点a、b分别在B 所在直线的两侧,则可以确 定A与B相交.
特殊情况:
c(x3,y3) b(x2,y2)
12
能求交点个数的算法!
顶点序列: 1
2 3 Q1 4 Q2 5 4 6 5 4 6 5 6
for每个 顶点 右端点 交点 count++ 交换相交 线段位置, 判断是否 与其相邻 位置相交 是 否 处理下 一个顶 点
4 3 2 a b
左端点 5 6 插入T中 判断是否与 其相邻元素 相交 是 交点 c b 插入 b 顶点 序列
d
Distance(p,q)<=d 区域R中点间距离要大于等于d, 由数学原理知R中至多有6个点。 在分治法的合并步骤中最多只需要 检查6×n/2=3n个候选者 24
Q1
Sl
Q2
Sr
L XL为所有点x坐标的中值。
总结
叉积 计算几何的基本工具 向量积 数量积
点积
线段方面的问题
计算几何的常见问题 凸包方面的问题
O(0,0) p2(x2,y2)
左 右
p1(x1,y1)
2.判断两条线段是否相交? 方法:检查每条线段是否跨越了包含另一条线段的直线。
c(x3,y3) b(x2,y2)
B A
a(x1,y1) d(x4,y4)
ab× ×ac 与 ab × adac 的结果为异号 若ab ad 和 ab × 结果异号, cd× ×ca 与 cd × cb 的结果为异号 ab ad > 0, 即 ad 在ab的左边; ab×ac<0,即ac在ab的右边。
c(x3,y3)
d(x4,y4)
d(x4,y4) a(x1,y1) a(x1,y1) b(x2,y2)
(一 )
ad 〃 db >0
(二) ad 〃 db <0
此时ab ×ad=0,但只有(一)是相交的。
即知道某条线段端点在另一线段所在直线上时,需要判 断该点是否在另一线段上。
方法一:Xa<=Xd<=Xb and Ya <=Yd<=Yb;