创建QTransform给定4个点,定义变换后的单位正方形
给定4分是由于
QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));
我怎样才能找到QTransform transform
? (更好:也给了一个任意的源矩形)
动机:给定要在透视失真坐标系中绘制图像的四个角点,如何使用QPainter绘制图像?
这是一张屏幕截图,演示了GIMP中的问题,其中可以通过在图层的四个角上移动来转换图层。 这导致了透视转换。 我想在Qt应用程序中完全一样。 我知道QTransform不仅限于仿射变换,还可以处理透视变换。
你应该可以用QTransform.squareToQuad
做到这QTransform.squareToQuad
。 只需将它传递QPolygonF
您想要转换的QPolygonF
即可。
我有时会遇到一些问题,让squareToQuad做我想做的事情,而不得不使用QTransform.quadToQuad
来定义我自己的起始四元组,但是您可能会有更多的运气。
我想我找到了一个解决方案,它逐步计算转换矩阵。
// 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描述了一个平行四边形变换。 在这个paralellogram中,我发现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
的相对缩放比例。 但是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;
一些测试表明,这导致了正确的结果。 但是,我没有测试过两点相等或者其中一个点在两个点之间的线段上的特殊情况; 我认为这种解决方案可能会在这种情况下破裂。
因此,在点坐标为p1.x()
, p1.y()
... p4.x()
, p4.y()
,我仍然搜索矩阵值m11
, m12
... m33
一些直接公式。 。
上一篇: Create QTransform given 4 points defining the transformed unit square