Пример #1
0
        bool ISpaceManager.TryFindSpacePoints <T>(Space <T> space, out HashSet <SpacePoint <T> > points, params float[] dimensionPositions)
        {
            MustBe.Equal(space.Dimensions.Length, dimensionPositions.Length, () => "space.Dimensions.Length AND dimensionPositions.Length");

            points = new HashSet <SpacePoint <T> >();
            for (var d = 0; d < space.Dimensions.Length; ++d)
            {
                DimensionPoint <T> left;
                DimensionPoint <T> right;
                if (!_spaceManager.TryFindDimensionPoint(space.Dimensions[d], dimensionPositions[d], out left, out right))
                {
                    return(false);
                }
                if (left != null)
                {
                    foreach (var sp in left.SpaPoints)
                    {
                        if (sp.IsLocatedAt(dimensionPositions))
                        {
                            points.Add(sp);
                        }
                    }
                }
            }
            return(true);
        }
Пример #2
0
        IEnumerable <SpacePoint <T> > ISpaceManager.FindSpacePointsWithin <T>(Space <T> space, float within, IDimensionSelector dimSelector, params float[] dimensionPositions)
        {
            MustBe.Equal(space.Dimensions.Length, dimensionPositions.Length, () => "space.Dimensions.Length AND dimensionPositions.Length");

            var spacePoints   = new HashSet <SpacePoint <T> >();
            var tempDimPoints = new HashSet <DimensionPoint <T> >();

            for (var d = 0; d < space.Dimensions.Length; ++d)
            {
                if (dimSelector != null && !dimSelector.IncludesDimension(d))
                {
                    continue;
                }

                DimensionPoint <T> left;
                DimensionPoint <T> right;
                var dCenter = dimensionPositions[d];
                _spaceManager.TryFindDimensionPoint(space.Dimensions[d], dCenter, out left, out right);
                var curr = left;
                if (curr != null && !tempDimPoints.Contains(curr))
                {
                    foreach (var sp in EnumerateSpacePoints(curr, spacePoints, tempDimPoints, within, dimSelector, dimensionPositions))
                    {
                        yield return(sp);
                    }
                    var prev = curr.HeadLink.Prev;
                    while (prev != null && !tempDimPoints.Contains(prev.DimPoint) && (prev.Position - dCenter).Abs() <= within)
                    {
                        foreach (var sp in EnumerateSpacePoints(prev.DimPoint, spacePoints, tempDimPoints, within, dimSelector, dimensionPositions))
                        {
                            yield return(sp);
                        }
                    }
                }
                curr = right;
                if (curr != null && !tempDimPoints.Contains(curr))
                {
                    foreach (var sp in EnumerateSpacePoints(curr, spacePoints, tempDimPoints, within, dimSelector, dimensionPositions))
                    {
                        yield return(sp);
                    }
                    var next = curr.HeadLink.Next;
                    while (next != null && !tempDimPoints.Contains(next.DimPoint) && (next.Position - dCenter).Abs() <= within)
                    {
                        foreach (var sp in EnumerateSpacePoints(next.DimPoint, spacePoints, tempDimPoints, within, dimSelector, dimensionPositions))
                        {
                            yield return(sp);
                        }
                    }
                }
            }
        }
Пример #3
0
        bool ISpaceManager.Reposition <T>(SpacePoint <T> sp, params float[] dimensionPositions)
        {
            MustBe.Equal(sp.Dimensions.Length, dimensionPositions.Length, () => "space.Dimensions.Length AND dimensionPositions.Length");
            byte r = 0;

            for (var d = 0; d < sp.Dimensions.Length; ++d)
            {
                if (_spaceManager.Reposition(sp.Dimensions[d].Dimension, sp, dimensionPositions[d]))
                {
                    ++r;
                }
            }
            return(r > 0);
        }
Пример #4
0
        bool ISpaceManager.Reposition <T>(SpacePoint <T> sp, float x, float y, float z)
        {
            MustBe.Equal(sp.Dimensions.Length, 3, () => "space.Dimensions.Length AND x,y,z");
            byte r = 0;

            if (_spaceManager.Reposition(sp.Dimensions[0].Dimension, sp, x))
            {
                ++r;
            }
            if (_spaceManager.Reposition(sp.Dimensions[1].Dimension, sp, y))
            {
                ++r;
            }
            if (_spaceManager.Reposition(sp.Dimensions[2].Dimension, sp, z))
            {
                ++r;
            }
            return(r > 0);
        }
Пример #5
0
        SpacePoint <T> ISpaceManager.AddPoint <T>(Space <T> space, T data, params float[] dimensionPositions)
        {
            MustBe.NotNull(space, () => "space");
            MustBe.NotNull(dimensionPositions, () => "dimensionPositions");
            MustBe.Equal(dimensionPositions.Length, space.Dimensions.Length, () => "number of dimensions does not match the number of dimension positions passed when adding point to space");

            var sp = new SpacePoint <T>(space)
            {
                Value = data
            };

            if (dimensionPositions == null)
            {
                throw new ArgumentException("Expected dimension positions");
            }

            for (var i = 0; i < space.Dimensions.Length; ++i)
            {
                _spaceManager.AddPoint(space.Dimensions[i], sp, dimensionPositions[i]);
            }

            return(sp);
        }
Пример #6
0
        bool ISpaceManager.AddPoint <T>(Dimension <T> dimension, SpacePoint <T> sp, float position)
        {
            if (dimension == null || sp == null)
            {
                return(false);
            }

            MustBe.Null(sp.Dimensions[dimension.Index], () => "space point already has assigned the dimension with index=" + dimension.Index);

            if (dimension.HeadDimPoint == null)
            {
                var dp = new DimensionPoint <T>(dimension)
                {
                    Position = position
                };
                dp.HeadLink = dp.TailLink = new DimensionLink <T>(0, dp);
                dp.AddPoint(sp);
                dimension.HeadDimPoint = dimension.TailDimPoint = dp;
                dimension.Count        = 1;
                return(true);
            }

            // try to find existing dimension point
            DimensionPoint <T> left;
            DimensionPoint <T> right;

            if (_spaceManager.TryFindDimensionPoint(dimension, position, out left, out right))
            {
                // if found add the space point to it
                return(left.AddPoint(sp));
            }
            // new head
            if (left == null)
            {
                AppendNewHead(dimension, sp, position);
                dimension.Count++;
                return(true);
            }
            // new tail
            if (right == null)
            {
                AppendNewTail(dimension, sp, position);
                dimension.Count++;
                return(true);
            }

            // new in between
            var newPoint = new DimensionPoint <T>(dimension)
            {
                Position = position
            };

            newPoint.AddPoint(sp);
            var newLink = new DimensionLink <T>(0, newPoint);

            newPoint.HeadLink = newLink;
            newPoint.TailLink = newLink;

            left.HeadLink.AssignNext(newLink);
            newLink.AssignNext(right.HeadLink);

            // for fast movers do not normalize the tree
            if (!sp.IsFastMover)
            {
                _spaceManager.TryAddLevel(dimension);
                var toExtendUp = newLink.GetSiblingExtensionCandidate();
                while (_spaceManager.TryExtendUp(toExtendUp, out toExtendUp))
                {
                    _spaceManager.TryAddLevel(dimension);
                }
            }
            dimension.Count++;
            return(true);
        }