@Test public void testAddAll() { Random random = new Random(); Array<CollisionPoint> points = new Array<CollisionPoint>(); for (int i = 0; i < 100; i++) { points.add(new CollisionPoint(random.nextInt(128), random.nextInt(128))); } rootQuad.addAll(points); Assert.assertEquals(points.size, rootQuad.getTotalElements()); }
public void addAll(Array<T> elementsToAdd) { if (elementsToAdd == null || elementsToAdd.size == 0) return; clearTotalElementsCache(); Array<T> elementsWithinQuad = new Array<T>(); for (T element : elementsToAdd) { if (this.contains(element.getX(), element.getY())) { elementsWithinQuad.add(element); } } lock.lockWrite(); if (topLeft != null) { lock.lockRead(); lock.unlockWrite(); for (T element : elementsWithinQuad) { if (topLeft.add(element)) { continue; } if (topRight.add(element)) { continue; } if (bottomLeft.add(element)) { continue; } if (bottomRight.add(element)) { continue; } } lock.unlockRead(); return; } this.elements.addAll(elementsWithinQuad); for (T element : elementsWithinQuad) { element.addPostionChangeListener(this); } int totalElements = this.elements.size; lock.unlockWrite(); if (totalElements > elementLimitPerQuad && (getWidth() * 0.5f) >= minimumQuadWidth && (getHeight() * 0.5f) >= minimumQuadHeight) { subdivide(); } }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public void addAll(Array<T> elementsToAdd) { if (elementsToAdd == null || elementsToAdd.size == 0) return; clearTotalElementsCache(); Array<T> elementsWithinQuad = new Array<T>(); for (T element : elementsToAdd) { if (this.contains(element.getX(), element.getY())) { elementsWithinQuad.add(element); } } lock.lockWrite(); if (topLeft != null) { lock.lockRead(); lock.unlockWrite(); for (T element : elementsWithinQuad) { if (topLeft.add(element)) { continue; } if (topRight.add(element)) { continue; } if (bottomLeft.add(element)) { continue; } if (bottomRight.add(element)) { continue; } } lock.unlockRead(); return; } this.elements.addAll(elementsWithinQuad); for (T element : elementsWithinQuad) { element.addPostionChangeListener(this); } int totalElements = this.elements.size; lock.unlockWrite(); if (totalElements > elementLimitPerQuad && (getWidth() * 0.5f) >= minimumQuadWidth && (getHeight() * 0.5f) >= minimumQuadHeight) { subdivide(); } } }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public void addAll(Array<T> elementsToAdd) { if (elementsToAdd == null || elementsToAdd.size == 0) return; clearTotalElementsCache(); Array<T> elementsWithinQuad = new Array<T>(); for (T element : elementsToAdd) { if (this.contains(element.getX(), element.getY())) { elementsWithinQuad.add(element); } } lock.lockWrite(); if (topLeft != null) { lock.lockRead(); lock.unlockWrite(); for (T element : elementsWithinQuad) { if (topLeft.add(element)) { continue; } if (topRight.add(element)) { continue; } if (bottomLeft.add(element)) { continue; } if (bottomRight.add(element)) { continue; } } lock.unlockRead(); return; } this.elements.addAll(elementsWithinQuad); for (T element : elementsWithinQuad) { element.addPostionChangeListener(this); } int totalElements = this.elements.size; lock.unlockWrite(); if (totalElements > elementLimitPerQuad && (getWidth() * 0.5f) >= minimumQuadWidth && (getHeight() * 0.5f) >= minimumQuadHeight) { subdivide(); } } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public void addAll(Array<T> elementsToAdd) { if (elementsToAdd == null || elementsToAdd.size == 0) return; clearTotalElementsCache(); Array<T> elementsWithinQuad = new Array<T>(); for (T element : elementsToAdd) { if (this.contains(element.getX(), element.getY())) { elementsWithinQuad.add(element); } } lock.lockWrite(); if (topLeft != null) { lock.lockRead(); lock.unlockWrite(); for (T element : elementsWithinQuad) { if (topLeft.add(element)) { continue; } if (topRight.add(element)) { continue; } if (bottomLeft.add(element)) { continue; } if (bottomRight.add(element)) { continue; } } lock.unlockRead(); return; } this.elements.addAll(elementsWithinQuad); for (T element : elementsWithinQuad) { element.addPostionChangeListener(this); } int totalElements = this.elements.size; lock.unlockWrite(); if (totalElements > elementLimitPerQuad && (getWidth() * 0.5f) >= minimumQuadWidth && (getHeight() * 0.5f) >= minimumQuadHeight) { subdivide(); } } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); void debugRender(Graphics g); void addAll(Array<T> elementsToAdd); boolean add(T element); void removeAll(Array<T> elementsToRemove); @Override void clear(); boolean remove(T element); @Override Array<T> getElementsWithinArea(Shape area); @Override Array<T> getElementsWithinArea(Shape area, QuadTreeSearchDirection searchDirection); @Override void getElementsWithinArea(Array<T> result, Shape area); @Override void getElementsWithinArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection); @Override Array<T> getElementsContainingArea(Shape area, boolean entirelyContained); @Override Array<T> getElementsContainingArea(Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override Array<T> getElementsContainingPoint(Point point); @Override Array<T> getElementsContainingPoint(Point point, QuadTreeSearchDirection searchDirection); @Override void getElementsContainingPoint(Array<T> result, Point point); @Override void getElementsContainingPoint(Array<T> result, Point point, QuadTreeSearchDirection searchDirection); Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment); @Override Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment, QuadTreeSearchDirection searchDirection); void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment); @Override void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment, QuadTreeSearchDirection searchDirection); Array<T> getElements(); void getElements(Array<T> result); int getTotalQuads(); int getTotalElements(); @Override void positionChanged(T moved); QuadTree<T> getParent(); int getTotalMergeOperations(); int getElementLimitPerQuad(); int getMergeWatermark(); @Override float getMinimumQuadWidth(); @Override float getMinimumQuadHeight(); }
ConcurrentPointQuadTree extends Rectangle implements QuadTree<T> { public void addAll(Array<T> elementsToAdd) { if (elementsToAdd == null || elementsToAdd.size == 0) return; clearTotalElementsCache(); Array<T> elementsWithinQuad = new Array<T>(); for (T element : elementsToAdd) { if (this.contains(element.getX(), element.getY())) { elementsWithinQuad.add(element); } } lock.lockWrite(); if (topLeft != null) { lock.lockRead(); lock.unlockWrite(); for (T element : elementsWithinQuad) { if (topLeft.add(element)) { continue; } if (topRight.add(element)) { continue; } if (bottomLeft.add(element)) { continue; } if (bottomRight.add(element)) { continue; } } lock.unlockRead(); return; } this.elements.addAll(elementsWithinQuad); for (T element : elementsWithinQuad) { element.addPostionChangeListener(this); } int totalElements = this.elements.size; lock.unlockWrite(); if (totalElements > elementLimitPerQuad && (getWidth() * 0.5f) >= minimumQuadWidth && (getHeight() * 0.5f) >= minimumQuadHeight) { subdivide(); } } ConcurrentPointQuadTree(int elementLimitPerQuad, float x, float y, float width, float height);  ConcurrentPointQuadTree(ConcurrentPointQuadTree<T> parent, float x, float y, float width, float height);  ConcurrentPointQuadTree(int elementLimitPerQuad, int mergeWatermark, float x, float y, float width,
			float height);  ConcurrentPointQuadTree(float minimumQuadWidth, float minimumQuadHeight, int elementLimitPerQuad,
			int mergeWatermark, float x, float y, float width, float height); void debugRender(Graphics g); void addAll(Array<T> elementsToAdd); boolean add(T element); void removeAll(Array<T> elementsToRemove); @Override void clear(); boolean remove(T element); @Override Array<T> getElementsWithinArea(Shape area); @Override Array<T> getElementsWithinArea(Shape area, QuadTreeSearchDirection searchDirection); @Override void getElementsWithinArea(Array<T> result, Shape area); @Override void getElementsWithinArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection); @Override Array<T> getElementsContainingArea(Shape area, boolean entirelyContained); @Override Array<T> getElementsContainingArea(Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, boolean entirelyContained); @Override void getElementsContainingArea(Array<T> result, Shape area, QuadTreeSearchDirection searchDirection, boolean entirelyContained); @Override Array<T> getElementsContainingPoint(Point point); @Override Array<T> getElementsContainingPoint(Point point, QuadTreeSearchDirection searchDirection); @Override void getElementsContainingPoint(Array<T> result, Point point); @Override void getElementsContainingPoint(Array<T> result, Point point, QuadTreeSearchDirection searchDirection); Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment); @Override Array<T> getElementsIntersectingLineSegment(LineSegment lineSegment, QuadTreeSearchDirection searchDirection); void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment); @Override void getElementsIntersectingLineSegment(Array<T> result, LineSegment lineSegment, QuadTreeSearchDirection searchDirection); Array<T> getElements(); void getElements(Array<T> result); int getTotalQuads(); int getTotalElements(); @Override void positionChanged(T moved); QuadTree<T> getParent(); int getTotalMergeOperations(); int getElementLimitPerQuad(); int getMergeWatermark(); @Override float getMinimumQuadWidth(); @Override float getMinimumQuadHeight(); static Color QUAD_COLOR; static Color ELEMENT_COLOR; }