Intersection over union calculation

Hi,

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