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