直线段的起点和终点确定,圆弧由圆弧的圆心、起点和终点确定等。所以对图元的旋转、平移等集合变换可以归结为对图元控制点的几何变换。控制点的几何变换完成以后,根据变换后的控制点绘图,就可得到变换后的图元。
二维空间中一点变换前后的关系可用下式表示:
t11t12
[x′y′1]=[xy1]t21t22
ΔxΔy
其中,[xy]为变换前点的坐标,[x′y′]为变换后的坐标。
t11t12
T=t21t22变换矩阵。
ΔxΔy
用齐次坐标表示,上式可以写成:
x′=xt11+yt21+Δx
y′=yt12+yt22+Δy
(1)平移变换
平移变换是把选中的图元平移到另一位置,如图2-1所示。
Y
P(x,y)
○
○p′(x′,y′)
X
图2-1平移变换图示
平移变换的变换矩阵为100
T=010
ΔxΔy1
所以有
100
[x′y′1]=[xy1]010
ΔxΔy1
既x′=x+Δx
y′=y+Δy
其中,x,y为评议前点的坐标;x′,y′为平移后点的坐标,Δx和Δy为点在x方向和y方向上平移的距离。
(2)旋转变换
旋转变换使图元绕某点旋转一定角度后,到达新位置,如图2-2所示。逆时针旋转时,旋转角度为正,反之为负。
Y
P(x,y)
○
○p′(x′,y′)
θ
X
图2-2旋转变换
cosθsinθ0
饶原点旋转的变换矩阵为T=-sinθcosθ0
001
所以有
cosθsinθ0
[x′y′1]=[xy1]T=-sinθcosθ0
001
即x′=xcosθ-ysinθ
y′=xsinθ+ycosθ
2.点的变换
图元的变换可以归结为点的变换,首先在position类中添加点的变换函数。
(1)平移变换
移动后点的坐标值等于移动前点的坐标值与位移矢量的和。在position类中添加pntmove函数,该函数有两个参数xx和yy,分别定义移动矢量的水平向分量和垂直向分量。在直角坐标系中,当xx或yy为正时,点向右、向上移动;当xx或yy为负时,点向左、向下移动。函数返回一个position类实例,为移动后的点。
(2)旋转变换
旋转一个点需要确定两个参数,既旋转的参照点和旋转的角度。参照点指的是饶哪个点旋转。在position类中添加pntrotate函数,定义点的旋转行为。Pntrotate函数有两个参数,即basepos和angle分别定义旋转参照点和旋转角度。旋转后点的坐标可以根据原理部分的计算公式获得。,
3.图元的变换
☆直线段的几何变换
(1)直线段的平移变换
直线段的平移变换实际上是对直线段的起点和终点作平移变换,然后将变换后的起点和终点用直线段相连接。在cline类模块中添加CGElement_Move过程,定义直线段的平移变换。该函数有两个参数,即basepos和despos,分别定义平移前后的相对位置。平移前直线段上任一点到basepos点的距离和方向与平移后直线段上对应点到despos点的距离和方向是相同的。两个点横坐标之间和纵坐标之间的差异分别表示横向和纵向移动的距离和方向。
(2)直线段的旋转变换
通过旋转直线段的起点和终点,可以实现直线段的旋转。在cline类模块中添加CGElement_Rotate过程,该过程的两个参数basepos和angle分别定义旋转的基点和角度。
☆多义线的几何变换
(1)多义线的平移变换
多义线的平移变换可通过平移多义线的顶点来实现。在cpolyline类模块中添加CGElement_Move过程,以描述多义线的平移变换。
(2)多义线的旋转变换
在cpolyline类模块中添加CGElement_Rotate过程,通过对多义线的顶点进行旋转变换来实现多义线的旋转变换。
☆圆的几何变换
(1)圆的平移变换
圆的平移动变换通过对圆的圆心和圆上一点进行平移变换类实现。在ccircle类模块中添加CGElement_Move函数,描述圆的平移变换。
(2)圆的旋转变换
在ccircle类模块中添加CGElement_Rotate过程,通过对圆心和圆上一点进行旋转变换来实现圆的旋转变换。
☆圆弧的几何变换
(1)圆弧的平移变换
在carc类模块中添加CGElement_Move过程,实现圆弧的平移变换。
(2)圆弧的旋转变换
在carc类模块中添加CGElement_Rotate过程,对圆弧的圆心、起点和终点进行旋转变换。
4.图形变换交互功能的实现
☆平移变换-CMOVE类
平移变换的交互过程通过CMOVE类来实现。该类利用鼠标单击和移动事件代码来描述各种图元进行平移变换时的交互过程。该类实现了Ccommand接口。
下图是直线的平移结果。
☆旋转变换
通过创建CRotate类来进行描述。通过响应鼠标单击和移动事件来用图形显示图元旋转的基点和角度。
下图是直线的旋转结果
☆删除图元
包括内存删除和屏幕删除两部分。
4.3图元的拾取与选择
要实现上面的图元的编辑首先要实现图元的拾取功能。
图元的拾取是指计算机识别图元的方法。图元的选择是把已经识别的图元单独保存,以备修改和编辑。
1.包围矩形的计算
包围矩形指能包围图元的最小矩形。
(1)直线段的包围矩形
直线段的包围矩形是以直线段的起点和终点为对角顶点的矩形。
为了提高拾取效率,通常要将直线段的包围矩形向外扩展一定的距离如上图。
(2)多义线的包围矩形
多义线的包围矩形由多义线的顶点坐标决定。以所有顶点中最小的横坐标和最小的纵坐标所确定的点与最大的横坐标与最大的纵坐标所确定的点为对角顶点的矩形为多义线的包围矩形。
(3)圆的包围矩形
圆的包围矩形为正方形,是圆的外切矩形。包围矩形的左下角坐标和右上角坐标由圆心坐标和圆的半径确定。左下角坐标为圆心坐标减去圆半径,右上角坐标为圆心坐标加上圆半径。
(4)圆弧的包围矩形
圆弧的包围矩形是包围圆弧的最小矩阵。计算圆弧的包围矩形,需要计算圆弧与过圆心的坐标轴4个方向上的相交关系。因为圆弧与坐标轴正向或负向的交点坐标在数值上代表了这个方向上的最大值。如果相交,则包围矩形在这个方向上的值便是该值。如果不相交,包围矩形在这个方向上的最大值就是圆弧起点和终点x、y坐标的最大值。
圆弧与4个轴的相交关系可以通过比较可能的交点与圆弧之间的关系得到。如果圆弧所在的圆与4个坐标轴的交点在圆弧内,则对应的交点便是圆弧与4个坐标轴的交点,否则不是。
(5)文本的包围矩形
要获取文本的包围矩形,需要知道文本的宽度和高度,以及文本插入点的位置。包围矩形左下角的横坐标为插入点的横坐标,纵坐标为插入点的纵坐标减去文本的高度;右上角的横坐标为插入点的横坐标加上文本的宽度,纵坐标为插入点的纵坐标。
2.图元的拾取
(1)直线段的拾取
如果拾取点落在直线段的包围矩形内,则进一步判断拾取点与直线段之间的距离。如果小于指定的容限值,则该直线段被拾取。
(2)多义线的拾取
如果组成对义线的任何一条直线段被拾取到,则多义线被拾取到。在Cline类中添加CGElement_pick方法。
(3)圆的拾取
以圆的圆心为圆心,以圆的半径加减ΔR长度为半径,得到一个包围圆的环带。如果鼠标点落在该环内,则圆被拾取。圆拾取的实质是计算拾取点到圆心的距离。
(4)圆弧的拾取
圆弧的拾取分两步。首先判断圆弧所在的圆是否被拾取。如果没有被拾取,则圆弧不被拾取;如果圆已经被拾取,则继续判断拾取点是否落在圆弧的范围内。如果落在圆弧范围内,则圆弧被拾取,否则不被拾取。
(5)文本的拾取
拾取标注文本,首先要判断拾取点是否落在文本的包围矩形中,如果在,则文本拾取。
3.图元的选择
(1)添加选择集
为了存储选中的图元,需要添加图元的选择集。
(2)逐个选择图元
单击某图元时,如果该图元被拾取,把它添加到相应的集合类进行保存,则
上一篇:
VB班级管理系统vb+access源代码+可执行程序+论文+开题报告+外文翻译+答辩ppt(论文和程序)
下一篇:
科研管理杂志简介