【问题标题】:Create QTransform given 4 points defining the transformed unit square创建 QTransform 给定 4 个点定义变换的单位正方形
【发布时间】:2012-07-16 21:27:19
【问题描述】:

给出4分是结果

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

如何找到QTransform transform? (更好的是:也给定一个任意源矩形)

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

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

【问题讨论】:

  • 注意:我目前正在尝试解决问题。我从 p1 开始(这是映射的左上点 (0,0)):因此我只使用一个平移矩阵。 p2 和 p3 可以通过使用缩放和剪切矩阵来达到。但是我在到达 p4 时遇到了问题:我不了解透视变换背后的数学,因此不知道第三列中矩阵条目的数量如何影响变换。

标签: qt math geometry perspective coordinate-transformation


【解决方案1】:

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

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

【讨论】:

  • 再次,非常感谢。该死的,我所有的数学工作都是徒劳的...... :)
【解决方案2】:

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

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

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()p1.y() ... p4.x() , p4.y().

【讨论】:

  • 你不能使用QTransform.squareToQuad吗?
  • 啊啊啊,非常感谢@dmd,当然,这正是我想要的。我没有足够的 RTFM,或者更好地说,函数的名称完全不是我对这样一个完全符合我想要的功能的预期!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2016-05-14
  • 2023-03-22
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多