sampleGrid method

  1. @override
BitMatrix sampleGrid(
  1. BitMatrix image,
  2. int dimensionX,
  3. int dimensionY,
  4. PerspectiveTransform transform,
)
override

Implementation

@override
BitMatrix sampleGrid(
  BitMatrix image,
  int dimensionX,
  int dimensionY,
  PerspectiveTransform transform,
) {
  if (dimensionX <= 0 || dimensionY <= 0) {
    throw NotFoundException.instance;
  }
  final bits = BitMatrix(dimensionX, dimensionY);
  final points = List.filled(2 * dimensionX, 0.0);
  for (int y = 0; y < dimensionY; y++) {
    final max = points.length;
    final iValue = y + 0.5;
    for (int x = 0; x < max; x += 2) {
      points[x] = (x / 2) + 0.5;
      points[x + 1] = iValue;
    }
    transform.transformPoints(points);
    // Quick check to see if points transformed to something inside the image;
    // sufficient to check the endpoints
    GridSampler.checkAndNudgePoints(image, points);
    try {
      for (int x = 0; x < max; x += 2) {
        if (image.get(points[x].toInt(), points[x + 1].toInt())) {
          // Black(-ish) pixel
          bits.set(x ~/ 2, y);
        }
      }
    } on RangeError catch (_) {
      // on ArrayIndexOutOfBoundsException

      // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting
      // transform gets "twisted" such that it maps a straight line of points to a set of points
      // whose endpoints are in bounds, but others are not. There is probably some mathematical
      // way to detect this about the transformation that I don't know yet.
      // This results in an ugly runtime exception despite our clever checks above -- can't have
      // that. We could check each point's coordinates but that feels duplicative. We settle for
      // catching and wrapping ArrayIndexOutOfBoundsException.
      throw NotFoundException.instance;
    }
  }
  return bits;
}