Skip to content
50 changes: 41 additions & 9 deletions src/boundingboxes.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
function Rect(geometry::AbstractArray{<:Point{N,T}}) where {N,T}
return Rect{N,T}(geometry)
end

# the basic method
"""
Construct a HyperRectangle enclosing all points.
"""
Expand All @@ -23,6 +20,30 @@ function Rect{N1,T1}(geometry::AbstractArray{PT}) where {N1,T1,PT<:AbstractPoint
end
end

function Rect(geometry::AbstractArray{<:Point{N,T}}) where {N, T}
return Rect{N,T}(geometry)
end

function Rect{T1}(geometry::AbstractArray{<:Point{N,T2}}) where {N, T1, T2}
return Rect{N,T1}(geometry)
end

Rect(a::AbstractGeometry{N, T}) where {N, T} = Rect{N, T}(a)
Rect{T1}(a::AbstractGeometry{N, T2}) where {N, T1, T2} = Rect{N, T1}(a)
function Rect{N1, T1}(a::AbstractGeometry{N2, T2}) where {N1, T1, N2, T2}
return Rect{N1, T1}(coordinates(a))
end

Rect(a::AbstractArray{<: AbstractGeometry{N, T}}) where {N, T} = Rect{N, T}(a)
Rect{T1}(a::AbstractArray{<: AbstractGeometry{N, T2}}) where {N, T1, T2} = Rect{N, T1}(a)
function Rect{N1, T1}(a::AbstractArray{<: AbstractGeometry{N2, T2}}) where {N1, T1, N2, T2}
return reduce(union, Rect{N1, T1}.(a))
end

# generic fallbacks and entry point
Rect{T}(a) where {T} = Rect{T}(coordinates(a))
Rect{N,T}(a) where {N,T} = Rect{N,T}(coordinates(a))

function Rect(primitive::GeometryPrimitive{N,T}) where {N,T}
return Rect{N,T}(primitive)
end
Expand All @@ -31,16 +52,27 @@ function Rect{T}(primitive::GeometryPrimitive{N,T}) where {N,T}
return Rect{N,T}(primitive)
end

function Rect{T}(a::Pyramid) where {T}
# function Rect{N1, T1}(primitives::AbstractArray{<: GeometryPrimitive{N2, T2}})
# end

# specialized overloads for geometries with a known bbox

function Rect{3, T}(a::Pyramid) where {T}
w, h = a.width / T(2), a.length
m = Vec{3,T}(a.middle)
return Rect{T}(m .- Vec{3,T}(w, w, 0), m .+ Vec{3,T}(w, w, h))
return Rect{3, T}(m .- Vec{3,T}(w, w, 0), m .+ Vec{3,T}(w, w, h))
end

function Rect{T}(a::Sphere) where {T}
function Rect{2, T}(a::Sphere) where {T}
mini, maxi = extrema(a)
return Rect{T}(mini, maxi .- mini)
end

Rect{T}(a) where {T} = Rect{T}(coordinates(a))
Rect{N,T}(a) where {N,T} = Rect{N,T}(coordinates(a))
function Rect{N1, T}(hypersph::GeometryBasics.HyperSphere{N2}) where {T, N1, N2}
mini, maxi = extrema(hypersph)
if length(mini) < N1
mini = vcat(mini, zeros(N1 - length(mini)))
maxi = vcat(maxi, zeros(N1 - length(mini)))
end
return Rect{N1, T}(mini, maxi .- mini)
end
Loading