alignPair function

Alignment alignPair(
  1. Float64List a,
  2. Float64List b, {
  3. bool closedA = false,
  4. bool closedB = false,
})

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