没有合适的资源?快使用搜索试试~ 我知道了~
二维几何常用算法合集 繁凡的《计算几何全家桶(二)》1
需积分: 0 1 下载量 93 浏览量
2022-08-03
21:13:13
上传
评论
收藏 1.58MB PDF 举报
温馨提示
试读
15页
1.平面扫描2 2.凸包3 3.旋转卡壳5 4.半平面交7 5.闵可夫斯基和 10 6.平面区域10 7.平面最近点对 12 1.平面扫描 2.凸包
资源详情
资源评论
资源推荐
目录
1.平面扫描........................................................................................................................2
2.凸包...............................................................................................................................3
Andrew算法...............................................................................................................................3
直线两点式转为一般式使用公式O(1)计算点到直线距离 ............................................................4
判断点是否在凸包内 ..................................................................................................................5
3.旋转卡壳........................................................................................................................5
4.半平面交........................................................................................................................7
有向直线....................................................................................................................................7
O(nlogn)的半平面交 ..................................................................................................................7
二分 + 半平面交.........................................................................................................................8
5.闵可夫斯基和 ..............................................................................................................10
6.平面区域......................................................................................................................10
7.平面最近点对 ..............................................................................................................12
繁凡的《计算几何全家桶(二)》https://fanfansann.blog.csdn.net/
————————————————————————————————————————————————————————————————————————————
1
1.平面扫描
平面扫描是用来降低算法的复杂度的方法,通过扫描线在平面上按照给定的轨迹移动的同时,不断根据扫描线扫过的部分更
新信息,从而得到整体所要求的结果,既可以从左向右平移与y轴平行的直线,也可以固定射线的端点逆时针转动。
平面上有N NN个两两没有公共点的圆,i ii号圆的圆心在 ,半径为 。求所有最外层的,即不包含与其他圆内部的
圆。
利用垂直于x轴的线去从左往右扫描,观察点为圆的左右端点。因为圆是没有公共点的,这使得包含的判断变得简单。如
果某个圆被包含那么一定是被最近的两个外圈的其中一个圆包含(y轴上),假设这个圆已经被包含,如果远的圆如果想
包含这个圆必须把两个圆都包住,那么第一层包裹已经不再是外层。所以如果存在被包括在某个外层里,一定是被包裹在
最近的两个外层的其中一个。
typedef
long
long
ll
;
typedef
p
a
ir
<
dou
b
le
,
int
>
PDL
;
c
onst
int
N
=
50007
,
M
=
5000007
,
INF
=
0
x
3
f
3
f
3
f
3
f
;
set
<
PDL
>
out
;
ve
c
tor
<
int
>
a
ns
;
int
n
,
m
;
int
c
nt
,
num
;
PDL
p
[
N
*
2
];
dou
b
le
x
[
N
],
y
[
N
],
r
[
N
];
b
ool
inside
(
int
i
,
int
j
)
{
dou
b
le
dx
=
x
[
i
] -
x
[
j
];
dou
b
le
dy
=
y
[
i
] -
y
[
j
];
return
dx
*
dx
+
dy
*
dy
r
[
j
] *
r
[
j
];
}
int
m
a
in
()
{
s
ca
nf
("
%
d
",
&
n
);
for
(
int
i
=
1
;
i
n
;
i
){
s
ca
nf
("
%
lf
%
lf
%
lf
",
&
r
[
i
],
&
x
[
i
],
&
y
[
i
]);
p
[
num
].
first
=
x
[
i
] -
r
[
i
];
左端点
p
[
num
].
se
c
ond
=
i
;
p
[
num
].
first
=
x
[
i
]
+
r
[
i
];
右端点
p
[
num
].
se
c
ond
=
i
+
n
;
}
sort
(
p
+
1
,
p
+
1
+
num
);
for
(
int
i
=
1
;
i
num
;
i
){
int
id
=
p
[
i
].
se
c
ond
;
if
(
id
n
){
左端点
set
<
PDL
>
iter
a
tor
it
=
out
.
lower
_
b
ound
(
m
a
ke
_
p
a
ir
(
y
[
id
],
id
));
if
(
it
out
.
end
()
inside
(
id
,
it
se
c
ond
))
c
ontinue
;
被包含,不是答案,跳过
if
(
it
out
.
b
egin
()
inside
(
id
, (
it
)
se
c
ond
))
c
ontinue
;
a
ns
.
push
_
bac
k
(
id
);
out
.
insert
(
m
a
ke
_
p
a
ir
(
y
[
id
],
id
));
外圈
}
else
{
到了这个圆的右端点该删除了,已经没用了,留着会影响答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
繁凡的《计算几何全家桶(二)》https://fanfansann.blog.csdn.net/
————————————————————————————————————————————————————————————————————————————
2
2.凸包
过多边形的任意一边做一条直线,如果其他各个顶点都在这条直线的同侧,则把这个多边形叫做凸多边形。
凸包求解算法的基础便是凸多边形的定义与性质。
假设平面上n个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我
们就叫它“凸包”。
假设每种颜料都拥有(R,G,B)三种属性,表示该种颜料红色,绿色,与蓝色的化学成分所占的比重
给你若干种已有的不限量的颜料,问是否能够勾兑出目标颜料(R0,G0,B0)
将每一种颜料映射为二维欧氏空间中的一个点,我们可以将已经给定的颜料与目的颜料在空间中标定出来
经过观察与思考,我们可以发现,一个颜料能够被勾兑出来当且仅当该颜料对应的点,位于以给定颜料所构成的凸包之中
Andrew算法
判断这样连是否为凸多边形的一部分:
如果p2-p3的斜率小于p1-p3,那么我们就没必要选择p2这个点,而是直接走p1~p3即可,也就是说我们把已经放进去的
p2踢掉
id
-
=
n
;
out
.
er
a
se
(
m
a
ke
_
p
a
ir
(
y
[
id
],
id
));
}
}
printf
("
%
d
\
n
",
a
ns
.
size
());
sort
(
a
ns
.
b
egin
(),
a
ns
.
end
());
for
(
int
i
=
0
;
i
<
a
ns
.
size
();
i
)
printf
("
%
d
",
a
ns
[
i
]);
return
0
;
}
40
41
42
43
44
45
46
47
48
49
50
计算凸包,输入点数组
p
,个数为
p
输出点数组
c
h
,函数返回凸包顶点个数。
输入不能有重复的点,函数执行完后的输入点的顺序将被破坏(因为要排序,可以加一个数组存原来的
id
)
如果不希望在凸包边上有输入点,把两个
改成
<
即可
int
C
onvex
H
ull
(
P
oint
*
p
,
int
n
,
P
oint
*
c
h
)
{
sort
(
p
,
p
+
n
);
int
m
=
0
;
for
(
int
i
=
0
;
i
<
n
;
i
){
下凸包
如果叉积
0
说明新边斜率小说明已经不是凸包边了,赶紧踢走
while
(
m
>
1
C
ross
(
c
h
[
m
-
1
] -
c
h
[
m
-
2
],
p
[
i
] -
c
h
[
m
-
2
])
0
)
m
;
c
h
[
m
]
=
p
[
i
];
}
int
k
=
m
;
for
(
int
i
=
n
-
2
;
i
0
;
i
){
上凸包
while
(
m
>
k
C
ross
(
c
h
[
m
-
1
] -
c
h
[
m
-
2
],
p
[
i
] -
c
h
[
m
-
2
])
0
)
m
;
c
h
[
m
]
=
p
[
i
];
}
if
(
n
>
1
)
m
;
return
m
;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
繁凡的《计算几何全家桶(二)》https://fanfansann.blog.csdn.net/
————————————————————————————————————————————————————————————————————————————
3
剩余14页未读,继续阅读
虚伪的小白
- 粉丝: 22
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0