public Record(Address address, Byte[] data) { Address = address; BoundingBox = new MinimumBoundingBox( BitConverter.ToSingle(data, 1), BitConverter.ToSingle(data, 5), BitConverter.ToSingle(data, 9), BitConverter.ToSingle(data, 13)); RecordID = BitConverter.ToInt32(data, 17); }
public NodeEntry(Byte[] data) { Byte[] childAddress = new Byte[Constants.ADDRESS_SIZE]; Array.Copy(data, childAddress, Constants.ADDRESS_SIZE); Child = new Address(childAddress); MinimumBoundingBox = new MinimumBoundingBox( BitConverter.ToSingle(data, Constants.ADDRESS_SIZE), BitConverter.ToSingle(data, Constants.ADDRESS_SIZE + 4), BitConverter.ToSingle(data, Constants.ADDRESS_SIZE + 8), BitConverter.ToSingle(data, Constants.ADDRESS_SIZE + 12)); }
protected virtual MinimumBoundingBox CombineMinimumBoundingBoxes(MinimumBoundingBox area1, MinimumBoundingBox area2) { Single newMinX, newMaxX, newMinY, newMaxY; if (area1.MinX < area2.MinX) newMinX = area1.MinX; else newMinX = area2.MinX; if (area1.MaxX > area2.MaxX) newMaxX = area1.MaxX; else newMaxX = area2.MaxX; if (area1.MinY < area2.MinY) newMinY = area1.MinY; else newMinY = area2.MinY; if (area1.MaxY > area2.MaxY) newMaxY = area1.MaxY; else newMaxY = area2.MaxY; return new MinimumBoundingBox(newMinX, newMinY, newMaxX, newMaxY); }
protected virtual Single GetCenterDistance(MinimumBoundingBox box1, MinimumBoundingBox box2) { return GetDistance((box1.MaxX + box1.MinX) / 2, (box1.MaxY + box1.MinY) / 2, (box2.MaxX + box2.MinX) / 2, (box2.MaxY + box2.MinY) / 2); }
protected virtual NodeEntry PickNext(List<NodeEntry> entryPool, MinimumBoundingBox minimumBoundingBox1, MinimumBoundingBox minimumBoundingBox2) { NodeEntry nextEntry = entryPool[0]; Single maxEnlargementDifference = Math.Abs( GetFutureSize(nextEntry.MinimumBoundingBox, minimumBoundingBox1) - GetFutureSize(nextEntry.MinimumBoundingBox, minimumBoundingBox2)); foreach (NodeEntry entry in entryPool) { Single enlargmentDifference = Math.Abs( GetFutureSize(entry.MinimumBoundingBox, minimumBoundingBox1) - GetFutureSize(entry.MinimumBoundingBox, minimumBoundingBox2)); if (enlargmentDifference > maxEnlargementDifference) { maxEnlargementDifference = enlargmentDifference; nextEntry = entry; } } return nextEntry; }
protected virtual Boolean Overlaps(MinimumBoundingBox area1, MinimumBoundingBox area2) { //checks the only conditions in which they don't overlap return !( area1.MinX > area2.MaxX || area1.MaxX < area2.MinX || area1.MinY > area2.MaxY || area1.MaxY < area2.MinY); }
protected virtual Boolean Overlaps(WindowQuery window, MinimumBoundingBox area) { //checks the only conditions in which they don't overlap return !( window.MinX > area.MaxX || // left > right window.MaxX < area.MinX || // right < left window.MinY > area.MaxY || // bottom > top window.MaxY < area.MinY); // top < bottom }
protected virtual Boolean Overlaps(RangeQuery range, MinimumBoundingBox area) { Single distance = 0; if (range.CenterX < area.MinX) distance = (range.CenterX - area.MinX) * (range.CenterX - area.MinX); else if (range.CenterX > area.MaxX) distance = (range.CenterX - area.MaxX) * (range.CenterX - area.MaxX); if (range.CenterY < area.MinY) distance += (range.CenterY - area.MinY) * (range.CenterY - area.MinY); else if (range.CenterY > area.MaxY) distance += (range.CenterY - area.MaxY) * (range.CenterY - area.MaxY); return (distance < range.Radius * range.Radius); /* return //does not overlap the center point !( range.CenterX < area.MinX || range.CenterX > area.MaxX || range.CenterY < area.MinY || range.CenterY > area.MaxY ) || //distance from center to any corner is less than a radius ( (range.CenterX - area.MinX) * (range.CenterX - area.MinX) + (range.CenterY - area.MinY) * (range.CenterY - area.MinY) < range.Radius * range.Radius || (range.CenterX - area.MaxX) * (range.CenterX - area.MaxX) + (range.CenterY - area.MinY) * (range.CenterY - area.MinY) < range.Radius * range.Radius || (range.CenterX - area.MinX) * (range.CenterX - area.MinX) + (range.CenterY - area.MaxY) * (range.CenterY - area.MaxY) < range.Radius * range.Radius || (range.CenterX - area.MaxX) * (range.CenterX - area.MaxX) + (range.CenterY - area.MaxY) * (range.CenterY - area.MaxY) < range.Radius * range.Radius ) || //the box intersects the circle but no corner lies within the circle ( (range.CenterX > area.MinX && range.CenterX < area.MaxX && range.CenterY < area.MinY && area.MinY - range.CenterY < range.Radius) || (range.CenterX > area.MinX && range.CenterX < area.MaxX && range.CenterY > area.MaxY && range.CenterY - area.MaxY < range.Radius) || (range.CenterY > area.MinY && range.CenterY < area.MaxY && range.CenterX < area.MinX && area.MinX - range.CenterX < range.Radius) || (range.CenterY > area.MinY && range.CenterY < area.MaxY && range.CenterX > area.MaxX && range.CenterX - area.MaxX < range.Radius) );*/ }
protected virtual Single GetFutureSize(MinimumBoundingBox area1, MinimumBoundingBox area2) { MinimumBoundingBox futureMinimumBoundingBox = CombineMinimumBoundingBoxes(area1, area2); return (futureMinimumBoundingBox.MaxX - futureMinimumBoundingBox.MinX) * (futureMinimumBoundingBox.MaxX - futureMinimumBoundingBox.MinX) + (futureMinimumBoundingBox.MaxY - futureMinimumBoundingBox.MinY) * (futureMinimumBoundingBox.MaxY - futureMinimumBoundingBox.MinY); }
protected virtual Single GetDistance(Single x, Single y, MinimumBoundingBox area) { if (area.MaxX < x && area.MinY > y) return GetDistance(x, y, area.MaxX, area.MinY); else if (area.MinX > x && area.MinY > y) return GetDistance(x, y, area.MinX, area.MinY); else if (area.MaxX < x && area.MaxY < y) return GetDistance(x, y, area.MaxX, area.MaxY); else if (area.MinX > x && area.MaxY < y) return GetDistance(x, y, area.MinX, area.MaxY); else if (area.MaxX < x) return GetDistance(x, y, area.MaxX, y); else if (area.MinX > x) return GetDistance(x, y, area.MinX, y); else if (area.MaxY < y) return GetDistance(x, y, x, area.MaxY); else if (area.MinY > y) return GetDistance(x, y, x, area.MinY); else return 0; }
public LeafEntry(MinimumBoundingBox minimumBoundingBox, Address recordIdentifier) : base(minimumBoundingBox, recordIdentifier) { }
protected virtual IndexUnit PickNext(List<IndexUnit> entryPool, MinimumBoundingBox minimumBoundingBox1, MinimumBoundingBox minimumBoundingBox2) { IndexUnit nextEntry = entryPool[0]; Single maxEnlargementDifference = Math.Abs( GetFutureSize(nextEntry.ChildBoundingBox, minimumBoundingBox1) - GetFutureSize(nextEntry.ChildBoundingBox, minimumBoundingBox2)); foreach (IndexUnit entry in entryPool) { Single enlargmentDifference = Math.Abs( GetFutureSize(entry.ChildBoundingBox, minimumBoundingBox1) - GetFutureSize(entry.ChildBoundingBox, minimumBoundingBox2)); if (enlargmentDifference > maxEnlargementDifference) { maxEnlargementDifference = enlargmentDifference; nextEntry = entry; } } return nextEntry; }
public NodeEntry(MinimumBoundingBox minimumBoundingBox, Address child) { MinimumBoundingBox = minimumBoundingBox; Child = child; }
protected virtual Single GetOverlap(NodeEntry insertionEntry, MinimumBoundingBox overlapMinimumBoundingBox, Node node) { foreach (NodeEntry nodeEntry in node.NodeEntries) if (nodeEntry != insertionEntry) overlapMinimumBoundingBox = IntersectMinimumBoundingBoxes(overlapMinimumBoundingBox, nodeEntry.MinimumBoundingBox); return (overlapMinimumBoundingBox.MaxX - overlapMinimumBoundingBox.MinX) * (overlapMinimumBoundingBox.MaxY - overlapMinimumBoundingBox.MinY); }
protected virtual Single GetFutureSize(Record record, MinimumBoundingBox area) { return GetFutureSize(record.BoundingBox, area); }
protected virtual MinimumBoundingBox IntersectMinimumBoundingBoxes(MinimumBoundingBox area1, MinimumBoundingBox area2) { if (!Overlaps(area1, area2)) return new MinimumBoundingBox(0, 0, 0, 0); Single newMinX, newMaxX, newMinY, newMaxY; if (area1.MinX > area2.MinX) newMinX = area1.MinX; else newMinX = area2.MinX; if (area1.MaxX < area2.MaxX) newMaxX = area1.MaxX; else newMaxX = area2.MaxX; if (area1.MinY > area2.MinY) newMinY = area1.MinY; else newMinY = area2.MinY; if (area1.MaxY < area2.MaxY) newMaxY = area1.MaxY; else newMaxY = area2.MaxY; return new MinimumBoundingBox(newMinX, newMinY, newMaxX, newMaxY); }
public Record(Int32 recordID, MinimumBoundingBox minimumBoundingBox) { RecordID = recordID; Address = Address.NewAddress(); BoundingBox = minimumBoundingBox; }