Пример #1
0
        /// <summary>
        /// (1) Check for the specific primary particles if the position is valid: no overlap
        /// (2) Check if any other primary particle is in contact
        /// </summary>
        /// <param name="tree">neighborListTree</param>
        /// <param name="primaryParticle">primary particle of interest</param>
        /// <param name="otherPrimaryParticles">all other fixed primary particles</param>
        /// <param name="config"></param>
        /// <returns></returns>
        public (bool isInContact, bool hasNoOverlap) IsPrimaryParticlePositionValid(
            INeighborslist neighborslist,
            PrimaryParticle primaryParticle,
            IEnumerable <PrimaryParticle> otherPrimaryParticles)
        {
            //var neighbors = ParticleFormationUtil.GetPossibleNeighbors(primaryParticle, primaryParticle.Position, tree, otherPrimaryParticles, config);
            var searchRadius          = (primaryParticle.Radius + otherPrimaryParticles.GetMaxRadius()) * _config.Delta;
            var neighborsWithDistance = neighborslist.GetPrimaryParticlesAndDistanceWithinRadius(primaryParticle.Position, searchRadius);

            if (!neighborsWithDistance.Any())
            {
                return(isInContact : false, hasNoOverlap : true);
            }

            return(ParticleFormationUtil.IsAnyNeighborInContactOrOverlapping(primaryParticle, primaryParticle.Position, _config, neighborsWithDistance));
        }
Пример #2
0
        /// <summary>
        /// A primary particle positon is valid if:
        /// (1) there is at least 1 contact with other primary particles
        /// (2) there are no overlaps.
        /// </summary>
        /// <param name="particle"></param>
        /// <param name="rndPosition"></param>
        /// <param name="tree"></param>
        /// <param name="primaryParticles"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public bool IsPrimaryParticlePositionValid(
            PrimaryParticle particle,
            Vector3 rndPosition,
            INeighborslist neighborslist,
            IEnumerable <PrimaryParticle> primaryParticles,
            IAggregateFormationConfig config)
        {
            // Get all neighbors within potential reach of the primary particle
            var searchRadius          = (particle.Radius + primaryParticles.GetMaxRadius()) * config.Delta;
            var neighborsWithDistance = neighborslist.GetPrimaryParticlesAndDistanceWithinRadius(rndPosition, searchRadius);

            // no neighbor: invalid position
            if (!neighborsWithDistance.Any())
            {
                return(false);
            }
            return(IsAnyNeighborPositionValid(particle, rndPosition, config, neighborsWithDistance));
        }
        private bool IsRandomLocationInPore(double[] vLim, double[] hLim, INeighborslist neighborsList, double maxRadius)
        {
            var randomLoc = GetRandomLocation(vLim, hLim);

            var neighbors = neighborsList.GetPrimaryParticlesAndDistanceWithinRadius(randomLoc, maxRadius);

            if (!neighbors.Any())
            {
                return(true);
            }
            else
            {
                // if the distance is smaller than radius: particle hit
                if (neighbors.Count(n => n.Item2 < n.Item1.Radius) > 0)
                {
                    return(false);
                }

                // no neighboring particle is closer than its radius
                return(true);
            }
        }
        private static int GetPrimaryParticleOverlaps(PrimaryParticle primaryParticle, IParticleFilm <Aggregate> particleFilm, INeighborslist neighborslist, bool highlightPrimaryParticle)
        {
            var neighbors = neighborslist.GetPrimaryParticlesAndDistanceWithinRadius(primaryParticle.Position, primaryParticle.Radius + particleFilm.PrimaryParticles.GetMaxRadius());
            var count     = 0;

            foreach (var neigh in neighbors)
            {
                if (primaryParticle == neigh.Item1)
                {
                    continue;
                }
                if (primaryParticle.Radius + neigh.Item1.Radius - neigh.Item2 > 1e-6)
                {
                    count++;
                    if (highlightPrimaryParticle)
                    {
                        primaryParticle.Type = 2;
                    }
                }
            }
            return(count);
        }