Skip to content

Commit

Permalink
use new meta api
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonDanisch committed Mar 13, 2019
1 parent 746a63b commit 04e5dd7
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 108 deletions.
2 changes: 1 addition & 1 deletion src/TetGen.jl
Expand Up @@ -5,7 +5,7 @@ using GeometryBasics
using GeometryBasics: Polygon, MultiPolygon, Point, LineFace, Polytope, Line,
Simplex, connect, Triangle, NSimplex, Tetrahedron,
TupleView, TriangleFace, SimplexFace, LineString, Mesh, TetrahedronP, TriangleP,
NgonFace, Ngon, faces, coordinates
NgonFace, Ngon, faces, coordinates, metafree, meta, faces, getcolumn, hascolumn

using StaticArrays

Expand Down
19 changes: 17 additions & 2 deletions src/api.jl
@@ -1,8 +1,23 @@
function voronoi(points::Vector{Point{3, T}}) where T <: AbstractFloat
result = tetrahedralize(JLTetgenIO(points), "Qw")
Mesh(result.points, result.trifaces)
result = tetrahedralize(TetgenIO(points), "Qw")
Mesh{Triangle}(result)
end

function TetGen.tetrahedralize(
mesh::Mesh{3, Float64, <: TetGen.Ngon}, command = "Qp";
marker = :markers
)
f = faces(mesh)
kw_args = Any[:facets => metafree(f)]
if hascolumn(f, marker)
push!(kw_args, :facetmarkers => getcolumn(f, marker))
end
tio = TetgenIO(coordinates(mesh); kw_args...)
result = tetrahedralize(tio, command)
return Mesh{Tetrahedron}(result)
end


function TetGen.tetrahedralize(mesh::Mesh{3, Float64, <: TetGen.Triangle}, command = "Qp")
tio = TetgenIO(coordinates(mesh); facets = faces(mesh))
result = tetrahedralize(tio, command)
Expand Down
124 changes: 19 additions & 105 deletions test/runtests.jl
@@ -1,16 +1,19 @@
using TetGen
using TetGen: JLPolygon, TetgenIO, JLFacet, Point
using GeometryBasics
using GeometryBasics: Mesh, Triangle, Tetrahedron, TriangleFace, QuadFace
using GeometryBasics: Mesh, Triangle, Tetrahedron, TriangleFace, QuadFace,
PointMeta, NgonFaceMeta, meta, faces, metafree
using StructArrays
using Test

# 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)
]

# Facet 1. The leftmost JLFacet.
facets = QuadFace{Cint}[
1:4,
5:8,
Expand All @@ -20,117 +23,28 @@ facets = QuadFace{Cint}[
[4, 8, 5, 1]
]

facetmarkerlist = Cint[-1, -2, 0, 0, 0, 0]
tio = TetgenIO(
points,
facets = facets,
facetmarkers = facetmarkerlist,
)

result = tetrahedralize(tio, "vpq1.414a0.1")
# Extract surface triangle mesh:
# Extract volume Tetrahedron mesh:
tetra = Mesh{Tetrahedron}(result)
tio = TetgenIO(
tetra.simplices.points,
tetrahedrons = tetra.simplices.faces
)
result = tetrahedralize(tio, "p")
tmesh = Mesh{Triangle}(result)
using Makie, GeometryTypes

gmesh = GLNormalMesh(Point3f0.(tmesh.simplices.points), GLTriangle.(tmesh.simplices.faces))
mesh(gmesh)


markers = Cint[-1, -2, 0, 0, 0, 0]
# attach some additional information to our faces!
mesh = Mesh(points, meta(facets, markers = markers))
result = tetrahedralize(mesh)
@test result isa Mesh

points = rand(Point{3, Float64}, 100)

result = tetrahedralize(TetgenIO(points), "w")
GC.gc()
result = tetrahedralize(TetgenIO(points), "w")
GC.gc()
Mesh{Triangle}(result)



using GeometryTypes, FileIO, GLMakie
using TetGen
using TetGen: JLPolygon, TetgenIO, JLFacet, Point, CPolygon, CPPTetgenIO
using GeometryBasics: Mesh, Triangle, Tetrahedron, TriangleFace

bmesh = load(GLMakie.GLVisualize.assetpath("cat.obj"), PlainMesh{Float64, Face{3, Cint}})
facetlist = map(faces(bmesh)) do face
JLFacet([Cint.(face)...])
end

tio = TetgenIO(
TetGen.Point{3, Float64}.(vertices(bmesh)),
facets = facetlist,
facetmarkers = fill(Cint(0), length(facetlist))
)

result = tetrahedralize(tio, "d")
x = Mesh{Triangle}(result)
Mesh{Tetrahedron}(result)
using Makie

GLNormalMesh(Point3f0.(x.simplices.points))
result = tetrahedralize(tio, "pq1.414a0.1")

points = rand(Point{3, Float64}, 100)

result = TetGen.voronoi(points)

using GeometryTypes
@test result isa Mesh

s = Sphere{Float64}(Point(0.0, 0.0, 0.0), 2.0)

x = PlainMesh{Float64, Triangle{Cint}}(s)

function Mesh{T, Dim, FaceType}(a::AbstractGeometry; resolution = nothing)
P = Point{T, Dim}
Mesh(
coordinates(a, P; resolution = resolution),
faces(a, FaceType; resolution = resolution)
)
end

s = Sphere{Float64}(Point(0.0, 0.0, 0.0), 1.0)

y = PlainMesh{Float64, Triangle{Cint}}(s)


meshy = merge(x, y)

using Statistics
retype(::Type{T}, x) where T = collect(reinterpret(T, x))
attr = [fill(Cint(0), length(vertices(x))); fill(Cint(0), length(vertices(y)));]
p = mean(vertices(meshy))

tio = TetgenIO(
retype(TetGen.Point{3, Float64}, vertices(meshy)),
trifaces = retype(TetGen.TriangleFace{Cint}, faces(meshy)),
# pointmarkers = attr,
# regions = [TetGen.Region(TetGen.Point(p...), -2.0, 0.01)]
)

result = tetrahedralize(tio, "pq")


using Makie

mesh(meshy)


using TetGen
using TetGen: JLPolygon, TetgenIO, JLFacet, Point, CPPTetgenIO
using GeometryBasics: Mesh, Triangle, Tetrahedron, TriangleFace
using GeometryBasics
import GeometryTypes
s = GeometryTypes.Sphere{Float64}(Point(0.0, 0.0, 0.0), 2.0)

x = GeometryTypes.PlainMesh{Float64, GeometryTypes.Face{3, Cint}}(s)

points = Point{3, Float64}.(GeometryTypes.vertices(x))
f = TriangleFace{Cint}.(GeometryTypes.faces(x))
m = Mesh(points, f)

tio = TetgenIO(GeometryBasics.coordinates(m); facets = GeometryBasics.faces(m))

tetrahedralize(tio, "Qp")


TetGen.tetrahedralize(m)

0 comments on commit 04e5dd7

Please sign in to comment.