# Intersection and area of non-convex polygons

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

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

# Apply cuts at each angle
# 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
``````

Calling `plot_cuts(0, π/2, 30)` produces this:

Calling `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 `area`.

What is the recommended package for calculating the intersection of non-convex shapes and their resulting area/volume? Thanks in advance!

It would be great to get Clipper updated - Clipper1 is already available, but Clipper2 is still on someone’s to-do list…