33# ------------------------------------------------------------------
44
55"""
6- TriRefinement()
6+ TriRefinement([pred] )
77
88Refinement of polygonal meshes into triangles.
9- A n-gon is subdivided into n triangles.
9+ A n-gon for which the predicate `pred` holds true
10+ is subdivided into n triangles. The method refines all
11+ n-gons if the `pred` is ommited.
1012"""
11- struct TriRefinement <: RefinementMethod end
13+ struct TriRefinement{F} <: RefinementMethod
14+ pred:: F
15+ end
16+
17+ TriRefinement () = TriRefinement (nothing )
1218
13- function refine (mesh, :: TriRefinement )
19+ function refine (mesh, method :: TriRefinement )
1420 assertion (paramdim (mesh) == 2 , " TriRefinement only defined for surface meshes" )
1521 (eltype (mesh) <: Triangle ) || return simplexify (mesh)
1622
@@ -21,9 +27,19 @@ function refine(mesh, ::TriRefinement)
2127 # convert to half-edge structure
2228 t = convert (HalfEdgeTopology, connec)
2329
30+ # indices to refine
31+ rinds = if isnothing (method. pred)
32+ 1 : nelements (t)
33+ else
34+ filter (i -> method. pred (mesh[i]), 1 : nelements (t))
35+ end
36+
37+ # indices to preserve
38+ pinds = setdiff (1 : nelements (t), rinds)
39+
2440 # add centroids of elements
2541 ∂₂₀ = Boundary {2,0} (t)
26- epts = map (1 : nelements (t) ) do elem
42+ rpts = map (rinds ) do elem
2743 is = ∂₂₀ (elem)
2844 cₒ = sum (i -> to (points[i]), is) / length (is)
2945 withcrs (mesh, cₒ)
@@ -33,23 +49,31 @@ function refine(mesh, ::TriRefinement)
3349 vpts = points
3450
3551 # new points in refined mesh
36- newpoints = [vpts; epts ]
52+ newpoints = [vpts; rpts ]
3753
54+ # new connectivities in refined mesh
55+ newconnec = Connectivity{Triangle,3 }[]
56+
57+ # offset to new vertex indices
3858 offset = length (vpts)
3959
40- # connect vertices into new triangles
41- newconnec = Connectivity{Triangle,3 }[]
42- for elem in 1 : nelements (t)
60+ # connectivities of new triangles
61+ for (i, elem) in enumerate (rinds)
4362 verts = ∂₂₀ (elem)
4463 nv = length (verts)
45- for i in 1 : nv
46- u = elem + offset
47- v = verts[mod1 (i , nv)]
48- w = verts[mod1 (i + 1 , nv)]
64+ for j in 1 : nv
65+ u = i + offset
66+ v = verts[mod1 (j , nv)]
67+ w = verts[mod1 (j + 1 , nv)]
4968 tri = connect ((u, v, w))
5069 push! (newconnec, tri)
5170 end
5271 end
5372
73+ # connectivities of preserved elements
74+ for elem in pinds
75+ push! (newconnec, element (t, elem))
76+ end
77+
5478 SimpleMesh (newpoints, newconnec)
5579end
0 commit comments