示例#1
0
        /// <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();
        }
示例#2
0
            /// <summary>
            ///
            /// </summary>
            private void UpdateGrid(double radius)
            {
                if (_grid == null)
                {
                    _grid = new HashGrid3d <V>(_verts.Count);
                }

                _grid.Scale = radius * _radiusToGridScale;
            }
示例#3
0
 /// <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;
     }
 }
示例#4
0
 /// <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);
            }
        }
示例#6
0
        /// <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);
            }
        }
示例#7
0
 /// <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));
 }
示例#8
0
 /// <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));
 }
示例#9
0
 /// <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));
 }