sampleGrid method
BitMatrix
sampleGrid(
- BitMatrix image,
- int dimensionX,
- int dimensionY,
- 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;
}