public AbstractQuadTreeNode(AbstractQuadTreeNode<E> parent, int positionInParentNode) {
    this.parent = parent;
    this.depth = parent.getDepth() + 1;
    this.treeRoot = parent.getTreeRoot();
    this.positionInParentNode = positionInParentNode;

    this.elements = new ArrayList<E>(treeRoot.maxElementsPerNode);

    switch (positionInParentNode) {
      case NW:
        maxX = parent.getSplitPoint().x;
        maxY = parent.getMaxY();
        minX = parent.getMinX();
        minY = parent.getSplitPoint().y;
        break;

      case NE:
        maxX = parent.getMaxX();
        maxY = parent.getMaxY();
        minX = parent.getSplitPoint().x;
        minY = parent.getSplitPoint().y;
        break;

      case SW:
        maxX = parent.getSplitPoint().x;
        maxY = parent.getSplitPoint().y;
        minX = parent.getMinX();
        minY = parent.getMinY();
        break;

      case SE:
        maxX = parent.getMaxX();
        maxY = parent.getSplitPoint().y;
        minX = parent.getSplitPoint().x;
        minY = parent.getMinY();
        break;
    }

    this.splitPoint = new Point2D.Double((maxX + minX) / 2, (maxY + minY) / 2);
  }