Esempio n. 1
0
        /// <summary>
        /// метод определяющий пересекаются ли две области mbr1-объект и mbr2 - область поиска
        /// </summary>
        /// <param name="mbr1">Объект</param>
        /// <param name="mbr2">Область</param>
        /// <returns></returns>
        public static bool isIntersected(TMBR mbr1, TMBR mbr2)
        {
            double d1, d2, d3, d4;

            d1 = Math.Min(mbr1.Left.X, mbr1.Right.X);
            d2 = Math.Max(mbr1.Left.Y, mbr1.Right.Y);
            d3 = Math.Max(mbr1.Left.X, mbr1.Right.X);
            d4 = Math.Min(mbr1.Left.Y, mbr1.Right.Y);

            mbr1.Left.X  = d1;
            mbr1.Left.Y  = d2;
            mbr1.Right.X = d3;
            mbr1.Right.Y = d4;

            d1 = Math.Min(mbr2.Left.X, mbr2.Right.X);
            d2 = Math.Max(mbr2.Left.Y, mbr2.Right.Y);
            d3 = Math.Max(mbr2.Left.X, mbr2.Right.X);
            d4 = Math.Min(mbr2.Left.Y, mbr2.Right.Y);

            mbr2.Left.X  = d1;
            mbr2.Left.Y  = d2;
            mbr2.Right.X = d3;
            mbr2.Right.Y = d4;

            if (mbr1.Left.X >= mbr2.Left.X && mbr1.Right.X <= mbr2.Right.X && mbr1.Left.Y <= mbr2.Left.Y && mbr1.Right.Y >= mbr2.Right.Y)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// метод определяющий пересекается ли два прямоугольника
        /// </summary>
        /// <param name="mbr"></param>
        /// <returns></returns>
        public bool IsIntersected(TMBR mbr)
        {
            double d1, d2, d3, d4;

            d1 = Math.Min(fmbr.Left.X, fmbr.Right.X);
            d2 = Math.Max(fmbr.Left.Y, fmbr.Right.Y);
            d3 = Math.Max(fmbr.Left.X, fmbr.Right.X);
            d4 = Math.Min(fmbr.Left.Y, fmbr.Right.Y);

            fmbr.Left.X  = d1;
            fmbr.Left.Y  = d2;
            fmbr.Right.X = d3;
            fmbr.Right.Y = d4;

            d1 = Math.Min(mbr.Left.X, mbr.Right.X);
            d2 = Math.Max(mbr.Left.Y, mbr.Right.Y);
            d3 = Math.Max(mbr.Left.X, mbr.Right.X);
            d4 = Math.Min(mbr.Left.Y, mbr.Right.Y);



            mbr.Left.X  = d1;
            mbr.Left.Y  = d2;
            mbr.Right.X = d3;
            mbr.Right.Y = d4;

            return(!(mbr.Left.Y < fmbr.Right.Y || mbr.Right.Y > fmbr.Left.Y || mbr.Right.X < fmbr.Left.X || mbr.Left.X > fmbr.Right.X));
        }
Esempio n. 3
0
        /// <summary>
        /// Копирование
        /// </summary>
        /// <param name="node"></param>
        public void copy(TRNode node)// метод копирования узла
        {
            FObject = new MyLib.Point[node.FObject.Length];
            if (FObject.Length > 0)
            {
                for (int i = 0; i < node.FObject.Length; i++)
                {
                    FObject[i]         = new MyLib.Point(node.FObject[i].x, node.FObject[i].y, node.FObject[i].idx);
                    FObject[i].cluster = node.FObject[i].cluster;
                }
                FisLeaf = true;
            }
            else
            {
                FChildren = new int[node.FChildren.Length];
                for (int i = 0; i < node.FChildren.Length; i++)
                {
                    FChildren[i] = node.FChildren[i];
                }
                FisLeaf = false;
            }


            fmbr = new TMBR(node.fmbr.Left, node.fmbr.Right);

            FParent = node.FParent;
            FLevel  = node.FLevel;
        }
Esempio n. 4
0
        /// <summary>
        /// Возвращает площадь перекрытия MBR узла и заданной области
        /// </summary>
        /// <param name="mbr_ovrl"></param>
        /// <returns></returns>
        public double Overlap(TMBR mbr_ovrl)
        {
            double x, y;

            x = Math.Min(mbr_ovrl.Right.X, fmbr.Right.X) - Math.Max(mbr_ovrl.Left.X, fmbr.Left.X);
            if (x <= 0)
            {
                return(0);
            }
            y = Math.Min(mbr_ovrl.Left.Y, fmbr.Left.Y) - Math.Max(mbr_ovrl.Right.Y, fmbr.Right.Y);
            if (y <= 0)
            {
                return(0);
            }
            return(x * y);
        }
        public List <MyLib.Point> findObjectinarea(TMBR mbr, int node_id, List <MyLib.Point> array, int idx)
        {
            double eps = Dbscanwithrtree.eps;

            MyLib.Point f = new MyLib.Point(mbr.Left.X + eps, mbr.Left.Y - eps, -1);

            for (int i = 0; i < FNodeArr[node_id].FObject.Length; i++)
            {
                if (FNodeArr[node_id].FObject[i].idx != idx && f.Distance(FNodeArr[node_id].FObject[i]) <= eps)
                {
                    array.Add(FNodeArr[node_id].FObject[i]);
                }
            }

            return(array);
        }
 public List <MyLib.Point> findobjectinarea(TMBR mbr, int node_id, List <MyLib.Point> array, int idx)
 {
     if (FNodeArr[node_id].FChildren.Length > 0)
     {
         for (int i = 0; i < FNodeArr[node_id].FChildren.Length; i++)
         {
             if (FNodeArr[FNodeArr[node_id].FChildren[i]].IsIntersected(mbr) && !FNodeArr[FNodeArr[node_id].FChildren[i]].IsVisited)
             {
                 findobjectinarea(mbr, FNodeArr[node_id].FChildren[i], array, idx);
             }
         }
     }
     else
     {
         array = findObjectinarea(mbr, node_id, array, idx);
         FNodeArr[node_id].IsVisited = true;
     }
     //Console.WriteLine("count " + array.Count);
     return(array);
 }
Esempio n. 7
0
        public TMBR GetMBR()
        {
            TMBR res = null, nmbr;

            foreach (MyRecord r in this.Table)
            {
                nmbr = r.GetMBR();
                if (nmbr != null)
                {
                    if (res == null)
                    {
                        res = nmbr;
                    }
                    else
                    {
                        res.AddMBR(nmbr);
                    }
                }
            }
            return(res);
        }
        /// <summary>Получить MBR слоя</summary>
        /// <returns></returns>
        public TMBR GetMBR()
        {
            TMBR res = null;

            foreach (var r in Table)
            {
                var newMbr = r.GetMBR();
                if (newMbr == null)
                {
                    continue;
                }
                if (res == null)
                {
                    res = newMbr;
                }
                else
                {
                    res.AddMBR(newMbr);
                }
            }
            return(res);
        }
Esempio n. 9
0
 /// <summary>
 /// Возвращает площадь MBR узла
 /// </summary>
 /// <returns></returns>
 public double Area(TMBR mbr)
 {
     return((mbr.Right.X - mbr.Left.X) * (mbr.Left.Y - mbr.Right.Y));
 }