예제 #1
0
        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);
                }
            }
        }
예제 #2
0
 /// <summary>
 /// Cosmetic katman içindeki herþeyi siler.
 /// </summary>
 public void Clear()
 {
     RootNode = new Node(NodeType.Container);
 }
예제 #3
0
        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;
        }
예제 #4
0
        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;
                    }
                }
            }
        }
예제 #5
0
        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;
        }
예제 #6
0
        private void AdjustPath(Node newnode)
        {
            Node p = newnode.Parent;

            if (p == null)
            {
                return;
            }

            if (AdjustEntry(p, newnode))
            {
                AdjustPath(p);
            }
        }
예제 #7
0
        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;
        }