public TreeMap getItem(Point point) { Rectangle rect = getClientArea(); double extent = Math.min(rect.width, rect.height) * frame.scale; // normalized coordinates in the interval [0,1) double x0 = (point.x - (rect.x - frame.offsetX)) / extent; double y0 = (point.y - (rect.y - frame.offsetY)) / extent; if (x0 > 1.0 || x0 < 0) return null; if (y0 > 1.0 || y0 < 0) return null; TreeMap tree = treeMap; while (extent > 128 && tree != null && tree.getNetblock().getCIDR() < 32) { x0 *= 16; y0 *= 16; int xi = (int) x0; int yi = (int) y0; x0 -= xi; y0 -= yi; IPv4Netblock subnet = curve.getSubNetblock(tree.getNetblock(), yi * 16 + xi); tree = tree.getSubTree(subnet); extent = extent / 16; } return tree; }
public Rectangle getItemBounds(TreeMap subtree) { Rectangle rect = getClientArea(); int x = rect.x - (int) frame.offsetX; int y = rect.y - (int) frame.offsetY; int extent = (int) (Math.min(rect.width, rect.height) * frame.scale); TreeMap tree = treeMap; while (!tree.getNetblock().equals(subtree.getNetblock())) { int h = curve.getIndex(tree.getNetblock(), subtree.getNetblock()); int xi = h % 16; int yi = h / 16; x = x + (xi * extent / 16); y = y + (yi * extent / 16); extent = extent / 16; tree = tree.getSubTree(subtree.getNetblock()); } return new Rectangle(x, y, extent, extent); }