Refinement

TriRefinement

Meshes.TriRefinementType
TriRefinement([pred])

Refinement of polygonal meshes into triangles. A n-gon for which the predicate pred holds true is subdivided into n triangles. The method refines all n-gons if the pred is ommited.

source
grid = CartesianGrid(10, 10)

# refine three times
ref1 = refine(grid, TriRefinement())
ref2 = refine(ref1, TriRefinement())
ref3 = refine(ref2, TriRefinement())

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

QuadRefinement

Meshes.QuadRefinementType
QuadRefinement()

Refinement of polygonal meshes into quadrangles. A n-gon is subdivided into n quadrangles.

source
grid = CartesianGrid(10, 10)

# refine three times
ref1 = refine(grid, QuadRefinement())
ref2 = refine(ref1, QuadRefinement())
ref3 = refine(ref2, QuadRefinement())

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

EdgeRefinement

Meshes.EdgeRefinementType
EdgeRefinement([pred])

Refine polygonal mesh by splitting the edges for which the predicate pred holds true. n-gons with split edges are subdivided into triangles, and all other n-gons are preserved. Midpoints of split edges are connected to a new point inside the n-gon when n > 3. The default predicate splits all edges in the mesh.

Examples

EdgeRefinement(e -> length(e) > 500u"km")
source
grid = CartesianGrid(10, 10)

# refine the left half three times
pred(e) = first(to(centroid(e))) < 5.0u"m"

ref1 = refine(grid, EdgeRefinement(pred))
ref2 = refine(ref1, EdgeRefinement(pred))
ref3 = refine(ref2, EdgeRefinement(pred))

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

TriSubdivision

grid = CartesianGrid(10, 10)

# refine three times
ref1 = refine(grid, TriSubdivision())
ref2 = refine(ref1, TriSubdivision())
ref3 = refine(ref2, TriSubdivision())

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

Catmull-Clark

Meshes.CatmullClarkRefinementType
CatmullClarkRefinement()

Catmull-Clark refinement of polygonal meshes.

Strictly speaking, the Catmull-Clark algorithm is used for subdivision surface modeling, not just mesh refinement. At each step of refinement, the vertices are adjusted to approximate a smooth surface.

References

  • Catmull & Clark. 1978. [Recursively generated B-spline surfaces on arbitrary topological meshes] (https://www.sciencedirect.com/science/article/abs/pii/0010448578901100)
source
# define a cube in R^3
points = [(0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1),(1,0,1),(1,1,1),(0,1,1)]
connec = connect.([(1,4,3,2),(5,6,7,8),(1,2,6,5),(3,4,8,7),(1,5,8,4),(2,3,7,6)])
mesh   = SimpleMesh(points, connec)

# refine three times
ref1 = refine(mesh, CatmullClarkRefinement())
ref2 = refine(ref1, CatmullClarkRefinement())
ref3 = refine(ref2, CatmullClarkRefinement())

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], mesh, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

RegularRefinement

Meshes.RegularRefinementType
RegularRefinement(f₁, f₂, ..., fₙ)

Refine each dimension of the grid by given factors f₁, f₂, ..., fₙ.

Examples

refine(grid2D, RegularRefinement(2, 3))
refine(grid3D, RegularRefinement(2, 3, 1))
source
grid = CartesianGrid(10, 10)

# refine three times
ref1 = refine(grid, RegularRefinement(2, 2))
ref2 = refine(ref1, RegularRefinement(3, 2))
ref3 = refine(ref2, RegularRefinement(2, 3))

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output

MaxLengthRefinement

Meshes.MaxLengthRefinementType
MaxLengthRefinement(length)

Refine mesh into elements with all boundary segments smaller than or equal to a maximum length in length units (default to meters).

source
grid = CartesianGrid(10, 10)

# refine three times
ref1 = refine(grid, MaxLengthRefinement(0.5))
ref2 = refine(ref1, MaxLengthRefinement(0.25))
ref3 = refine(ref2, MaxLengthRefinement(0.1))

fig = Mke.Figure(size = (800, 800))
viz(fig[1,1], grid, showsegments = true)
viz(fig[1,2], ref1, showsegments = true)
viz(fig[2,1], ref2, showsegments = true)
viz(fig[2,2], ref3, showsegments = true)
fig
Example block output