using StaticArrays: SVector mutable struct Particle id::Int64 c::SVector{2,Float64} # Center tmp_c::SVector{2,Float64} # Temporary center φ::Float64 # Angle function Particle(id::Int64, c::SVector{2,Float64}, φ::Float64) return new(id, c, c, φ) end end function restrict_coordinate(value::Float64, l::Float64) if value < -l value += 2 * l elseif value >= l value -= 2 * l end return value end function restrict_coordinates!(p::Particle, l::Float64) p.tmp_c = SVector{2}(restrict_coordinate(p.tmp_c[i], l) for i in 1:2) return nothing end function minimum_image_coordinate(value::Float64, l::Float64) if value <= -l value += 2 * l elseif value > l value -= 2 * l end return value end function minimum_image(v::SVector{2,Float64}, l::Float64) return SVector{2}(minimum_image_coordinate(v[i], l) for i in 1:2) end function are_overlapping(p1::Particle, p2::Particle, overlapping_r²::Float64, l::Float64) r⃗₁₂ = p2.c - p1.c # 1 -> 2 r⃗₁₂ = minimum_image(r⃗₁₂, l) distance² = r⃗₁₂[1]^2 + r⃗₁₂[2]^2 overlapping = distance² < overlapping_r² return (; overlapping, r⃗₁₂, distance²) end