/** * Create an image which is represented using a QuadTreeNode. * * @param size size of image * @param center_x x coordinate of center * @param center_y; y coordinate of center * @param parent parent quad tree node * @param quadrant the quadrant that the sub tree is in * @param level the level of the tree */ public static QuadTreeNode createTree(int size, int center_x, int center_y, QuadTreeNode parent, Quadrant quadrant, int level) { QuadTreeNode node; int intersect = checkIntersect(center_x, center_y, size); size = size / 2; if (intersect == 0 && size < 512) { node = new WhiteNode(quadrant, parent); } else if (intersect == 2) { node = new BlackNode(quadrant, parent); } else { if (level == 0) { node = new BlackNode(quadrant, parent); } else { node = new GreyNode(quadrant, parent); QuadTreeNode sw = createTree(size, center_x - size, center_y - size, node, Quadrant.cSouthWest, level - 1); QuadTreeNode se = createTree(size, center_x + size, center_y - size, node, Quadrant.cSouthEast, level - 1); QuadTreeNode ne = createTree(size, center_x + size, center_y + size, node, Quadrant.cNorthEast, level - 1); QuadTreeNode nw = createTree(size, center_x - size, center_y + size, node, Quadrant.cNorthWest, level - 1); node.setChildren(nw, ne, sw, se); } } return(node); }
/** * Compute the perimeter for a black node. * * @param size */ public override int perimeter(int size) { int retval = 0; // North QuadTreeNode neighbor = gtEqualAdjNeighbor(QuadTreeNode.NORTH); if (neighbor == null || neighbor is WhiteNode) { retval += size; } else if (neighbor is GreyNode) { retval += neighbor.sumAdjacent(Quadrant.cSouthEast, Quadrant.cSouthWest, size); } else { ; } // East neighbor = gtEqualAdjNeighbor(QuadTreeNode.EAST); if (neighbor == null || neighbor is WhiteNode) { retval += size; } else if (neighbor is GreyNode) { retval += neighbor.sumAdjacent(Quadrant.cSouthWest, Quadrant.cNorthWest, size); } else { ; } // South neighbor = gtEqualAdjNeighbor(QuadTreeNode.SOUTH); if (neighbor == null || neighbor is WhiteNode) { retval += size; } else if (neighbor is GreyNode) { retval += neighbor.sumAdjacent(Quadrant.cNorthWest, Quadrant.cNorthEast, size); } else { ; } // West neighbor = gtEqualAdjNeighbor(QuadTreeNode.WEST); if (neighbor == null || neighbor is WhiteNode) { retval += size; } else if (neighbor is GreyNode) { retval += neighbor.sumAdjacent(Quadrant.cNorthEast, Quadrant.cSouthEast, size); } else { ; } return(retval); }
/** * Construct a <tt>black</tt> quad tree node. * * @param quadrant the quadrant that this node represents * @param the parent quad tree node */ public BlackNode(Quadrant quadrant, QuadTreeNode parent) : base(quadrant, parent) { ; }
/** * Return the child that represents this quadrant of the given * node. * * @param node the node that we want the child from. * @return the child node representing this quadrant */ public override QuadTreeNode child(QuadTreeNode node) { return(node.getNorthEast()); }
/** * Create a node in the quad tree. * * @param childType if there's a parent, the type of child * @param nw the node represent the northwest quadrant * @param ne the node represent the northeast quadrant * @param sw the node represent the southwest quadrant * @param se the node represent the southeast quadrant */ private QuadTreeNode(Quadrant quad, QuadTreeNode nw, QuadTreeNode ne, QuadTreeNode sw, QuadTreeNode se, QuadTreeNode parent) { this.quadrant = quad; this.nw = nw; this.ne = ne; this.sw = sw; this.se = se; this.parent = parent; }
/** * Create a leaf node in the Quad Tree. * * @param childType if there's a parent, the type of child this node represents * @param parent the parent quad tree node */ public QuadTreeNode(Quadrant quad, QuadTreeNode parent) : this(quad, null, null, null, null, parent) { ; }
/** * Construct a <tt>grey</tt> image node. * * @param quadrant the quadrant that this node represents * @param parent the parent node in the quad tree. */ public GreyNode(Quadrant quadrant, QuadTreeNode parent) : base(quadrant, parent) { ; }
/** * Return the child that represents this quadrant of the given * node. * * @param node the node that we want the child from. * @return the child node representing this quadrant */ public override QuadTreeNode child(QuadTreeNode node) { return(node.getSouthWest()); }
/** * Construct a <tt>white</tt> image node. * * @param quadrant the quadrant that this node represents * @param parent the parent node in the quad tree */ public WhiteNode(Quadrant quadrant, QuadTreeNode parent) : base(quadrant, parent) { ; }