创建QTransform,给定4个点,定义变换后的单位平方

时间:2012-07-16 21:27:20

标签: qt math geometry perspective coordinate-transformation

鉴于4分是

的结果
QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));

如何找到QTransform transform? (甚至更好:还有一个任意的源矩形)

动机:考虑到在透视扭曲的坐标系中绘制图像的四个角点,如何使用QPainter绘制图像?

Illustration of the problem

这是一个屏幕截图,说明了GIMP中的问题,可以通过在图层的4个角周围移动来转换图层。这导致透视变换。我想在Qt应用程序中做同样的事情。我知道QTransform不仅限于仿射变换,还可以处理透视变换。

2 个答案:

答案 0 :(得分:2)

您应该可以使用QTransform.squareToQuad执行此操作。只需将要转换为的QPolygonF传递给。

我有时会遇到一些问题让squareToQuad做我想做的事情,并且不得不使用QTransform.quadToQuad来定义我自己的起始四边形,但你可能会有更多的运气。

答案 1 :(得分:1)

我想我找到了一个解决方案,它逐步计算转换矩阵。

// 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;

xy很难解释。仅给出其中一个(另一个设置为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;

一些测试显示这导致了正确的结果。但是,我没有测试特殊情况,例如两点相等的情况,或者其中一个在两个点之间的线段上;我认为这种解决方案在这种情况下可能会破裂。

因此,我仍在搜索矩阵值m11m12 ... m33的一些直接公式,给定点坐标p1.x(),{ {1}} ... p1.y()p4.x()