# 基于 MFC 和二维变换的画图软件
## 摘 要
本文描述了二维复合变换的基本方法和思想,根据鼠标位置坐标获取起始点 pStart 和终止点 pEnd 的坐标,设计实现每个基本图形的画图方法,根据 pStart 和 pEnd 即可确定基本图形的控制点,进而绘制对应图形。规范化齐次坐标以后,图形几何变换可以表示为图形控制点点集合的规范化齐次坐标矩阵与二维变换矩阵相乘的形式,分别设置二维变换矩阵的参数信息,设计实现对应的方法,即可实现图形的二维变换功能。
## 设 计
“基于二维复合变换的动画制作软件”的设计中包括以下几个部分:(1) 程序结构设计,(2)鼠标消息映射,(3) 图形绘制实现,(4) 图形变换,(5)动画扩展实现,(6)信息保存,(7)程序交互设计。
## 1 程序总体结构
### 1.1 总体结构设计
#### 1.1.1 绘图设计
基本图形包括点,直线,曲线,自由画笔,矩形,圆形,椭圆,三角形,左箭头,上箭头,五角星,四角形,五边形共 12 钟类型,每个基本图形都有自己的编号,用户在选择基本图形后,被选择图形的编号信息保存到 dstyle 变量中,绘图模块即可根据 dstyle 中的编号绘制相应的图形。图形大小,位置信息由全局变量 pStart 和 pEnd 控制,pStart 和 pEnd 分别为用户在窗口内拖动鼠标时的起点坐标和终点坐标。根据两个坐标确定一个矩形,按照比例,设置相应的控制点,再根据控制点即可绘制相应图形。绘图流程图见图 1.1。
#### 1.1.2 变换设计
图形变换包括图形移动,图形旋转,图形放缩。绘图模块绘制图形结束后,会将 pStart,pEnd,style 等基本信息存入图表中。例如,选择旋转类型后,执行对应函数,将图表中所有图形的位置信息修改,再执行重绘函数,按照点表内容依次重绘变换之后的图形,即可实现图形的旋转变换。变换流程图见图 1.2。
[![](https://www.writebug.com/myres/static/uploads/2021/11/22/82ed2213f9d7336c6aaa750977384e71.writebug)](https://cdn.jsdelivr.net/gh/Justlovesmile/CDN2/post/20200619203701.png)
图 1.1 绘图流程图
[![](https://www.writebug.com/myres/static/uploads/2021/11/22/44e74498afd6f6c10218e85b43a1bf49.writebug)](https://cdn.jsdelivr.net/gh/Justlovesmile/CDN2/post/20200619203702.png)
图 1.2 变换流程图
## 2 程序实现
### 2.1 鼠标绘图的消息映射
为了实现基本图形的绘制和组合,需要在项目的视图 View 类中定义鼠标左键按下 OnLButtonDown,鼠标移动 OnMouseMove,以及鼠标左键抬起 OnLButtonUp 的消息映射,以实现拖动鼠标绘图功能。当鼠标左键按下时,设置一个变量为 true 保存绘图状态并且记录按下时的点,记为 pStart,只有当该变量为 true 时,鼠标移动时才会将绘图,当鼠标左键抬起时,该变量赋值为 false,并保存此时的点,记为 pEnd。
其中,在鼠标左键按下并移动时,使用橡皮筋技术,即移动过程中选用画笔颜色取反模式(SetROP2(R2_NOT)),即可消除移动过程中不断绘制的图形,在鼠标左键抬起时,设置画笔为颜色覆盖模式(SETROP2(R2_COPYPEN)),绘制最终的图形,并保存 pStart 点和 pEnd 点,以及笔的粗细,形状,颜色等其他信息。
### 2.2 图形绘制实现
#### 2.2.1 点
由于单个点的像素太小,不利于在图形绘制中使用与观察。这里使用了画一个微型填充圆的方法代替原始像素点。
#### 2.2.2 直线
从直线起的以下图形的绘制均为根据外接矩形绘制内部图形。绘制图形时,当点击鼠标左键时获取矩形起点,按住不放拖动鼠标直至放开左键,放开鼠标左键的位置记录为矩形的终点。直线的绘制则根据矩形起始点使用 MoveTo()和 LineTo()函数绘制。
#### 2.2.3 等腰和直角三角形
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。三角形包括 3 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据两种三角形在矩形中绘制时的对应比例,等腰三角形 3 个顶点坐标分别为:
P1 (pStart.x+pEnd.x)/2,pStart.y);
P2 (pStart.x,pEnd.y);
P3 (pEnd.x,pEnd.y);
直角三角形的三个顶点坐标为:
P1 (pStart.x,pStart.y);
P2 (pEnd.x,pEnd.y);
P3 (pStart.x,pEnd.y);
##### 2.2.4 矩形和填充矩形
在使用鼠标拉取的矩形中获取了起始点和终止点后用矩形函数实现。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。要绘制矩形由绘制矩形的函数实现 pdc->Rectangle(pStart.x , pStart.y , pEnd.x, pEnd.y)。绘制填充矩形则在绘制前使用画刷以填充内部。
#### 2.2.5 圆形和填充圆
在使用鼠标拉取的矩形中获取了起始点后。将两点间的距离作为要画圆的半径 r。使用绘制圆函数进行绘制 pdc->Ellipse(pStart.x-r,pStart.y-r , pStart.x+r , pStart.y+r)。绘制填充矩形则在绘制前使用画刷以填充内部。
#### 2.2.6 自由画笔
在鼠标左键按下,并且移动的过程中,通过不断触发 OnMouseMove 消息映射,在移动中的点的位置和上一个位置间连线,即可实现自由画笔功能。
#### 2.2.7 左箭头
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。左箭头包括 7 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据左箭头在矩形中绘制时的对应比例,7 个顶点坐标为:
P1 (pStart.x, pStart.y-dy/2);
P2 (pStart.x+dx/2),pStart.y);
P3 (pStart.x+dx/2), pStart.y-dy/4);
P4 (pEnd.x, pStart.y-dy/4);
P5 (pEnd.x, pStart.y-3*dy/4);
P6 (pStart.x+dx/2), pStart.y-3*dy/4);
P7 (pStart.x+dx/2),pEnd.y);
其中 dy=pStart.y-pEnd.y;dx= pEnd.x-pStart.x
#### 2.2.8 上箭头
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。上箭头包括 7 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据上箭头在矩形中绘制时的对应比例,7 个顶点坐标为:
P1 (pStart.x, pStart.y-dy0/2);
P2 ( (pStart.x+dx0/2,pStart.y);
P3 (pEnd.x, pStart.y-dy0/2);
P4 (pStart.x+3*dx0/4, pStart.y-dy0/2);
P5 (pStart.x+3*dx0/4,pEnd.y);
P6 (pStart.x+dx0/4,pEnd.y);
P7 (pStart.x+dx0/4, pStart.y-dy0/2);
其中 dy0=pStart.y-pEnd.y;dx0=pEnd.x-pStart.x
#### 2.2.9 五角星
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。五角星绘制包括 5 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据五角星在矩形中绘制时的对应比例,5 个顶点坐标为:
P1(pStart.x+pEnd.x)/2),pStart.y);
P2(pStart.x+RX*(sin(72*pi/180)cos(54*pi/180))/2/sin(72*pi/180)),pEnd.y);
P3(pEnd.x, pStart.y+RY*(1-cos(72*pi/180))/(1+sin(54*pi/180)));
P4(pStart.x, pStart.y+RY*(1-cos(72*pi/180))/(1+sin(54*pi/180)));
P5(pStart.x+RX*(sin(72*pi/180)+cos(54*pi/180))/2/sin(72*pi/180),pEnd.y);
其中 pi = 3.1415926;RX = -(pStart.x-pEnd.x);RY = -(pStart.y-pEnd.y);
#### 2.2.10 五边形
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。五边形包括 5 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据五边形在矩形中绘制时的对应比例,5 个顶点坐标为:
P1 (pStart.x+pEnd.x)/2,pStart.y);
P2 (pStart.x,(pEnd.y-pStart.y)*0.41+pStart.y);
P3 (pStart.x+(pEnd.x - pStart.x)*0.19,pEnd.y);
P4 (pStart.x+(pEnd.x - pStart.x)*0.81,pEnd.y);
P5 (pEnd.x, (pEnd.y-pStart.y)*0.41+pStart.y);
#### 2.2.11 四角星
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。四角星包括 8 个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据四角星在矩形中绘制时的�
没有合适的资源?快使用搜索试试~ 我知道了~
基于 C++ MFC 实现二维变换的画图软件【100010873】
共68个文件
h:12个
sbr:11个
cpp:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 66 浏览量
2023-02-21
11:12:29
上传
评论 2
收藏 28.97MB ZIP 举报
温馨提示
二维复合变换的基本方法和思想,根据鼠标位置坐标获取起始点pStart和终止点pEnd的坐标,设计实现每个基本图形的画图方法,根据pStart和pEnd即可确定基本图形的控制点,进而绘制对应图形。规范化齐次坐标以后,图形几何变换可以表示为图形控制点点集合的规范化齐次坐标矩阵与二维变换矩阵相乘的形式,分别设置二维变换矩阵的参数信息,设计实现对应的方法,即可实现图形的二维变换功能。
资源推荐
资源详情
资源评论
收起资源包目录
100010873-基于 C++ MFC 实现二维变换的画图软件.zip (68个子文件)
paint
Group4View.h 4KB
Transform .cpp 2KB
Mydiymove.cpp 2KB
如果项目打不开,解压这个文件
MFC-WORK.rar 23.43MB
Group4View.cpp 25KB
Transform.h 1KB
Group4Doc.h 1KB
Group4.rc 12KB
resource.h 2KB
LICENSE 1KB
movetype.cpp 1KB
MainFrm.cpp 3KB
IDD_Diymove.cpp 992B
Group4.dsw 489B
Group4Doc.cpp 2KB
res
Toolbar.bmp 14KB
Group4.rc2 385B
Group4Doc.ico 1KB
Group4.ico 1KB
P2.cpp 1KB
choosedig.h 1KB
MainFrm.h 1KB
Group4.opt 53KB
ReadMe.txt 4KB
Group4.aps 43KB
Group4.ncb 217KB
Group4.h 1KB
movetype.h 1KB
StdAfx.cpp 200B
choosedig.cpp 1KB
Group4.clw 4KB
Group4.plg 6KB
IDD_Diymove.h 1KB
Group4.dsp 5KB
Mydiymove.h 1KB
Debug
Group4.sbr 0B
Group4.obj 22KB
Group4.pch 7.06MB
Mydiymove.obj 16KB
movetype.sbr 0B
Mydiymove.sbr 0B
Group4.res 20KB
Group4Doc.sbr 0B
IDD_Diymove.sbr 0B
choosedig.sbr 0B
Transform .sbr 0B
Group4View.obj 107KB
IDD_Diymove.obj 10KB
P2.obj 20KB
vc60.pdb 412KB
Group4.bsc 5.17MB
StdAfx.obj 103KB
Group4.exe 176KB
Group4Doc.obj 36KB
StdAfx.sbr 1.32MB
P2.sbr 0B
MainFrm.sbr 0B
Transform .obj 16KB
MainFrm.obj 23KB
Group4.ilk 524KB
Group4.pdb 609KB
choosedig.obj 14KB
vc60.idb 249KB
Group4View.sbr 0B
StdAfx.h 1KB
README.md 16KB
P2.h 919B
Group4.cpp 4KB
共 68 条
- 1
神仙别闹
- 粉丝: 2687
- 资源: 7649
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页