procrustes function
Similarity
procrustes(
- Float64List a,
- Float64List b,
- (double, double) centerA,
- (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);
}