public List<ConvexHull> getChildren() {
   List<ConvexHull> allChildren = new LinkedList<ConvexHull>();
   for (ConvexHull child : children) {
     allChildren.add(child);
     allChildren.addAll(child.getChildren());
   }
   return allChildren;
 }
  /** Constructor for child hull (has parent) */
  public ConvexHull(List<OrganismNode> nodes, String hullName, ConvexHull parent) {
    this.level = parent == null ? 1 : parent.getLevel() + 1;
    this.nodes = nodes;

    // Construct points as well as any children hull that exist
    this.points = new LinkedList<Point>();
    Map<String, List<OrganismNode>> childrenGroups = new HashMap<String, List<OrganismNode>>();
    for (OrganismNode o : nodes) {
      this.points.add(o.getCenter());
      if (o.getTypes().containsKey(level + 1)) {
        if (childrenGroups.containsKey(o.getTypes().get(level + 1)))
          childrenGroups.get(o.getTypes().get(level + 1)).add(o);
        else {
          List<OrganismNode> temp = new LinkedList<OrganismNode>();
          temp.add(o);
          childrenGroups.put(o.getTypes().get(level + 1), temp);
        }
      }
    }

    this.hullName = hullName;
    this.parent = parent;
    hull = new ArrayList<Point>();
    hullShape = new Polygon();
    if (points.size() < 3) {
      hull.addAll(points);
      for (Point p : hull) hullShape.addPoint(p.x, p.y);
    } else GrahamScan();

    children = new LinkedList<ConvexHull>();
    if (childrenGroups.size() > 0) {
      for (Map.Entry<String, List<OrganismNode>> e : childrenGroups.entrySet())
        children.add(new ConvexHull(e.getValue(), e.getKey(), this));
    }
    childCollisions = TBSUtils.hullCollisions(level, children);
  }