I am trying to use Julia for visualising instances of the moving sofa problem. I would like to be able to calculate the intersection between non-convex shapes and to also calculate the area of the resulting shapes. However, most of the packages I’ve tried so far (e.g., GeometryBasics.jl, Meshes.jl, Polyhedra.jl) seem to support convex shapes only — either that or I am failing to make proper use of them.
The most promising package so far has been PolygonArea.jl. It seems to handle intersections well, but the computed area turns into
NaN after a few cuts.
Here is a minimum “working” example:
using Plots using PolygonArea function plot_cuts(rads_start, rads_stop, num_cuts) plot(aspect_ratio=:equal) # Define the initial (large) sofa sofa = rectangle((-10.0, -10.0), (10.0, 10.0)) # Define the corridor (which we'll use as a stencil) corridor = rectangle((-5.0, 0.0), (1.0, 1.0)) ∪ rectangle((0.0, -5.0), (1.0, 1.0)) # Define the range of rotations to perform rads_range = range(rads_start, rads_stop, length=num_cuts) # Apply cuts at each angle for (i, angle) in enumerate(rads_range) # Rotate the corridor by the specified angle rotated_corridor = PolygonArea.rotate(corridor, angle) # Plot the rotated corridor plot!(rotated_corridor, color=:lightgrey) # Perform a single cut by intersecting # the sofa with the rotated corridor sofa = sofa ∩ rotated_corridor # FLAKY! Print the area of the resulting shape # println("Area after $i cuts: $(area(sofa))") end # Plot the final shape of the sofa (after the cuts) plot!(sofa, color=:blue) end
plot_cuts(0, π/2, 30) produces this:
plot_cuts(0, π/6, 10) produces this:
These actually look good! But when I uncomment the line for printing the area of the sofa, some
NaN start to appear:
julia> plot_cuts(0, π/2, 4) Area after 1 cuts: 11.0 Area after 2 cuts: 2.8546748471377024 Area after 3 cuts: 0.5566243270259363 Area after 4 cuts: NaN julia> plot_cuts(0, π/3, 4) Area after 1 cuts: 11.0 Area after 2 cuts: 3.8145239870160523 Area after 3 cuts: NaN Area after 4 cuts: NaN julia> plot_cuts(0, π/4, 4) Area after 1 cuts: 11.0 Area after 2 cuts: NaN Area after 3 cuts: 2.836512241476747 Area after 4 cuts: NaN
And, for example, if I call
plot_cuts(0, π/2, 5), the code just seems to hang at the call to
What is the recommended package for calculating the intersection of non-convex shapes and their resulting area/volume? Thanks in advance!