internal RtreePage(RtreePage root, RtreePage p) { b = new Branch[card]; n = 2; b[0] = new Branch(root.cover(), root); b[1] = new Branch(p.cover(), p); for (int i = 2; i < card; i++) { b[i] = new Branch(); } }
internal RtreePage(Storage storage, RtreePage root, RtreePage p) { branch = storage.CreateLink(card); branch.Length = card; b = new Rectangle[card]; n = 2; setBranch(0, root.cover(), root); setBranch(1, p.cover(), p); for (int i = 2; i < card; i++) { b[i] = new Rectangle(); } }
internal RtreePage insert(Rectangle r, IPersistent obj, int level) { Load(); Modify(); if (--level != 0) { // not leaf page int i, mini = 0; long minIncr = Int64.MaxValue; long minArea = Int64.MaxValue; for (i = 0; i < n; i++) { long area = b[i].r.Area(); long incr = Rectangle.JoinArea(b[i].r, r) - area; if (incr < minIncr) { minIncr = incr; minArea = area; mini = i; } else if (incr == minIncr && area < minArea) { minArea = area; mini = i; } } RtreePage p = (RtreePage)b[mini].p; RtreePage q = p.insert(r, obj, level); if (q == null) { // child was not split b[mini].r.Join(r); return(null); } else { // child was split b[mini] = new Branch(p.cover(), p); return(addBranch(new Branch(q.cover(), q))); } } else { return(addBranch(new Branch(r, obj))); } }
internal RtreePage insert(Storage storage, Rectangle r, object obj, int level) { Modify(); if (--level != 0) { // not leaf page int i, mini = 0; long minIncr = long.MaxValue; long minArea = long.MaxValue; for (i = 0; i < n; i++) { long area = b[i].Area(); long incr = Rectangle.JoinArea(b[i], r) - area; if (incr < minIncr) { minIncr = incr; minArea = area; mini = i; } else if (incr == minIncr && area < minArea) { minArea = area; mini = i; } } RtreePage p = (RtreePage)branch[mini]; RtreePage q = p.insert(storage, r, obj, level); if (q == null) { // child was not split b[mini].Join(r); return(null); } else { // child was split setBranch(mini, p.cover(), p); return(addBranch(storage, q.cover(), q)); } } else { return(addBranch(storage, new Rectangle(r), obj)); } }
internal int remove(Rectangle r, IPersistent obj, int level, ArrayList reinsertList) { Load(); if (--level != 0) { for (int i = 0; i < n; i++) { if (r.Intersects(b[i].r)) { RtreePage pg = (RtreePage)b[i].p; int reinsertLevel = pg.remove(r, obj, level, reinsertList); if (reinsertLevel >= 0) { if (pg.n >= minFill) { b[i] = new Branch(pg.cover(), pg); Modify(); } else { // not enough entries in child reinsertList.Add(pg); reinsertLevel = level - 1; removeBranch(i); } return(reinsertLevel); } } } } else { for (int i = 0; i < n; i++) { if (b[i].p == obj) { removeBranch(i); return(0); } } } return(-1); }
internal int remove(Rectangle r, object obj, int level, ArrayList reinsertList) { if (--level != 0) { for (int i = 0; i < n; i++) { if (r.Intersects(b[i])) { RtreePage pg = (RtreePage)branch[i]; int reinsertLevel = pg.remove(r, obj, level, reinsertList); if (reinsertLevel >= 0) { if (pg.n >= minFill) { setBranch(i, pg.cover(), pg); Modify(); } else { // not enough entries in child reinsertList.Add(pg); reinsertLevel = level - 1; removeBranch(i); } return(reinsertLevel); } } } } else { for (int i = 0; i < n; i++) { if (branch.ContainsElement(i, obj)) { removeBranch(i); return(0); } } } return(-1); }