コード例 #1
0
 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);
 }
コード例 #2
0
 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));
 }
コード例 #3
0
 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);
 }
コード例 #4
0
 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);
 }
コード例 #5
0
        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;
        }
コード例 #6
0
 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);
 }
コード例 #7
0
 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
 }
コード例 #8
0
        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)
                );*/
        }
コード例 #9
0
 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);
 }
コード例 #10
0
 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;
 }
コード例 #11
0
 public LeafEntry(MinimumBoundingBox minimumBoundingBox, Address recordIdentifier)
     : base(minimumBoundingBox, recordIdentifier)
 {
 }
コード例 #12
0
        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;
        }
コード例 #13
0
 public NodeEntry(MinimumBoundingBox minimumBoundingBox, Address child)
 {
     MinimumBoundingBox = minimumBoundingBox;
     Child = child;
 }
コード例 #14
0
 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);
 }
コード例 #15
0
 protected virtual Single GetFutureSize(Record record, MinimumBoundingBox area)
 {
     return GetFutureSize(record.BoundingBox, area);
 }
コード例 #16
0
 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);
 }
コード例 #17
0
 public Record(Int32 recordID, MinimumBoundingBox minimumBoundingBox)
 {
     RecordID = recordID;
     Address = Address.NewAddress();
     BoundingBox = minimumBoundingBox;
 }