目录
一、系统设计 1
1 综述 1
2 算法介绍 1
3 实现 5
4 成果展示 10
5 参考文献 11
二、系统实现 11
6 综述 11
7 环境说明 11
8 编译运行说明 12
9 操作说明 12
10 操作过程 13
一、系统设计
1 综述
本系统拟完成一个图形系统,对多种常见图形进行基本操作。
系统功能
1)二维图形的输入:可输入或全部清除不同颜色的直线、矩形、圆、椭圆、多边形、曲线、铅笔工具
2)二维图形的编辑:对于直线、矩形、圆、椭圆、多边形、曲线,可以通过鼠标拖拽标出的控制顶点来进行编辑
3)二维图形的剪裁:可通过拖拽编辑矩形的剪裁窗口对当前直线进行剪裁
4)二维图形的变换:在直线、矩形、圆、椭圆、多边形、曲线内部可通过鼠标拖拽进行平移,通过按钮进行左右旋转和翻转,以及缩放
5)二维图形的存储:可将图形存储在选择的路径下
6)三维模型的显示:可选择加载OFF文件,显示对应的三维模型,并通过鼠标拖动转换视角
2 算法介绍
系统包括的算法主要是二维图形的操作、三维模型的显示和用户操作的响应。
2.1 二维图形
2.1.1 基本图形
对于各种图形,虽然其具体的实现细节有所不同(主要体现在图形的绘制),但它们都有一些公共的属性和操作,比如计算图形的范围和中心点的位置,以及图形平移、旋转、缩放操作。这些属性和方法的算法是相同的。
图形范围
对于直线、矩形、圆、椭圆、多边形、曲线,遍历其控制点的值,获得minX、maxX、minY、maxY。上述图形绘制后形成的所有点,不会有点的x值不在[minX, maxX]或y值不在[minY, maxY]中。四个值可以确定图形的范围,同时用于边框的绘制。
中心点
中心点位置为(centerX, centerY),其中centerX = (minX + maxX) / 2,centerY = (minY + maxY) / 2。中心点可用做旋转、缩放的基准点。
平移
图形的绘制依赖于控制点,因此只要更新每个控制点的信息即可。在图形平移方法中,传入的参数为x轴方向移动距离的值tx和y轴方向移动距离的值ty。对于(x, y)经平移(tx, ty)向量后的坐标为(x + tx, y + ty)。
旋转
图形旋转传入的参数为角度数θ。控制点(x, y)顺时针旋转θ后,是以中心点(centerX, centerY)为基准的,坐标变为(centerX + (x - centerX) * cosθ - (y - centerY) * sinθ, centerY + (x - centerX) * sinθ + (y - centerY) * cosθ )。
缩放
图形缩放传入的参数为在x方向上缩放比例为sx、在y方向上缩放比例为sy。控制点(x, y) 在x方向上缩放比例为sx、在y方向上缩放比例为sy后,坐标变为(x * sx + centerX * (1 - sx), y * sy + centerY* (1 - sy))。
2.1.2 直线
对于直线,只需要确定两个顶点的坐标作为控制点。直线生成有DDA算法、中点画线算法和Bresenham算法。
线生成DDA算法
线生成的DDA算法,主要是在x和y中选择“变化得快”的方向,在这个方向上选取等距的一个个值,计算出每个值对应的另一方向的值。本文转载自http://www.biyezuopin.vip/onews.asp?id=14983介于x和y的值都是整数,因此每次的“增量”至少为1,计算得到的另一个值往往不是整数,是需要四舍五入的,同时后者也可能是不精确的。如果选择“变化得慢”的方向作为基准,则每次迭代,另一方向上的变化幅度就会大于1,可以想象这种算法下点会比较“稀疏”,不如“稠密”的点组成的线精密。
具体来说,当直线的斜率(m)的绝对值大于1时,就是所谓的y轴“变化得快”,选取y轴进行取样,当斜率绝对值小于1时则要选取x轴。或者在实现上,可以直接比较两个顶点x轴上和y轴上的差值的绝对值,在差值绝对值较大的方向上取样,计算差值较小的方向上的取值。确定方向后可以得到两个方向上每次取样的增量,结果应该是取样方向上增量为1,计算方向上增量为[-1, 1]之间的值(绝对值为min( |m|, |1/m|))。
MainWindow
0
0
700
500
MainWindow
0
0
31
31
...
:/icon/icon/open.png :/icon/icon/open.png
0
30
31
31
...
:/icon/icon/save.png :/icon/icon/save.png
60
0
31
31
...
:/icon/icon/narrow.png :/icon/icon/narrow.png
90
0
31
31
...
:/icon/icon/widen.png :/icon/icon/widen.png
120
0
31
31
...
:/icon/icon/move.png :/icon/icon/move.png
60
30
31
31
...
:/icon/icon/rotate.png :/icon/icon/rotate.png
90
30
31
31
...
:/icon/icon/cut.png :/icon/icon/cut.png
120
30
31
31
...
:/icon/icon/delete.png :/icon/icon/delete.png
220
0
31
31
...
:/icon/icon/line.png :/icon/icon/line.png
170
0
31
31
...
:/icon/icon/reset.png :/icon/icon/reset.png
170
30
31
31
...
:/icon/icon/pen.png :/icon/icon/pen.png
270
0
31
31
S
320
0
31
31
...
:/icon/icon/rect.png :/icon/icon/rect.png
220
30
31
31
...
:/icon/icon/circle.png :/icon/icon/circle.png
270
30
31
31
:/icon/icon/oval.png :/icon/icon/oval.png
320
30
31
31
...
:/icon/icon/poly.png :/icon/icon/poly.png
400
0
51
51
...
:/icon/icon/fill.png :/icon/icon/fill.png
0
0
701
461
480
0
101
23
3D Button
480
30
21
23
background-color: rgb(0, 0, 0);
color: rgb(0, 0, 0);
黑
500
30
21
23
color: rgb(255, 255, 255);
background-color: rgb(255, 255, 255);
白
520
30
21
23
color: rgb(255, 0, 0);
background-color: rgb(255, 0, 0);
红
540
30
21
23
color: rgb(0, 255, 0);
background-color: rgb(0, 255, 0);
绿
560
30
21
23
color: rgb(0, 0, 255);
background-color: rgb(0, 0, 255);
蓝
350
11
16
20
background-color: rgb(0, 0, 0);
250
41
16
20
background-color: rgb(0, 0, 0);
300
41
16
20
background-color: rgb(0, 0, 0);
label
openButton
saveButton
narrowButton
widenButton
moveButton
rotateButton
cutButton
clearButton
lineButton
resetButton
penButton
curveButton
rectButton
circleButton
ovalButton
polyButton
fillButton
threeDButton
blackPenButton
whitePenButton
redPenButton
greenPenButton
bluePenButton
fillRectButton
fillCircleButton
fillOvalButton
0
0
700
23
File
Edit
旋转
缩放
缩小
增大
TopToolBarArea
false
New File
Open File
Close All
Exit
平移
向右旋转90度
向左旋转90度
旋转180度
垂直翻转
水平翻转
25%
50%
75%
80%
150%
125%
200%
250%













