solveElastic method
Implementation
void solveElastic(TimeStep step) {
final elasticStrength = step.invDt * this.elasticStrength;
for (final triad in triadBuffer) {
if ((triad.flags & ParticleType.elasticParticle) != 0) {
final particleA = triad.particleA;
final particleB = triad.particleB;
final particleC = triad.particleC;
final oa = triad.pa;
final ob = triad.pb;
final oc = triad.pc;
final pa = particleA.position;
final pb = particleB.position;
final pc = particleC.position;
final px = 1.0 / 3 * (pa.x + pb.x + pc.x);
final py = 1.0 / 3 * (pa.y + pb.y + pc.y);
var rs = oa.cross(pa) + ob.cross(pb) + oc.cross(pc);
var rc = oa.dot(pa) + ob.dot(pb) + oc.dot(pc);
final r2 = rs * rs + rc * rc;
final invR = r2 == 0 ? double.maxFinite : sqrt(1.0 / r2);
rs *= invR;
rc *= invR;
final strength = elasticStrength * triad.strength;
final roax = rc * oa.x - rs * oa.y;
final roay = rs * oa.x + rc * oa.y;
final robx = rc * ob.x - rs * ob.y;
final roby = rs * ob.x + rc * ob.y;
final rocx = rc * oc.x - rs * oc.y;
final rocy = rs * oc.x + rc * oc.y;
final va = particleA.velocity;
final vb = particleB.velocity;
final vc = particleC.velocity;
va.x += strength * (roax - (pa.x - px));
va.y += strength * (roay - (pa.y - py));
vb.x += strength * (robx - (pb.x - px));
vb.y += strength * (roby - (pb.y - py));
vc.x += strength * (rocx - (pc.x - px));
vc.y += strength * (rocy - (pc.y - py));
}
}
}