call method

  1. @override
void call(
  1. Particle particleA,
  2. Particle particleB,
  3. Particle particleC
)
override

Implementation

@override
void call(Particle particleA, Particle particleB, Particle particleC) {
  final callParticles = [particleA, particleB, particleC];
  bool hasCallParticle(ParticleGroup group) {
    return group.particles.any(callParticles.contains);
  }

  // Create a triad if it will contain particles from both groups.
  if (hasCallParticle(groupA) && hasCallParticle(groupB)) {
    final af = particleA.flags;
    final bf = particleB.flags;
    final cf = particleC.flags;
    if ((af & bf & cf & ParticleSystem.triadFlags) != 0) {
      final pa = particleA.position;
      final pb = particleB.position;
      final pc = particleC.position;
      final dabx = pa.x - pb.x;
      final daby = pa.y - pb.y;
      final dbcx = pb.x - pc.x;
      final dbcy = pb.y - pc.y;
      final dcax = pc.x - pa.x;
      final dcay = pc.y - pa.y;
      final maxDistanceSquared =
          settings.maxTriadDistanceSquared * system.squaredDiameter;
      if (dabx * dabx + daby * daby < maxDistanceSquared &&
          dbcx * dbcx + dbcy * dbcy < maxDistanceSquared &&
          dcax * dcax + dcay * dcay < maxDistanceSquared) {
        final midPointX = 1.0 / 3.0 * (pa.x + pb.x + pc.x);
        final midPointY = 1.0 / 3.0 * (pa.y + pb.y + pc.y);
        final triad = PsTriad(particleA, particleB, particleC)
          ..flags = af | bf | cf
          ..strength = min(groupA.strength, groupB.strength)
          ..pa.x = pa.x - midPointX
          ..pa.y = pa.y - midPointY
          ..pb.x = pb.x - midPointX
          ..pb.y = pb.y - midPointY
          ..pc.x = pc.x - midPointX
          ..pc.y = pc.y - midPointY
          ..ka = -(dcax * dabx + dcay * daby)
          ..kb = -(dabx * dbcx + daby * dbcy)
          ..kc = -(dbcx * dcax + dbcy * dcay)
          ..s = pa.cross(pb) + pb.cross(pc) + pc.cross(pa);
        system.triadBuffer.add(triad);
      }
    }
  }
}