alignPair function
Implementation
Alignment alignPair(Float64List a, Float64List b,
{bool closedA = false, bool closedB = false}) {
final centerA = centroid(a);
final centerB = centroid(b);
final varyA = closedA && !closedB;
final base = varyA ? a : b;
final offsets = closedA || closedB ? base.length ~/ 2 : 1;
var bestScore = double.infinity;
var best = base;
var bestSimilarity = const Similarity(0, 1, 0);
for (var direction = 0; direction < 2; direction++) {
final walk = direction == 0 ? base : reversePoints(base);
for (var offset = 0; offset < offsets; offset++) {
final candidate = offset == 0 ? walk : rotatePoints(walk, offset);
final similarity = varyA
? procrustes(candidate, b, centerA, centerB)
: procrustes(a, candidate, centerA, centerB);
final score = similarity.residual +
_rotationTieBreak * similarity.theta.abs() / math.pi;
if (score < bestScore) {
bestScore = score;
best = candidate;
bestSimilarity = similarity;
}
}
}
return Alignment(
centerA: centerA,
centerB: centerB,
a: varyA ? best : a,
b: varyA ? b : best,
theta: bestSimilarity.theta,
scale: bestSimilarity.scale,
residual: bestSimilarity.residual,
);
}