我想我找到了一个解决方案,它逐步计算转换矩阵。
// 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());
到目前为止,trans 描述了一个平行四边形变换。在这个平行四边形中,我在下一步中找到了 p4(相对)。我认为这可以使用不涉及反式反转的直接公式来完成。
// 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;
这些值x
很难y
解释。仅给定其中一个(另一个设置为1
),这定义了p4
only 的相对缩放。但是结合x和y的透视变换,x和y的含义都很难;我通过反复试验找到了公式。
// 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;
一些测试表明,这会导致正确的结果。但是,我没有测试两个点相等或其中一个点在另外两个点之间的线段上的特殊情况;我认为这种解决方案可能会在这种情况下中断。
因此,我仍然在给定点坐标, ... ,的情况下寻找矩阵值m11
, m12
...的一些直接公式。m33
p1.x()
p1.y()
p4.x()
p4.y()