Examples
We'll use a few of the functions used for testing the package to demonstrate its usage. These are
simplices_sharing_vertices. Generate a set of simplices which intersect in some arbitrary way, but sharing at least one vertex.nontrivially_intersecting_simplices. Generate a set of non-trivially intersecting simplices (i.e. intersections are not only along boundaries or vertices).childsimplex(parentsimplex). Generate a simplex completely contained withinparentsimplex.
Note that these functions take as inputs simplices of shape (dim + 1, dim). This will be fixed in a future release.
In the examples, some of the functions used to generate simplices return the simplex arrays with rows as columns. Therefore, we transpose the simplices before calling simplexintersection.
Simplices sharing vertices
Let's compute the intersection between a set of simplices that share at least one vertex.
julia> using Simplices
julia> s₁, s₂ = transpose.(simplices_sharing_vertices(3))
([0.0358361 0.778702 0.646206 0.202595; 0.96785 0.710035 0.247526 0.253073; 0.895915 0.933644 0.541463 0.501429], [0.778702 0.0358361 0.778702 0.528614; 0.710035 0.96785 0.710035 1.4648; 0.933644 0.895915 0.933644 1.59998])
julia> simplexintersection(s₁, s₂)
0Nontrivially intersecting simplices
Simplices can also intersect in nontrivial ways, meaning that they have an intersection beyond a common boundary or vertex.
julia> using Simplices
julia> s₁, s₂ = transpose.(nontrivially_intersecting_simplices(3))
([0.687484 0.44752 0.574625 0.964968; 0.125207 0.0252662 0.645323 0.145588; 0.264476 0.487514 0.0796168 0.234394], [0.694489 1.40604 1.41439 1.34623; 0.282156 0.494101 0.269286 0.228796; 0.240769 0.450822 0.557408 0.606451])
julia> simplexintersection(s₁, s₂)
3.996549424093742e-8One simplex fully contained within the other
We'll generate a random simplex s₁, then generate a simplex s₂ fully contained within that simplex. If s₂ is fully contained, the intersection volume should be the volume of s₂.
julia> using Simplices
julia> Ds =  2:10;
julia> intersection_vols = zeros(Float64, length(Ds));
julia> analytical_vols   = zeros(Float64, length(Ds));
julia> for i = 1:length(Ds)
           s₁ = rand(Ds[i] + 1, Ds[i])
           s₂ = childsimplex(s₁)
           intersection_vols[i] = simplexintersection(s₁.', s₂.')
           analytical_vols[i] = volume(s₂)
       end
julia> hcat(intersection_vols, analytical_vols)
9×2 Array{Float64,2}:
 0.00641567   0.00641567
 0.000243363  0.000243363
 2.3474e-5    2.3474e-5
 2.02239e-5   2.02239e-5
 5.00277e-9   5.00277e-9
 1.86901e-10  1.86901e-10
 1.06558e-9   1.06558e-9
 0.0          6.7276e-11
 0.0          1.85662e-13
julia> # Within numerical error, the results should be the same.
       
       all([isapprox(intersection_vols[i], analytical_vols[i];
           atol = 1e-9) for i = 1:length(Ds)])
trueSimplices are identical
If simplices are identical, the intersection volume should equal the volume of either simplex:
julia> using Simplices
julia> s₁ = rand(4, 3); s₂ = s₁;
julia> simplexintersection(s₁.', s₂.') .≈ volume(s₁) .≈ volume(s₂)
true