I am trying to calculate the intersection over union for two oriented rectangles, like this picture;

I know there are lots of algorithms for this so I am curious if anyone has seen an implementation. Rectangles are stored as either four corners in counterclockwise order or {{center x, center y}, area, aspect, orientation} tuples.

Otherwise, any thoughts on how to accomplish this in elixir? I will be computing IoU for all pairwise combinations of two sets of ~100 rectangles for a soft-realtime application.

So something like:

defmodule Boxes do
defstruct center: {0,0}, area: 0, aspect: 1.0, orientation: 0
@type t :: %__MODULE__{center: {number(), number()}, area: number(), aspect: number(), orientation: number()}
@doc """
Computes the intersection over union score for two oriented rectangles.
"""
def iou(box1, box2) do
end
def iou_batch(boxes1, boxes2) do
Enum.map(boxes1, fn box1 -> Enum.map(boxes2, fn box2 -> iou(box1, box2) end) end)
end
@spec corners(__MODULE__.t()) :: list(number())
@doc """
Computes the corners of the box given a state vector
"""
def corners(box) do
[
... # you can assume this function works
]
end
end