/// <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); } }
/// <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)); }
/// <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; }
/// <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); }
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); }
/// <summary> /// Возвращает площадь MBR узла /// </summary> /// <returns></returns> public double Area(TMBR mbr) { return((mbr.Right.X - mbr.Left.X) * (mbr.Left.Y - mbr.Right.Y)); }