public bool Contains(Particle p) { return(PA.GetHashCode() == p.GetHashCode() || PB.GetHashCode() == p.GetHashCode()); }
public bool Contains(Particle p) { return (PA.GetHashCode() == p.GetHashCode() || PB.GetHashCode() == p.GetHashCode()); }
private void CalculateElasticity(float deltaTime) { float sqDist; for (int i = 0; i < Particles.Count; i++) { Particle pa = Particles[i]; if (Particles.CountNearBy(pa) <= 1) { continue; } _tempParticles = Particles.GetNearby(pa); int len2 = _tempParticles.Count; if (len2 > MaxNeighbors) { len2 = MaxNeighbors; } for (int j = 0; j < len2; j++) { Particle pb = Particles[j]; Vector2.DistanceSquared(ref pa.Position, ref pb.Position, out sqDist); if (sqDist > RestLengthSquared) { continue; } if (pa.GetHashCode() == pb.GetHashCode()) { continue; } if (!_springPresenceTable[pa.GetHashCode()].Contains(pb.GetHashCode())) { _springs.Add(new Spring2(pa, pb, RestLength)); _springPresenceTable[pa.GetHashCode()].Add(pb.GetHashCode()); } } } for (int i = _springs.Count - 1; i >= 0; i--) { Spring2 spring = _springs[i]; spring.Update(); // Stretch if (spring.CurrentDistance > (spring.RestLength + DeformationFactor)) { spring.RestLength += deltaTime * Plasticity * (spring.CurrentDistance - spring.RestLength - (YieldRatioStretch * spring.RestLength)); } // Compress else if (spring.CurrentDistance < (spring.RestLength - DeformationFactor)) { spring.RestLength -= deltaTime * Plasticity * (spring.RestLength - (YieldRatioCompress * spring.RestLength) - spring.CurrentDistance); } // Remove springs with restLength longer than REST_LENGTH if (spring.RestLength > RestLength) { _springs.RemoveAt(i); _springPresenceTable[spring.PA.GetHashCode()].Remove(spring.PB.GetHashCode()); } else { if (spring.CurrentDistance == 0) { continue; } Vector2.Subtract(ref spring.PB.Position, ref spring.PA.Position, out _rij); _rij /= spring.CurrentDistance; float D = deltaTime * KSpring * (spring.RestLength - spring.CurrentDistance); _rij *= (D * 0.5f); spring.PA.Position = new Vector2(spring.PA.Position.X - _rij.X, spring.PA.Position.Y - _rij.Y); spring.PB.Position = new Vector2(spring.PB.Position.X + _rij.X, spring.PB.Position.Y + _rij.Y); } } }