二维矢量动画智能制作软件开发合集
个人开发二维矢量动画智能制作软件界面如下:
目录
变换
本篇介绍软件左侧工具栏→绘制工具→节点变换
节点变换操作包括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),谢谢。