Qt::绘制框架-变换-移动|缩放|旋转-QGraphicsItem-setPos

二维矢量动画智能制作软件开发合集

链接:软件开发技术分享及记录合集

个人开发二维矢量动画智能制作软件界面如下:


目录

变换

一、节点变换原理

二、移动变换实现

1.代码示例

2.示例效果

三、缩放变换实现

1.代码示例

2.示例效果

四、旋转变换实现

1.代码示例

2.示例效果

五、节点变换软件测试视频

结束语


变换

本篇介绍软件左侧工具栏→绘制工具→​​​​节点变换​​​

节点变换操作包括3种:1)移动;2)缩放;3)旋转。


一、节点变换原理

节点变换是改变【位置节点】的位置,对位置节点的(x,y)取值按照不同操作指令进行相应计算,操作指令有移动、缩放和旋转3类。为确定当前变换操作类型,首先计算节点集合的边界矩形,显示辅助框,根据鼠标与辅助框的相对位置,设定当前的变换操作指令,如下图所示:

不同的变换操作的计算原理不同,分别介绍如下:

① 移动变换原理:若鼠标在边界矩形内或放大矩形区域外,为移动操作。移动节点通过QGraphicsItem的moveBy函数实现(参数含义详见Qt官方文档),如果位置节点有曲率控制节点,则该位置节点的曲率控制节点与该位置节点的位移变化量保持一致。

② 缩放变换原理:若鼠标进入圆圈区域,即为缩放变换,并根据鼠标进入的具体圆圈确认缩放操作类型:1)鼠标进入左上、右上、左下和右下圆圈,节点集合可进行左右上下缩放;2)鼠标进入左中和右中圆圈,节点集合可进行左右缩放;3)鼠标进入上中和下中圆圈,节点集合可进行上下缩放。变换前,需要记录变换前边界矩形数据(QRectF类型);变换中,根据鼠标移动相对距离计算各个位置节点的相对位置。(特殊的,变换集合仅1个节点时,不可缩放。)

③ 旋转变换原理:若鼠标在边界矩形外和放大矩形区域内,为旋转操作。在变换前,需要记录变换前每个位置节点及其所有曲率节点对边界矩形center的相对距离和相对角度;变换中,根据鼠标相对边界矩形center的相对角度位移,分别计算位置节点及其曲率节点经过相对角度位移之后的位置。(特殊的,变换集合仅1个节点时,不可旋转。)

二、移动变换实现

1.代码示例

.h文件变量申明:

QList<QGraphicsItem *> PosItems,CurveItems;

QPointF startNodePos,endNodePos;

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    startNodePos = mouseEvent->scenePos();
    for(int i = 0; i < PosItems.length(); i++)
        PosItems[i]->moveBy(endNodePos.x() - startNodePos.x(),endNodePos.y() - startNodePos.y());
    for(int i = 0; i < CurveItems.length(); i++)
        CurveItems[i]->moveBy(endNodePos.x() - startNodePos.x(),endNodePos.y() - startNodePos.y()); 
    endNodePos = mouseEvent->scenePos();                  
}

2.示例效果

移动

三、缩放变换实现

1.代码示例

.h文件变量申明:

QList<QGraphicsItem *> PosItems;

QList<QPointF> OrginPos;

QPointF startNodePos,endNodePos;

qreal selItemsMinX,selItemsMaxX,selItemsMinY,selItemsMaxY;

qreal selItemsWidth,selItemsHeight,selItemsWidthNew,selItemsHeightNew;

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
     selItemsWidth = selItemsMaxX - selItemsMinX;
     selItemsHeight = selItemsMaxY - selItemsMinY;
     selItemsWidthNew = selItemsWidth - endNodePos.x() + startNodePos.x();
     selItemsHeightNew = selItemsHeight - endNodePos.y() + startNodePos.y();
     for(int i = 0 ; i < PosItems.length() ; i++)
     {
         QPointF pos(selItemsMaxX+(OrginPos[i].x()-selItemsMaxX)/selItemsWidth*selItemsWidthNew,selItemsMaxY+(OrginPos[i].y()-selItemsMaxY)/selItemsHeight*selItemsHeightNew);
         PosItems[i]->setPos(pos);
     }        
}

2.示例效果

缩放


四、旋转变换实现

1.代码示例

.h文件变量申明:

QList<QGraphicsItem *> PosItems;

QList<qreal> OrginR,OrginAngle;

QPointF startNodePos,endNodePos;

qreal selItemsCenterX,selItemsCenterY,deltaX,deltaY;

qreal angleMousePress,angleMouseMove,angleMouseDelta;

/*角度计算*/

qreal angleCal(qreal x,qreal y);

void Scene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    deltaX = endNodePos.x() - selItemsCenterX;
    deltaY = endNodePos.y() - selItemsCenterY;
    angleMouseMove = angleCal(deltaX, deltaY);
    angleMouseDelta = angleMousePress - angleMouseMove;
    for(int i = 0; i < PosItems.length() ; i++)
    {
        QPointF pos(selItemsCenterX + OrginR[i]*qCos(OrginAngle[i]-angleMouseDelta),selItemsCenterY + OrginR[i]*qSin(OrginAngle[i]-angleMouseDelta));
        PosItems[i]->setPos(pos);
    }           
}

2.示例效果

旋转

五、节点变换软件测试视频

变换-移动-缩放-旋转

​​​​​​​


结束语

本文简要梳理了软件节点变换【移动|缩放|旋转】的实现框架,内容均为原创。

作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。

若需,请联系本人小红书(小红书号:YzLab96),谢谢。

链接:  软件开发及测试所有视频合集见小红书

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值