solveElastic method

void solveElastic(
  1. TimeStep step
)

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