Start a curve with four arbitrary points:

(Subscript[p, 1]) ={{(Subscript[x, 1])},{(Subscript[y, 1])},{1}};
(Subscript[p, 2]) ={{(Subscript[x, 2])},{(Subscript[y, 2])},{1}};
(Subscript[p, 3]) ={{(Subscript[x, 3])},{(Subscript[y, 3])},{1}};
(Subscript[p, 4]) ={{(Subscript[x, 4])},{(Subscript[y, 4])},{1}};

[1] Translate the curve to (0, 0):

(Subscript[T, 1])={{1,0,-(Subscript[x, 1])}, {0,1,-(Subscript[y, 1])}, {0,0,1}};
(Subscript[u, 1])=(Subscript[T, 1]).(Subscript[p, 1]);
(Subscript[u, 2])=(Subscript[T, 1]).(Subscript[p, 2]);
(Subscript[u, 3])=(Subscript[T, 1]).(Subscript[p, 3]);
(Subscript[u, 4])=(Subscript[T, 1]).(Subscript[p, 4]);

[2] X-Shear curve to align point 2 with x = 0:

(Subscript[shear, x])= -(((Subscript[u, 2])[[1,1]])/((Subscript[u, 2])[[2,1]]));
(Subscript[T, 2])={{1,(Subscript[shear, x]),0},{0,1,0},{0,0,1}};
(Subscript[v, 1])=(Subscript[T, 2]).(Subscript[u, 1]);
(Subscript[v, 2])=(Subscript[T, 2]).(Subscript[u, 2]);
(Subscript[v, 3])=(Subscript[T, 2]).(Subscript[u, 3]);
(Subscript[v, 4])=(Subscript[T, 2]).(Subscript[u, 4]);

[3] Scale coordinates to boundaries (0, 0)--(s, s):

(Subscript[scale, x])=(s/((Subscript[v, 3])[[1,1]]));
(Subscript[scale, y])=(s/((Subscript[v, 2])[[2,1]]));
(Subscript[T, 3])={{(Subscript[scale, x]),0,0},{0,(Subscript[scale, y]),0},{0,0,1}};
(Subscript[w, 1])=(Subscript[T, 3]).(Subscript[v, 1]);
(Subscript[w, 2])=(Subscript[T, 3]).(Subscript[v, 2]);
(Subscript[w, 3])=(Subscript[T, 3]).(Subscript[v, 3]);(Subscript[w, 4])=(Subscript[T, 3]).(Subscript[v, 4]);

[4] Y-Shear so that point 3 lines up with (1,1):

(Subscript[shear, y]) =((s - (Subscript[w, 3])[[2,1]])/((Subscript[w, 3])[[1,1]]));
(Subscript[T, 4])={{1,0,0}, {(Subscript[shear, y]),1,0},{0,0,1}};
(Subscript[f, 1])=(Subscript[T, 4]).(Subscript[w, 1]);
(Subscript[f, 2])=(Subscript[T, 4]).(Subscript[w, 2]);
(Subscript[f, 3])=(Subscript[T, 4]).(Subscript[w, 3]);(Subscript[f, 4])=(Subscript[T, 4]).(Subscript[w, 4]);

[5] Points 1, 2, and 3 now lie on (0,0), (0,1), and (1,1) respectively. Our only free coordinate now lies on:

(Subscript[mapped, x])=(Subscript[f, 4])[[1,1]]

(Subscript[mapped, y])=(Subscript[f, 4])[[2,1]]

[6] Now, if we translate this free point by some (dx, dy) the original point 4 needs to be moved by some distance. We run the matrices in reverse:

h = Simplify[Inverse[(Subscript[T, 1])].Inverse[(Subscript[T, 2])].Inverse[(Subscript[T, 3])].Inverse[(Subscript[T, 4])].{{(Subscript[mapped, x])+dx}, {(Subscript[mapped, y])+dy},{1}} ];
(Subscript[moved, x]) = h[[1,1]]

(Subscript[moved, y]) = h[[2,1]]