public java.util.List<Figure> getFigures(Rectangle2D.Double bounds) { return new LinkedList<Figure>(quadTree.findInside(bounds)); }
public Collection<T> findIntersects(Rectangle2D r) { return findIntersects(new Rectangle2D.Double(r.getX(), r.getY(), r.getWidth(), r.getHeight())); } public Collection<T> findIntersects(Rectangle2D.Double r) {
@Nullable public Figure findFigureExcept(Point2D.Double p, Collection ignore) { Collection<Figure> c = quadTree.findContains(p); switch (c.size()) { case 0 : { return null; } case 1: { Figure f = c.iterator().next(); return (! ignore.contains(f) || ! f.contains(p)) ? null : f; } default : { for (Figure f : getFiguresFrontToBack()) { if (! ignore.contains(f) && f.contains(p)) return f; } return null; } } } @Nullable public Figure findFigureBehind(Point2D.Double p, Figure figure) {
@Override public Figure basicRemoveChild(int index) { Figure figure = children.get(index); children.remove(index); quadTree.remove(figure); figure.removeFigureListener(figureHandler); needsSorting = true; return figure; }
@Override public void basicAdd(int index, Figure figure) { children.add(index, figure); quadTree.add(figure, figure.getDrawingArea()); figure.addFigureListener(figureHandler); needsSorting = true; } @Override
public void add(T o, Rectangle2D.Double bounds) { if (root.bounds.contains(bounds)) { root.add(o, (Rectangle2D.Double) bounds.clone()); } else { outside.put(o, (Rectangle2D.Double) bounds.clone()); if (outside.size() > maxOutside) { reorganize(); } } } public void reorganize() {
@Override public Figure findFigureExcept(Point2D.Double p, Collection<? extends Figure> ignore) { Collection<Figure> c = quadTree.findContains(p); switch (c.size()) { case 0: { return null; } case 1: { Figure f = c.iterator().next(); return (!ignore.contains(f) || !f.contains(p)) ? null : f; } default: { for (Figure f : getFiguresFrontToBack()) { if (!ignore.contains(f) && f.contains(p)) { return f; } } return null; } } }
@Override public Figure basicRemoveChild(int index) { Figure figure = getChild(index); quadTree.remove(figure); needsSorting = true; super.basicRemoveChild(index); return figure; }
@Override public void basicAdd(int index, Figure figure) { super.basicAdd(index, figure); quadTree.add(figure, figure.getDrawingArea()); needsSorting = true; }
@Override public Figure findFigureExcept(Point2D.Double p, Figure ignore) { Collection<Figure> c = quadTree.findContains(p); switch (c.size()) { case 0: { return null; } case 1: { Figure f = c.iterator().next(); return (f == ignore || !f.contains(p)) ? null : f; } default: { for (Figure f : getFiguresFrontToBack()) { if (f != ignore && f.contains(p)) { return f; } } return null; } } }
@Override public java.util.List<Figure> findFigures(Rectangle2D.Double r) { LinkedList<Figure> c = new LinkedList<Figure>(quadTree.findIntersects(r)); switch (c.size()) { case 0: // fall through case 1: return c; default: return sort(c); } }
public java.util.List<Figure> getChildren(Rectangle2D.Double bounds) { return new LinkedList<Figure>(quadTree.findInside(bounds)); }
@Override public Figure findFigureInside(Point2D.Double p) { Collection<Figure> c = quadTree.findContains(p); for (Figure f : getFiguresFrontToBack()) { if (c.contains(f) && f.contains(p)) { return f.findFigureInside(p); } } return null; }
public java.util.List<Figure> findFigures(Rectangle2D.Double r) { LinkedList<Figure> c = new LinkedList<Figure>(quadTree.findIntersects(r)); switch (c.size()) { case 0 : // fall through case 1: return c; default : return sort(c); } } public java.util.List<Figure> findFiguresWithin(Rectangle2D.Double bounds) {
@Override public Figure findFigureInside(Point2D.Double p) { Collection<Figure> c = quadTree.findContains(p); for (Figure f : getFiguresFrontToBack()) { if (c.contains(f) && f.contains(p)){ return f.findFigureInside(p); } } return null; }
@Override public void draw(Graphics2D g) { Rectangle2D clipBounds = g.getClipBounds(); if (clipBounds != null) { Collection<Figure> c = quadTree.findIntersects(clipBounds); Collection<Figure> toDraw = sort(c); draw(g, toDraw); } else { draw(g, children); } }
@Override public Figure findFigure(Point2D.Double p) { Collection<Figure> c = quadTree.findContains(p); switch (c.size()) { case 0: return null; case 1: { Figure f = c.iterator().next(); return (f.contains(p)) ? f : null; } default: { for (Figure f : getFiguresFrontToBack()) { if (c.contains(f) && f.contains(p)) { return f; } } return null; } } }