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