forked from JuliaGeometry/Meshes.jl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hulls.jl
49 lines (45 loc) · 1.47 KB
/
hulls.jl
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
40
41
42
43
44
45
46
47
48
49
@testset "Hulls" begin
@testset "GrahamScan" begin
# basic test
pset = PointSet(rand(P2, 100))
chul = hull(pset, GrahamScan())
@test all(pset .∈ Ref(chul))
# duplicated points
pset = PointSet([rand(P2, 100); rand(P2, 100)])
chul = hull(pset, GrahamScan())
@test all(pset .∈ Ref(chul))
# corner cases
pset = PointSet(P2[(0,0)])
chul = hull(pset, GrahamScan())
@test chul == P2(0,0)
pset = PointSet(P2[(0,1),(1,0)])
chul = hull(pset, GrahamScan())
@test chul == Segment(P2(1,0), P2(0,1))
pset = PointSet(P2[(1,0),(0,0),(0,1)])
chul = hull(pset, GrahamScan())
@test vertices(boundary(chul)) == P2[(0,0),(1,0),(0,1)]
# original point set is already in hull
pset = PointSet(P2[(0,0),(1,0),(1,1),(0,1),(0.5,-1)])
chul = hull(pset, GrahamScan())
verts = vertices(boundary(chul))
@test verts == P2[(0.5,-1),(1,0),(1,1),(0,1),(0,0)]
# random points in interior do not affect result
p1 = P2[(0,0),(1,0),(1,1),(0,1),(0.5,-1)]
p2 = P2[0.5.*(rand(), rand()) .+ 0.5 for _ in 1:10]
pset = PointSet([p1; p2])
chul = hull(pset, GrahamScan())
verts = vertices(boundary(chul))
@test verts == P2[(0.5,-1),(1,0),(1,1),(0,1),(0,0)]
end
@testset "GrahamScan_simple" begin
p = randn(2, 25)
#p .+= [2.0, 0.5]
_, n = size(p)
h = zeros(Int32, n)
v = zeros(Float64, n)
s = similar(h)
u = hull_simple(p, h, s, v)
#s = s[1:u]
@test zeroInside(p, s, u)
end
end