Qt 坐标 平移

使用坐标画点线方式画一个五角星,再通过平移复制、旋转、 缩放画出第二个五角星,再复位、平移复制、旋转得到第三个五角星。

目录

坐标系

画第一个五角星

初始化数据

生成五个坐标数据,逆时针依次为

设置字体

设置画笔

画布路径

以五角星的顺序,画点和线

每个点标记

 画出第一个五角星

平移、缩放、旋转

 

复位

总结、理解:


坐标系

右为正,左为负,下为正,上为负

画第一个五角星

画布

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);

初始化数据

根据坐标系,右为正,左为负,下为正,上为负,所以y轴取负数

qreal R=100;//半径
    const qreal Pi=3.14159;
    qreal deg= Pi*72/180;

    QPoint points[5]={
        QPoint(R,0),
        QPoint(R*qCos(deg), -R*qSin(deg)),
        QPoint(R*qCos(2*deg),-R*qSin(2*deg)),
        QPoint(R*qCos(3*deg),-R*qSin(3*deg)),
        QPoint(R*qCos(4*deg),-R*qSin(4*deg))
    };

生成五个坐标数据,逆时针依次为

(100,0)
(30.9018,-95.1056)
(-80.9016,-58.7787)
(-80.9019,58.7783)
(30.9013,95.1058)

设置字体

    QFont font;
    font.setPointSize(14);
    painter.setFont(font);

设置画笔

QPen pen;
    pen.setWidth(2);
    pen.setColor(Qt::blue);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);

画布路径

QPainterPath startPath;

以五角星的顺序,画点和线

    startPath.moveTo(points[0]);
    startPath.lineTo(points[2]);
    // this->drawArrowPoint(painter,startPath,points[0],points[2],10);
    startPath.lineTo(points[4]);
    // this->drawArrowPoint(painter,startPath,points[2],points[4],10);
    startPath.lineTo(points[1]);
    // this->drawArrowPoint(painter,startPath,points[4],points[1],10);
    startPath.lineTo(points[3]);
    // this->drawArrowPoint(painter,startPath,points[1],points[3],10);
    startPath.lineTo(points[0]);

每个点标记

    startPath.addText(points[0],font,"1");
    startPath.addText(points[1],font,"2");
    startPath.addText(points[2],font,"3");
    startPath.addText(points[3],font,"4");
    startPath.addText(points[4],font,"5");

 画出第一个五角星

    painter.save();//保存坐标状态
    painter.translate(100,120);
    painter.drawPath(startPath);//画星星
    painter.drawText(0,0,"S1");
    painter.restore();

平移、缩放、旋转

第二个五角星:通过第一个五角星平移,缩放,旋转得到

    painter.translate(300,120);
    painter.scale(0.8,0.8);
    painter.rotate(90);//顺时针旋转
    painter.drawPath(startPath);//画星星
    painter.drawText(0,0,"S2");

 

复位

第三个星星:通过撤销旋转、撤销缩放、撤销平移,再逆时针旋转145°

    painter.resetTransform();//复位所有坐标变换
    painter.translate(500,120);//平移
    painter.rotate(-145);//逆时针旋转
    painter.drawPath(startPath);//画星星
    painter.drawText(0,0,"S3");

总结、理解:

1. 坐标系跟常规习惯不同,上面为负,诧异了好一会

2. translate的方法,类似复制,不是单纯的移动,所以理解为复制平移

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

castlooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值