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); }
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); } } } } }
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); }
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); }
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); }