在定义变换单位正方形的4个点上创建QTransform

在定义变换单位正方形的4个点上创建QTransform,qt,math,geometry,perspective,coordinate-transformation,Qt,Math,Geometry,Perspective,Coordinate Transformation,给出4分是由于 QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1)); 如何找到QTransform transform?(更好:还提供了任意源矩形) 动机:假设要在透视扭曲的坐标系中绘制图像的四个角点,如何使用QPaint绘制图像 这是一个说明GIMP中问题的屏幕截图,在GIMP中,可以通过围绕层的4个角移动来变换层。这将导致透视图转换。我想在Qt应用程序中完全执行相同的操作。我知道QTransform不仅限于仿射变换,还可以

给出4分是由于

QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));
如何找到
QTransform transform
?(更好:还提供了任意源矩形)

动机:假设要在透视扭曲的坐标系中绘制图像的四个角点,如何使用QPaint绘制图像


这是一个说明GIMP中问题的屏幕截图,在GIMP中,可以通过围绕层的4个角移动来变换层。这将导致透视图转换。我想在Qt应用程序中完全执行相同的操作。我知道QTransform不仅限于仿射变换,还可以处理透视变换。

我想我找到了一个解决方案,它一步一步地计算变换矩阵

// 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
的相对比例。但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()

您应该能够使用
QTransform.squartoquad
来完成此操作。只需将要转换到的
QPolygonF
传递给它即可


有时,我在让SquartoQuad做我想做的事情时遇到一些问题,不得不使用
QTTransform.quadToQuad
来定义我自己的起始quad,但你可能会更幸运。

注意:我目前正在尝试解决这个问题。我从p1开始(它是映射的左上角点(0,0)):因此我只使用一个平移矩阵。p2和p3可以通过使用缩放和剪切矩阵来实现。但我在达到p4时遇到了问题:我不理解透视变换背后的数学,因此不知道第三列中矩阵项的数量如何影响变换。你难道不能使用QTransform.SquartoQuad吗?啊,非常感谢@dmd,这当然正是我要找的。我没有足够的RTFM,或者更好地说,函数的名称完全不是我所期望的那样一个函数,它正是我想要的!再次感谢大家。该死,我所有的数学工作都是徒劳的…:)