/// <inheritdoc /> protected override void Calculate(ReadOnlyArrayView <Body> bodies, ReadOnlyArrayView <int> indices, ArrayView <Vector3d> deltas) { if (_grid == null) { _grid = new HashGrid3d <Vector3d>(indices.Count); } // update grid _grid.Scale = Radius * _radiusToGridScale; // insert body positions for (int i = 0; i < indices.Count; i++) { var p = bodies[indices[i]].Position.Current; _grid.Insert(p, p); } // search from each body position if (_parallel) { ForEach(Partitioner.Create(0, indices.Count), range => { var i = range.Item1; var n = range.Item2 - i; CalculateImpl(bodies, indices.Subview(i, n), deltas.Subview(i, n)); }); } else { CalculateImpl(bodies, indices, deltas); } _grid.Clear(); }
/// <summary> /// /// </summary> private void UpdateGrid(double radius) { if (_grid == null) { _grid = new HashGrid3d <V>(_verts.Count); } _grid.Scale = radius * _radiusToGridScale; }
/// <summary> /// /// </summary> /// <param name="particles"></param> private void UpdateGrid(IReadOnlyList <IBody> particles) { if (_grid == null) { _grid = new HashGrid3d <H>(Radius * RadiusToHashScale, Handles.Count); } else { _grid.Scale = Radius * RadiusToHashScale; } }
/// <summary> /// /// </summary> private void UpdateGrid(double radius) { if (_grid == null) { _grid = new HashGrid3d <V>(radius * RadiusToHashScale, _verts.Count); } else { _grid.Scale = radius * RadiusToHashScale; } }
/// <summary> /// /// </summary> /// <param name="particles"></param> private void UpdateGrid(IReadOnlyList <IBody> particles) { if (_grid == null) { _grid = new HashGrid3d <H>((int)(particles.Count * _targetLoadFactor), Radius * RadiusToBinScale); return; } _grid.BinScale = Radius * RadiusToBinScale; int targCount = (int)(particles.Count * _targetLoadFactor); if (_grid.BinCount < (targCount >> 1)) { _grid.Resize(targCount); } }
/// <summary> /// /// </summary> private void UpdateGrid(double radius) { if (_grid == null) { _grid = new HashGrid3d <V>((int)(_verts.Count * _targetLoadFactor), radius * RadiusToBinScale); return; } _grid.BinScale = radius * RadiusToBinScale; int targCount = (int)(_verts.Count * _targetLoadFactor); if (_grid.BinCount < (targCount >> 1)) { _grid.Resize(targCount); } }
/// <summary> /// For each point in A, returns the index of all coincident points in B. /// </summary> /// <param name="pointsA"></param> /// <param name="pointsB"></param> /// <param name="tolerance"></param> /// <param name="grid"></param> /// <returns></returns> public static IEnumerable <IEnumerable <int> > GetAllCoincident(this IReadOnlyList <Vec3d> pointsA, IReadOnlyList <Vec3d> pointsB, HashGrid3d <int> grid, double tolerance = SlurMath.ZeroTolerance) { return(DataUtil.GetAllCoincident(pointsA, pointsB, p => p, grid, tolerance)); }
/// <summary> /// /// </summary> /// <param name="points"></param> /// <param name="tolerance"></param> /// <param name="indexMap"></param> /// <param name="grid"></param> /// <returns></returns> public static List <Vec3d> RemoveCoincident(this IReadOnlyList <Vec3d> points, HashGrid3d <int> grid, out int[] indexMap, double tolerance = SlurMath.ZeroTolerance) { return(DataUtil.RemoveCoincident(points, p => p, grid, out indexMap, tolerance)); }
/// <summary> /// For each point in A, returns the index of the first coincident point in B. If no coincident point is found, -1 is returned. /// </summary> /// <param name="pointsA"></param> /// <param name="pointsB"></param> /// <param name="tolerance"></param> /// <param name="grid"></param> /// <returns></returns> public static IEnumerable <int> GetFirstCoincident(this IReadOnlyList <Vec3d> pointsA, IReadOnlyList <Vec3d> pointsB, HashGrid3d <int> grid, double tolerance = 1.0e-8) { return(DataUtil.GetFirstCoincident(pointsA, pointsB, p => p, grid, tolerance)); }