Penso di aver trovato una soluzione, che calcola la matrice di trasformazione passo dopo passo.
// some example points:
QPointF p1(1.0, 2.0);
QPointF p2(2.0, 2.5);
QPointF p3(1.5, 4.0);
QPointF p4(3.0, 5.0);
// define the affine transformation which will position p1, p2, p3 correctly:
QTransform trans;
trans.translate(p1.x(), p1.y());
trans.scale(p2.x() - p1.x(), p3.y() - p1.y());
trans.shear((p3.x() - p1.x())/trans.m11(), (p2.y() - p1.y())/trans.m22());
Fino ad ora, trans descrive una trasformazione in parallelogramma. All'interno di questo paralellogramma, trovo p4 (relativamente) nel prossimo passo. Penso che questo possa essere fatto usando una formula diretta che non implichi un'inversione di trans.
// relative position of the 4th point in the transformed coordinate system:
qreal px = trans.inverted().map(p4).x();
qreal py = trans.inverted().map(p4).y();
// this defines the perspective distortion:
qreal y = 1 + (py - 1)/px;
qreal x = 1 + (px - 1)/py;
I valori x
e y
sono difficili da spiegare. Dato solo uno di questi (l'altro è impostato su 1
), questo definisce solo il ridimensionamento relativo di p4
. Ma una combinazione di entrambe le trasformazioni prospettiche xey, il significato di xey sono difficili; Ho trovato le formule per tentativi ed errori.
// and thus the perspective matrix:
QTransform persp(1/y, 0, 1/y-1,
0, 1/x, 1/x-1,
0, 0, 1);
// premultiply the perspective matrix to the affine transformation:
trans = persp * trans;
Alcuni test hanno dimostrato che questo porta ai risultati corretti. Tuttavia, non ho testato casi speciali come quelli in cui due punti sono uguali o uno di questi è nel segmento di linea tra gli altri due; Penso che questa soluzione potrebbe rompersi in tali situazioni.
Pertanto, ancora ricerca di alcune formule dirette per valori della matrice m11
, m12
... m33
, dato il punto di coordinate p1.x()
, p1.y()
... p4.x()
, p4.y()
.
Nota: attualmente sto cercando di risolvere il problema. Comincio con p1 (che è il punto in alto a sinistra mappato (0,0)): quindi uso solo una matrice di traduzione. p2 e p3 possono essere raggiunti utilizzando una matrice di ridimensionamento e taglio. Ma ho problemi a raggiungere p4: non capisco la matematica dietro la trasformazione prospettica e quindi non so come il numero delle voci della matrice nella terza colonna influenzi la trasformazione. – leemes