Simon Danisch / Mar 22 2019
Makie + Tetgen
8.7s
TetGen (Julia)Makie Static
using Makie, TetGen, GeometryBasics using GeometryBasics: coordinates, faces import GeometryTypes function to_triangle(triangles, tetra) push!(triangles, GeometryTypes.GLTriangle(tetra[1], tetra[2], tetra[3])) push!(triangles, GeometryTypes.GLTriangle(tetra[2], tetra[3], tetra[4])) push!(triangles, GeometryTypes.GLTriangle(tetra[2], tetra[3], tetra[4])) push!(triangles, GeometryTypes.GLTriangle(tetra[3], tetra[1], tetra[4])) end function to_lines(lines, tetra) push!(lines, tetra[1], tetra[2]) push!(lines, tetra[2], tetra[3]) push!(lines, tetra[3], tetra[4]) push!(lines, tetra[2], tetra[4]) push!(lines, tetra[1], tetra[4]) end using AbstractPlotting function AbstractPlotting.convert_arguments(T::Type{<: AbstractPlotting.Lines}, mesh::AbstractVector{<: GeometryBasics.Tetrahedron}) points = GeometryTypes.Point3f0[] for elem in mesh to_lines(points, elem) end return (points,) end function AbstractPlotting.convert_arguments(::Type{<: AbstractPlotting.Mesh}, mesh::GeometryBasics.Mesh{T, N, <: GeometryBasics.Tetrahedron}) where {T, N} points = GeometryTypes.Point3f0.(coordinates(mesh)) triangles = GeometryTypes.GLTriangle[] for elem in faces(mesh) to_triangle(triangles, elem) end return (GeometryTypes.GLNormalMesh(points, triangles),) end function AbstractPlotting.convert_arguments(T::Type{<: AbstractPlotting.Wireframe}, mesh::GeometryBasics.Mesh) m = convert_arguments(AbstractPlotting.Mesh, mesh)[1] return convert_arguments(T, m) end function AbstractPlotting.convert_arguments(p::AbstractPlotting.PointBased, mesh::GeometryBasics.Mesh) return convert_arguments(p, GeometryTypes.Point.(coordinates(mesh))) end function AbstractPlotting.convert_arguments(::Type{<: AbstractPlotting.Mesh}, mesh::GeometryBasics.Mesh) (GeometryTypes.GLNormalMesh( GeometryTypes.Point3f0.(coordinates(mesh)), GeometryTypes.GLTriangle.(faces(mesh)) ),) end
mesh = TetGen.voronoi(rand(GeometryBasics.Point{3, Float64}, 100)) tetra = TetGen.tetrahedralize(mesh); Makie.mesh(mesh, color = (:blue, 0.4), transparency = true) lines!(tetra, color = (:white, 0.4), transparency = true)
using WebSockets, WebIO using Interact
using GeometryBasics: coordinates, faces, QuadFace using TetGen: TetgenIO # Construct a cube out of Quads points = Point{3, Float64}[ (0.0, 0.0, 0.0), (2.0, 0.0, 0.0), (2.0, 2.0, 0.0), (0.0, 2.0, 0.0), (0.0, 0.0, 12.0), (2.0, 0.0, 12.0), (2.0, 2.0, 12.0), (0.0, 2.0, 12.0) ] facets = QuadFace{Cint}[ 1:4, 5:8, [1,5,6,2], [2,6,7,3], [3, 7, 8, 4], [4, 8, 5, 1] ] markers = Cint[-1, -2, 0, 0, 0, 0] # attach some additional information to our faces! mtrs = first.(points) #io = TetgenIO(points, facets = facets, pointmtrs = mtrs)
8-element Array{Float64,1}:
0.0
2.0
2.0
0.0
0.0
2.0
2.0
0.0