private void SplitAndAdjust(Node n) { Node newnode = QSplit(n); // Alttaki kutudakilerin parent'larýný update etmek lazým. if (newnode.Type == NodeType.Directory) { for (int k = 0; k < newnode.Items.Count; k++) { ((Node)newnode.Items[k].Item).Parent = newnode; } } // if (n.Parent == null) { CreateNewRoot(newnode, n); } else { Node p = n.Parent; p.Add(newnode.Mbr, newnode); newnode.Parent = p; AdjustEntry(p, n); if (p.Items.Count > MAXOBJ) { SplitAndAdjust(p); } else { AdjustPath(p); } } }
/// <summary> /// Cosmetic katman içindeki herþeyi siler. /// </summary> public void Clear() { RootNode = new Node(NodeType.Container); }
private Node QSplit(Node N) { int s1, s2; GetFarObjects(N, out s1, out s2); Node G1 = new Node(N.Type); Node G2 = new Node(N.Type); //G1.Parent = N.Parent; //G2.Parent = N.Parent; G1.Add(N.Items[s1].Mbr, N.Items[s1].Item); G2.Add(N.Items[s2].Mbr, N.Items[s2].Item); if (s2 > s1) { N.Items.RemoveAt(s2); N.Items.RemoveAt(s1); } else { N.Items.RemoveAt(s1); N.Items.RemoveAt(s2); } //////////////////////////////////// while (N.Items.Count != 0) { long minarea = long.MaxValue; int bestentry = -1; int bestgroup = -1; for (int x = 0; x < N.Items.Count; x++) { long d1 = G1.Mbr.Union(N.Items[x].Mbr).Area() - G1.Mbr.Area(); long d2 = G2.Mbr.Union(N.Items[x].Mbr).Area() - G2.Mbr.Area(); if (Math.Min(d1, d2) < minarea) { bestentry = x; if (d1 > d2) { bestgroup = 2; minarea = d2; } else { bestgroup = 1; minarea = d1; } } } ///////////////// //Debug.Assert(bestentry != -1, "dikkat"); //Debug.Assert(bestgroup != -1, "dikkat"); ///////////////// if (bestgroup == 1) { G1.Add(N.Items[bestentry].Mbr, N.Items[bestentry].Item); } else { G2.Add(N.Items[bestentry].Mbr, N.Items[bestentry].Item); } N.Items.RemoveAt(bestentry); /////////////////// if ((G1.Items.Count + N.Items.Count) == MINOBJ) { for (int x = 0; x < N.Items.Count; x++) { G1.Add(N.Items[x].Mbr, N.Items[x].Item); } N.Items.Clear(); } if ((G2.Items.Count + N.Items.Count) == MINOBJ) { for (int x = 0; x < N.Items.Count; x++) { G2.Add(N.Items[x].Mbr, N.Items[x].Item); } N.Items.Clear(); } //////////////////////// } N.Items.Clear(); for (int k = 0; k < G1.Items.Count; k++) { N.Add(G1.Items[k].Mbr, G1.Items[k].Item); } return G2; }
private void GetFarObjects(Node N, out int s1, out int s2) { s1 = 0; s2 = 1; long worst = 0; for (int x = 0; x < N.Items.Count; x++) { for (int y = 0; y < N.Items.Count; y++) { Mbr J = N.Items[x].Mbr.Union(N.Items[y].Mbr); long d1 = J.Area() - N.Items[x].Mbr.Area() - N.Items[y].Mbr.Area(); if (d1 > worst) { worst = d1; s1 = x; s2 = y; } } } }
private void CreateNewRoot(Node newnode1, Node newnode2) { RootNode = new Node(NodeType.Directory); RootNode.Add(newnode1.Mbr, newnode1); RootNode.Add(newnode2.Mbr, newnode2); newnode1.Parent = RootNode; newnode2.Parent = RootNode; }
private void AdjustPath(Node newnode) { Node p = newnode.Parent; if (p == null) { return; } if (AdjustEntry(p, newnode)) { AdjustPath(p); } }
private bool AdjustEntry(Node parent, Node node) { for (int k = 0; k < parent.Items.Count; k++) { NodeItem i = parent.Items[k]; if (node == i.Item) { if (i.Mbr.IsSame(node.Mbr)) { return false; } else { parent.Items.RemoveAt(k); parent.Add(node.Mbr, node); return true; } } } System.Diagnostics.Debug.Fail("Adjust Path hatasý"); return false; }