call method
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);
}
}
}
}