原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。
由于各种原因,可能存在诸多不足,欢迎斧正!
一、实验课题
1.基本几何变换:平移、比例、旋转、对称和错切等;2.直线段的裁剪;
3. 多边形的裁剪。
二、设计思想
1.基本几何变换
基本几何变换:平移、比例、旋转、对称和错切等都是对应点的矩阵变换。
2.Liang-Barsky 直线段的裁剪
推导
直线的参数方程:
x=x1+u(x2 - x1)
y=y1+u(y2 - y1)
其中, 0 ≤ u ≤ 1
对于直线上一点( x, y ) , 若它在窗口内则有 :
wxl ≤ x1+u(x2 - x1) ≤ wxr
wyb ≤ y1+u(y2 - y1) ≤ wyt
这样有:
u(x1 - x2) ≤ x1 - wxl ; u(x2 - x1) ≤ wxr - x1
u(y1 - y2) ≤ y1 - wyb ; u(y2 - y1) ≤ wyt - y1
令:
p1= - (x2 - x1) ; q1=x1 - wxl
p2=x2 - x1 ; q2=wxr - x1
p3= - (y2 - y1) ; q3=y1 - wyb
p4=y2 - y1 ; q4=wyt - y1
则有: u*pk ≤ qk
2. 对于特殊位置直线的处理
(1) 当直线与窗口边界 wxl 和 wxr 平行时:
p3= - (y2 - y1) ; q3=y1 - wyb
p4=y2 - y1 ; q4=wyt - y1
求出参数值: u3=q3/p3 , u4=q4/p4 , uA= 0 , uB= 1 。则有:
umax=max(0, uk|pk<0)
umin=min(uk|pk>0, 1)
(2) 当直线与窗口边界 wyb 和 wyt 平行时:
p1= - (x2 - x1) ; q1=x1 - wxl
p2=x2 - x1 ; q2=wxr - x1
求出参数值: u1=q1/p1 , u2=q2/p2 , uA= 0 , uB= 1 。则有:
umax=max(0, uk|pk<0)
umin=min(uk|pk>0, 1)
(3) 一般情况
算法步骤
(1) 输入直线段的两端点坐标: (x1, y1) 和 (x2, y2) ,以及窗口的四条边界坐标: wyt 、 wyb 、 wxl 和 wxr 。
(2) 若 Δx=0 ,则 p1=p2=0 。此时进一步判断是否满足 q1<0 或 q2<0 ,若满足,则该直线段不在窗口内,算法转 (7) 。否则,满足 q1>0 且 q2>0 ,则进一步计算 u1 和 u2 。算法转 (5) 。
(3) 若 Δy=0 ,则 p3=p4=0 。此时进一步判断是否满足 q3<0 或 q4<0 ,若满足,则该直线段不在窗口内,算法转 (7) 。否则,满足 q1>0 且 q2>0 ,则进一步计算 u1 和 u2 。算法转 (5) 。
(4) 若上述两条均不满足,则有 pk≠0 ( k=1,2,3,4 )。此时计算 u1 和 u2 。
(5) 求得 u1 和 u2 后,进行判断:若 u1>u2 ,则直线段在窗口外,算法转 (7) 。若 u1<u2 ,利用直线的参数方程求得直线段在窗口内的两端点坐标。
(6) 利用直线的扫描转换算法绘制在窗口内的直线段。
(7) 算法结束。
3.Weiler-Atherton 多边形裁剪
假定按顺时针方向处理顶点,且将用户多边形定义为 Ps ,窗口矩形为 Pw 。算法从 Ps 的任一点出发,跟踪检测 Ps 的每一条边,当 Ps 与 Pw 相交时(实交点),按如下规则处理:
(1) 若是由不可见侧进入可见侧,则输出可见直线段,转 (3) ;
(2) 若是由可见侧进入不可见侧,则从当前交点开始,沿窗口边界顺时针检测 Pw 的边,即用窗口的有效边界去裁剪 Ps 的边,找到 Ps 与 Pw 最靠近当前交点的另一交点,输出可见直线段和由当前交点到另一交点之间窗口边界上的线段,然后返回处理的当前交点;
(3) 沿着 Ps 处理各条边,直到处理完 Ps 的每一条边,回到起点为止。
三、实验特色
1.基本几何变换: 实现了 平移、比例、旋转、对称和错切等5 种变换,可以用菜单来响应用户指令 ;并给人以动态的效果,每一种变换都变动20 次,适当延缓 。
2.直线段的裁剪:任意直线用任意用户窗口来裁剪,其中直线、用户窗口由鼠标来响应;裁剪过程清晰可见。
3. 多边形的裁剪:任意多边形的裁剪任意窗口的裁剪,其中多边形、用户窗口由鼠标来响应,裁剪过程清晰可见。
.基本几何变换截图
Liang-Barsky直线段的裁剪截图
Weiler-Atherton多边形裁剪截图
具体代码见着这网址 http://download.csdn.net/detail/xj2419174554/6596371。
欢迎交流!