Skip to content

Commit 49bfb82

Browse files
authored
Add MaxLengthDiscretization for Geometry (#1075)
* Add 'MaxLengthDiscretization' for 'Polygon' * Use 'TriSubdivision' * Apply suggestions * Add tests * Update method * Update method * Add more tests * Apply suggestions
1 parent 80e7519 commit 49bfb82

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/discretization/maxlength.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,23 @@ end
2727
discretize(chain::Chain, method::MaxLengthDiscretization) =
2828
mapreduce(s -> discretize(s, method), merge, segments(chain))
2929

30+
discretize(multi::Multi, method::MaxLengthDiscretization) = _iterativerefinement(multi, method)
31+
32+
discretize(geometry::Geometry, method::MaxLengthDiscretization) = _iterativerefinement(geometry, method)
33+
3034
# -----------------
3135
# HELPER FUNCTIONS
3236
# -----------------
3337

38+
function _iterativerefinement(geometry, method)
39+
iscoarse(e) = perimeter(e) > method.length * nvertices(e)
40+
mesh = simplexify(geometry)
41+
while any(iscoarse, mesh)
42+
mesh = refine(mesh, TriSubdivision())
43+
end
44+
mesh
45+
end
46+
3447
_sides(box::Box{<:𝔼}) = sides(box)
3548

3649
function _sides(box::Box{<:🌐})

test/discretization.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,29 @@ end
467467
@test nelements(mesh) == 404
468468
@test eltype(mesh) <: Segment
469469
@test nvertices.(mesh) [2]
470+
471+
tri = Triangle(cart(0, 0), cart(10, 0), cart(0, 10))
472+
mesh = discretize(tri, MaxLengthDiscretization(T(3)))
473+
@test nvertices(mesh) == 15
474+
@test nelements(mesh) == 16
475+
@test eltype(mesh) <: Triangle
476+
@test nvertices.(mesh) [3]
477+
478+
quad = Quadrangle(latlon(0, 0), latlon(0, 45), latlon(45, 45), latlon(45, 0))
479+
mesh = discretize(quad, MaxLengthDiscretization(T(1e6)))
480+
@test nvertices(mesh) == 81
481+
@test nelements(mesh) == 128
482+
@test eltype(mesh) <: Triangle
483+
@test nvertices.(mesh) [3]
484+
485+
quad1 = Quadrangle(latlon(0, 0), latlon(0, 45), latlon(45, 45), latlon(45, 0))
486+
quad2 = Quadrangle(latlon(0, 0), latlon(-45, 0), latlon(-45, 45), latlon(0, 45))
487+
multi = Multi([quad1, quad2])
488+
mesh = discretize(multi, MaxLengthDiscretization(T(1e6)))
489+
@test nvertices(mesh) == 162
490+
@test nelements(mesh) == 256
491+
@test eltype(mesh) <: Triangle
492+
@test nvertices.(mesh) [3]
470493
end
471494

472495
@testitem "Discretize" setup = [Setup] begin

0 commit comments

Comments
 (0)