procrustes function

Similarity procrustes(
  1. Float64List a,
  2. Float64List b,
  3. (double, double) centerA,
  4. (double, double) centerB,
)

Implementation

Similarity procrustes(
  Float64List a,
  Float64List b,
  (double, double) centerA,
  (double, double) centerB,
) {
  var sxx = 0.0;
  var sxy = 0.0;
  var syx = 0.0;
  var syy = 0.0;
  var energyA = 0.0;
  var energyB = 0.0;
  for (var i = 0; i < a.length; i += 2) {
    final ax = a[i] - centerA.$1;
    final ay = a[i + 1] - centerA.$2;
    final bx = b[i] - centerB.$1;
    final by = b[i + 1] - centerB.$2;
    sxx += ax * bx;
    syy += ay * by;
    sxy += ax * by;
    syx += ay * bx;
    energyA += ax * ax + ay * ay;
    energyB += bx * bx + by * by;
  }
  final theta = math.atan2(sxy - syx, sxx + syy);
  final numerator =
      math.cos(theta) * (sxx + syy) + math.sin(theta) * (sxy - syx);
  var scale = energyA > 1e-12 ? numerator / energyA : 1.0;
  if (!(scale > 1e-6)) scale = 1e-6;
  final residualSquared =
      math.max(0, scale * scale * energyA - 2 * scale * numerator + energyB);
  final residual = energyB > 1e-12 ? math.sqrt(residualSquared / energyB) : 0.0;
  return Similarity(theta, scale, residual);
}