computePerspectiveTransform static method

Matrix4 computePerspectiveTransform(
  1. DocumentCorners corners,
  2. Size targetSize
)

Calculates perspective transformation matrix to flatten quadrilateral into rectangle.

Implementation

static Matrix4 computePerspectiveTransform(DocumentCorners corners, Size targetSize) {
  final src = corners.toList();

  final dx1 = src[1].dx - src[2].dx;
  final dx2 = src[3].dx - src[2].dx;
  final dx3 = src[0].dx - src[1].dx + src[2].dx - src[3].dx;
  final dy1 = src[1].dy - src[2].dy;
  final dy2 = src[3].dy - src[2].dy;
  final dy3 = src[0].dy - src[1].dy + src[2].dy - src[3].dy;

  final det = dx1 * dy2 - dx2 * dy1;
  final g = (det != 0) ? (dx3 * dy2 - dx2 * dy3) / det : 0.0;
  final h = (det != 0) ? (dx1 * dy3 - dx3 * dy1) / det : 0.0;

  final a = src[1].dx - src[0].dx + g * src[1].dx;
  final b = src[3].dx - src[0].dx + h * src[3].dx;
  final c = src[0].dx;
  final d = src[1].dy - src[0].dy + g * src[1].dy;
  final e = src[3].dy - src[0].dy + h * src[3].dy;
  final f = src[0].dy;

  return Matrix4(
    a, d, 0, g,
    b, e, 0, h,
    0, 0, 1, 0,
    c, f, 0, 1,
  );
}