【qt】坐标系变换

简介: 【qt】坐标系变换

一.物理坐标

物理坐标系,就是我们上节课说的,坐标的原点在窗口的左上角。这节课我们可以通过改变原点的位置来达到我们想姚的逻辑坐标。

二.逻辑坐标

1.平移

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(":/bg.png");
    QRect rect(0,0,200,150);
    painter.drawImage(rect,image);
    painter.translate(300,100);//将坐标系水平向右平移300,垂直向下平移100
    painter.drawImage(rect,image);
}

运行结果:

2.旋转

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(":/bg.png");
    QRect rect(0,0,200,150);
    //painter.drawImage(rect,image);
    painter.translate(300,100);//将坐标系水平向右平移300,垂直向下平移100
    painter.drawImage(rect,image);
    painter.rotate(90);//将坐标系顺时针旋转90
    painter.drawImage(rect,image);
}

运行结果:

3.扭转

shear的参数范围为0~1

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(":/bg.png");
    QRect rect(0,0,200,150);
    //painter.drawImage(rect,image);
    painter.translate(300,100);//将坐标系水平向右平移300,垂直向下平移100
    //painter.drawImage(rect,image);
    painter.shear(0.1,0.1);
    painter.drawImage(rect,image);
    }

运行结果:

4.缩放

scale的参数1为分解线,小于1缩小,大于1放大

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QImage image(":/bg.png");
    QRect rect(0,0,200,150);
    painter.drawImage(rect,image);
    painter.scale(2,2);
    painter.drawImage(rect,image);
    }

缩放前:

缩放后:

三.案例结合画一个五角星

正常画一个五角星是需要我们去找坐标的,而且比较难找,所以我们通过下面的方法进行绘画。

应该能看懂吧,数学知识,第一条在坐标系的五角星坐标是很容易的,后面的都是通过三角函数来得到的。

360°被分为5份,所以每个角的度数为360/5=72°。

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen;
    pen.setColor(Qt::red);
    pen.setWidth(4);
    painter.setPen(pen);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    qreal r=200;//qreal相当于double
    qreal unit=72*3.141592/180;//算的是72°的弧度值,因为cos和sin需要的是弧度
    QPoint points[5]={
        QPoint(r,0),
        QPoint(r*cos(unit),-r*sin(unit)),
        QPoint(r*cos(unit*2),-r*sin(unit*2)),
        QPoint(r*cos(unit*3),-r*sin(unit*3)),
        QPoint(r*cos(unit*4),-r*sin(unit*4))
    };
    QPainterPath path;
    path.moveTo(points[0]);//把笔放在那个点开始
    path.lineTo(points[2]);//画线到这个点
    path.lineTo(points[4]);
    path.lineTo(points[1]);
    path.lineTo(points[3]);
    path.closeSubpath();//第一个点和最后一个点相连
    QFont font;
    font.setPointSize(20);
    painter.setFont(font);
    //路径还可以加文字
    path.addText(points[0],font,"0");
    path.addText(points[1],font,"1");
    path.addText(points[2],font,"2");
    path.addText(points[3],font,"3");
    path.addText(points[4],font,"4");
    painter.drawPath(path);
    painter.save();//保存当前坐标系
    painter.translate(300,300);
    painter.rotate(-18);//向逆时针转18°
    painter.drawPath(path);
    painter.restore();//恢复到刚刚保存的坐标系
}

运行结果:

完美!

四.总结

当我们需要某些特殊的绘图的时候,我们可以换个角度,来对坐标系进行变换,可以会出现意想不到的好结果!

人生有两条路,一条需要用心走,叫做梦想;一条需要用脚走,叫做现实。心走得太快,会迷路;脚走得太快,会摔倒。愿你的人生不慌不忙,一路走得坦荡。

相关文章
|
算法 数据可视化 程序员
【Qt UI】调色板QPalette类在Qt编程中的应用
【Qt UI】调色板QPalette类在Qt编程中的应用
945 0
|
算法 Linux API
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
2997 0
|
编解码 监控
Zoom + OBS + B 站直播配置
Zoom + OBS + B 站直播配置
|
网络协议
【qt】TCP客户端如何断开连接?
【qt】TCP客户端如何断开连接?
293 0
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用"添加库"功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
707 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
C++ Windows
vs2019 This application failed to start because it could not find or load the QT platform plugin
这篇文章介绍了在VS2019中解决QT程序运行时出现的“无法找到或加载QT平台插件”错误的步骤,通过将必要的DLL文件和插件目录复制到项目解决方案中解决了问题。
|
缓存 数据安全/隐私保护 虚拟化
windows端口被占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?
项目运行时服务器8080端口被占用,常规`netstat`命令找不到占用进程。解决方法包括:1) 强制关机重启释放端口;2) 使用`netstat -anobq`或Windows 10的`Get-NetTCPConnection` PowerShell命令查找BOUND状态的进程;3) 调整Windows动态端口范围,避免冲突。注意,强制关机可能影响数据安全。
5688 2
|
存储 安全 编译器
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
【C++ 包装器类 std::function 和 函数适配器 std::bind】 C++11 全面的std::function和std::bind的入门使用教程
692 0