首页 > 编程知识 正文

三维坐标旋转变换三带六代,三维坐标绕原点旋转

时间:2023-05-03 20:22:08 阅读:136853 作者:594

与许多坐标系一样,QPainter的默认坐标原点[ 0,0 ]位于屏幕左上角,x轴正方向为水平右,y轴正方向为垂直下。 在此坐标系中,每个像素占用11的空间。 可以把这看作是坐标值。 其中的每个单元是一个像素。 这么说来,一个像素的中心实际上是“半像素坐标系”。 也就是说,像素(x,y )的中心位置实际上位于(x 0.5,y 0.5 )的位置。 因此,如果使用QPainter在100,100上绘制像素,则该像素的中心坐标为100.5,100.5。

这种微妙的差异在实用上,特别是在对坐标要求准确性的系统中很重要。 首先,只有在禁止抗锯齿(即默认状态)的情况下,才会有0.5像素的偏移。如果使用抗锯齿,则在绘制[ 100,100 ]位置的像素时,QPainter将显示[99.5,QPainter 和[ 100.5,100.5 ]四个位置绘制如果不需要此特性,则需要平移QPainter坐标系(0. 5,0.5 )。

绘制直线、矩形等图形时使用此特性。 下图显示了在没有抗锯齿技术的情况下,使用drawrect (2,2,6,5 )绘制矩形的示例。 对于“No Pen”,请注意矩形左上角的像素为(2,2 ),其中心位置为(2.5,2.5 )。 然后,请注意下面有不同的Pen值绘制样式。 当Pen的宽度为1时,实际绘制的矩形面积为7 x 6。 (图示来自cguiprogrammingwithqt 4,2nd edition ) )。

在存在抗锯齿的情况下,使用drawrect (2,2,6,5 )的效果如下(来自cguiprogrammingwithqt 4,2nd edition ) :

请注意,如上所述,通过平移QPainter坐标系来消除0.5像素的差异。 以下是使用Drawrect(2.5、2.5、6、5 )进行抗锯齿时绘制的矩形。 图来自cguiprogrammingwithqt 4,2nd edition )。

请比较与上图的不同。

在上面的QPainter默认坐标系中,QPainter提供了一种“视口”(viewport )窗口机制,用于绘制图形,而不管绘制设备的大小和分辨率如何。 视口和窗口紧密相连,通常是矩形的。 视口的大小由物理坐标决定,窗口由逻辑坐标决定。 我们使用QPainter进行绘制时,传递给QPainter的是逻辑坐标。 然后Qt的绘制机制使用坐标转换将逻辑坐标转换为物理坐标进行绘制。

视口和窗口的坐标通常是一致的。 例如,600 x 800小部件。 这是小部件、对话框、面板等。 默认情况下,视口和窗口为320 x 200矩形,原点位于0,0。 此时,视口和窗口的坐标相同。

请注意,QPainter提供了setWindow (和setViewport )函数,用于设置视口和窗口的矩形大小。 例如,在上面的320 x 200小部件中,可以通过设置原点在(-50,-50 )到(-50,-50 )中心的矩形窗口来使用

painter.setwindow(-50,- 50,100,100 );

这里,-50,-50表示原点,100,100表示窗的长度和宽度。 这里的“表示原点”是指逻辑坐标的(-50,-50 )与物理坐标的(0,0 )相对应。 “长度和宽度”表示逻辑坐标系中的长度为100,宽度为100,实际上物理坐标系的长度对应于320,宽度对应于200。

你可能已经发现了这样的优点。 我们可以随时改变窗口的范围,而不改变基础物理坐标系。 如上所述,这就是视口和窗口的作用。 “绘制与绘图设备的大小和分辨率无关的图形”如下图所示。 (图示根据cguiprogrammingwithqt 4,2nd edition ) )。

除了更改视口和窗口外,QPainter还提供了世界坐标系,您还可以变换图形。 不同之处在于视口和窗口实际上是两个坐标系下图形统一的表示,世界坐标系的变换是通过改变坐标系来平移、缩放、旋转、剪切图形。 为了便于理解,请查看以下示例。

语音构件:3360支付事件(qpaintevent * event ) )。

{

QPainter

Painter(this;

QFont

font (颜色)表示,

24 );

painter.setfont(font;

painter.Drawtext(50,

50、'你好,

世界! ();

快速变换

变换;

transform.rotate(45.0;

painter.setworldtransform;

painter.Drawtext(60,

60、'你好,

世界! ();

}

为了便于显示,我在这里用QFont换了字体。 QPainter的drawText ()函数提供绘制文本的功能。 有几种重载格式,创建并绘制其中之一的文本的坐标。 需要注意的是,这里的坐标是文字左下角的坐标(请特别注意。 许多绘图系统,例如Java2D,都以左上角为坐标点)。 执行结果如下所示。

使用QTransform进行了rotate变换。 这个变换是旋转的,顺时针旋转45度。 然后,我们使用这个变换设置了QPainter的世界坐标系,并注意到QPainter是一个状态机。 因此,此转换不会改变之前的状态。 因此,只有第二个Hello

世界! 我被旋转了。 准确地说,被旋转的是坐标系,不是这个文字! 请感受这两个说法的不同。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。