@startuml package com.iluwatar.spatialpartition { class App { - LOGGER : Logger {static} + App() + main(args : String[]) {static} ~ noSpatialPartition(height : int, width : int, numOfMovements : int, bubbles : Hashtable<Integer, Bubble>) {static} ~ withSpatialPartition(height : int, width : int, numOfMovements : int, bubbles : Hashtable<Integer, Bubble>) {static} } class Bubble { - LOGGER : Logger {static} - RANDOM : Random {static} ~ radius : int ~ Bubble(x : int, y : int, id : int, radius : int) ~ handleCollision(bubblesToCheck : ArrayList<Point<T>>, allBubbles : Hashtable<Integer, Bubble>) ~ move() ~ pop(allBubbles : Hashtable<Integer, Bubble>) ~ touches(b : Bubble) : boolean } abstract class Point<T> { + coordinateX : int + coordinateY : int + id : int ~ Point<T>(x : int, y : int, id : int) ~ handleCollision(ArrayList<Point<T>>, Hashtable<Integer, T>) {abstract} ~ move() {abstract} ~ touches(T) : boolean {abstract} } class QuadTree { ~ boundary : Rect ~ capacity : int ~ divided : boolean ~ northeast : QuadTree ~ northwest : QuadTree ~ points : Hashtable<Integer, Point<T>> ~ southeast : QuadTree ~ southwest : QuadTree ~ QuadTree(boundary : Rect, capacity : int) ~ divide() ~ insert(p : Point<T>) ~ query(r : Rect, relevantPoints : ArrayList<Point<T>>) : ArrayList<Point<T>> } class Rect { ~ coordinateX : double ~ coordinateY : double ~ height : double ~ width : double ~ Rect(x : double, y : double, width : double, height : double) ~ contains(p : Point<T>) : boolean ~ intersects(other : Rect) : boolean } class SpatialPartitionBubbles { ~ bubbles : Hashtable<Integer, Bubble> ~ quadTree : QuadTree ~ SpatialPartitionBubbles(bubbles : Hashtable<Integer, Bubble>, quadTree : QuadTree) ~ handleCollisionsUsingQt(b : Bubble) } abstract class SpatialPartitionGeneric<T> { ~ playerPositions : Hashtable<Integer, T> ~ quadTree : QuadTree + SpatialPartitionGeneric<T>() ~ handleCollisionsUsingQt(T) {abstract} } } SpatialPartitionBubbles --> "-quadTree" QuadTree SpatialPartitionGeneric --> "-quadTree" QuadTree QuadTree --> "-boundary" Rect QuadTree --> "-northwest" QuadTree QuadTree --> "-southwest" QuadTree Bubble --|> Point SpatialPartitionBubbles --|> SpatialPartitionGeneric @enduml