orderBestPatterns static method

void orderBestPatterns(
  1. List<ResultPoint> patterns
)

Orders an array of three ResultPoints in an order A,B,C such that AB is less than AC and BC is less than AC, and the angle between BC and BA is less than 180 degrees.

@param patterns array of three ResultPoint to order

Implementation

static void orderBestPatterns(List<ResultPoint> patterns) {
  // Find distances between pattern centers
  final zeroOneDistance = distance(patterns[0], patterns[1]);
  final oneTwoDistance = distance(patterns[1], patterns[2]);
  final zeroTwoDistance = distance(patterns[0], patterns[2]);

  ResultPoint pointA;
  ResultPoint pointB;
  ResultPoint pointC;
  // Assume one closest to other two is B; A and C will just be guesses at first
  if (oneTwoDistance >= zeroOneDistance &&
      oneTwoDistance >= zeroTwoDistance) {
    pointB = patterns[0];
    pointA = patterns[1];
    pointC = patterns[2];
  } else if (zeroTwoDistance >= oneTwoDistance &&
      zeroTwoDistance >= zeroOneDistance) {
    pointB = patterns[1];
    pointA = patterns[0];
    pointC = patterns[2];
  } else {
    pointB = patterns[2];
    pointA = patterns[0];
    pointC = patterns[1];
  }

  // Use cross product to figure out whether A and C are correct or flipped.
  // This asks whether BC x BA has a positive z component, which is the arrangement
  // we want for A, B, C. If it's negative, then we've got it flipped around and
  // should swap A and C.
  if (crossProductZ(pointA, pointB, pointC) < 0.0) {
    final temp = pointA;
    pointA = pointC;
    pointC = temp;
  }

  patterns[0] = pointA;
  patterns[1] = pointB;
  patterns[2] = pointC;
}