区域编码对提高编码效率直线裁剪效率有什么好处

直线裁剪C语言代码_文档库
文档库最新最全的文档下载
当前位置: & 直线裁剪C语言代码
直线裁剪C语言代码
实验三:直线段的裁剪
一、实验目的
熟练掌握二维图形中直线段的裁剪算法
能用一种算法对已知直线段进行裁剪
二、实验器材
三、实验内容
采用Sutherland_hodgeman算法对给定的直线段进行裁剪
四、实验步骤
1、了解算法思想
裁剪区每条边界将平面分为两个部分:可见区与不可见区。分别采用裁剪区域左、上、右、下边界对直线段进行裁剪,根据直线段两个端点与边界的位置关系可分四种:
①线段起点和终点都在不可见区,此时为线段的显然不可见,退出程序 ②线段起点在不可见区域、终点在可见区,此时保留交点和终端点
③线段起点在可见区域、终点在不可见区,此时可互换起点与终点,之后与2的情况一样
④线段起点在和终点都在可见区,此时保留起点和终端点
2、在C#环境下实现算法
程序中包括:①给定裁剪区域边界范围
②给定一直线段的两个端点坐标
③采用裁剪区域边界逐边对线段进行裁剪
④输出线段裁剪结果
1、上机报告
2、程序存盘上交
System.Collections.G
http://www.wendangku.net/doc/dd467429bcd126fff7050bd1.html ponentM
System.Windows.F
WindowsFormsApplication31
Form1 : Form
Word文档免费下载:直线的多边形裁剪及任意多边形互裁剪 - CSDN博客
直线的多边形裁剪及任意多边形互裁剪
&&基于编码技术的直线和多边形的裁剪
一、直线的多边形裁剪
陆国栋等[1]Cohen-Sutherland
Cohen-Sutherland
ABk yi&xi(xi,yi)yi&kxi+by=xABxi&0(xi,yi)yi&kxi+b
f=1f=-1f=0fi*fi+1&0fi*fi+1&0fi*fi+1=0
int f; //code
CTypedPtrList&CPtrList,poly_vertex*& poly;
poly_vertexfCodecPolypolypoly_vertex
fi*fi+1=0Vi-1fi-1*fi+1=1ViVi-1Vi+1Vifi-1*fi+1=-1Vi-1Vi+1Vifi-1*fi+1=0fi =0ViVi+1Vifi0Vi-1Vi+1Vi-1ViVi+1Vi
二、多边形的矩形裁剪
Sutherland-Hodgman
Suterland-Hodgman
Sutherland-Hodgman
Cohen-Sutherland
Cohen-Sutherland01
int code1;
bool valid;
vertex(const vertex& v)
code2 = v.code2;
vertex(int x, int y)
(0),code2(0),valid(false)
this-&x = x;
this-&y = y;
vertex& operator=(const vertex& v)
if (this == &v) return *this;
code1 = v.code1;
code2 = v.code2;
valid = v.valid;
bool operator&(const vertex& v)
if (x & v.x) return true;
if (x == v.x && y & v.y) return true;
return false;
list&vertex& V;
code1STLlist
Sutherland-Hodgman
&&&&&&&&&&& &&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
Sutherland-Hodgman
三、任意多边形的裁剪
sign1 * sign2 & 0
bool inters, used;
struct vertex *next, *next1, *next2;&&&
vertex *polygon;
struct out *next;
vertexnextnext1next2
vertexintersboolusedbool
四、实验感想
五、参考文献
本实验报告的原文及C++代码实现的源文件,请按下载!仅供参考!
本文已收录于以下专栏:
相关文章推荐
Sutherland-Hodgman算法
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974...
计算机图形学----直线与多边形的裁剪
       裁剪算法详解:在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之内,哪...
用链表方法实现:
int result[50][2] = { {10, 80},{70, 10},{80, 80},{9...
1.求直线段与圆的交点
(1)由线段端点P1(x1,y1)P2(x2,y2)得到线段所在直线的方程
               ...
在一个重写的View,主要绘制在View的OnDraw()方法中,
首先:先绘制出几个点,当然是任意多
最后一个点和第一个点闭合在一起之后,画点结束
然后可以随意拖动达到裁减的效果
当然裁剪的功能没有...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字) 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
5.1点的裁剪 5.2直线段裁剪 5.3多边形裁剪【PPT-课件】
下载积分:1435
内容提示:5.1点的裁剪 5.2直线段裁剪 5.3多边形裁剪【PPT-课件】
文档格式:PPT|
浏览次数:61|
上传日期: 00:13:09|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1435 积分
下载此文档
该用户还上传了这些文档
5.1点的裁剪 5.2直线段裁剪 5.3多边形裁剪【PPT-课件】
关注微信公众号当前位置: >>
二维变换与裁剪
第五章 本章学习目标? ? ?齐次坐标 二维几何变换矩阵 Cohen-Sutherland直线段裁剪算法 本章内容5.1 5.2 5.3 5.4 5.5 图形几何变换基础 二维图形基本几何变换矩阵 二维复合变换 二维图形裁剪 Cohen-Sutherland直线裁剪算法 本章小结 5.1图形几何变换基础通过对图形进行几何变换,可以由简单图形构造复 杂图形。图形几何变换是对图形进行平移变换、比例变 换、旋转变换、反射变换和错切变换。图形几何变换可 以分为二维图形几何变换和三维图形几何变换,而二维 图形几何变换是三维图形几何变换的基础 。(a)地砖1(b)地砖2图5-1 地板砖类二维场景 二维几何变换示例 5.1.1 规范化齐次坐标齐次坐标就是用n+1维矢量表示n维矢量。例如,在二维平面中,点P(x,y)的齐次坐标表示为(wx,wy,w)。 类似地,在三维空间中,点P(x,y,z)的齐次坐标表示为 (wx,wy,wz,w)。 w=1就是规范化的齐次坐标。二维点P(x,y)的规范化齐次坐标为?x,y,1?,三维点P(x,y,z)的规范化齐次坐标为(x,y,z,1)。 定义了规范化齐次坐标以后,图形几何变换可以表 示为图形顶点集合的规范化齐次坐标矩阵与某一变换矩 阵相乘的形式。 5.1.2 矩阵相乘对于n×3的矩阵A和3×3的矩阵B,矩阵相乘公式为:? a11 ?a A ? B ? ? 21 ? ? ? ?a n1 a12 a 22 ? an2 a13 ? ?b11 ? a 23 ? ? ? ?b21 ? ? b31 ? ? ? an3 ? b12 b22 b32 b13 ? b23 ? ? b33 ? ?? a11b11 ? a12 b21 ? a13 b31 a11b12 ? a12 b22 ? a13 b32 a11b13 ? a12 b23 ? a13 b33 ? ?a b ? a b ? a b a b ? a b ? a b ? a b ? a b ? a b 21 11 22 21 23 31 21 12 22 22 23 32 21 13 22 23 23 33 ? ?? ? ? ? ? ? ? ? a b ? a b ? a b a b ? a b ? a b a b ? a b ? a b ? n1 11 n 2 21 n3 31 n1 12 n 2 22 n3 32 n1 13 n 2 23 n3 33 ?(5-1) 由线性代数知道,矩阵乘法不满足交换律,只有左矩 阵的列数等于右矩阵的行数时,两个矩阵才可以相乘。 5.1.3 二维几何变换矩阵用规范化齐次坐标表示的二维基本几何变换 矩阵是一个3×3的方阵,简称为二维变换矩阵。?a b p ? ? T ?? c d q ? ? ? ?l m s ? ??a b ? T1 ? ? ? c d ? ? T2 ? ?l m?? p? T3 ? ? ? ?q?(5-2)从功能上可以把二维变换矩阵T分为4个子矩阵。其中 对图形进行比例、旋转、反射和错切变换;对图形进行平移变换;对图形进行投影变换; 对图形进行整体比例变换。T4 ? ?s? 5.1.4 物体变换与坐标变换同一种变换可以看作是物体变换,也可以看作是坐标 变换。物体变换是使用同一变换矩阵作用于物体上的所 有顶点,但坐标系位Z不发生改变。坐标变换是坐标系 发生变换,但物体位Z不发生改变,然后在新坐标系下 表示物体上的所有顶点。这两种变换紧密联系,各有各 的优点,只是变换矩阵略有差异而已,以下主要介绍物 体变换。5.1.5 二维几何变换? x'1 ? x' ? 2 ? ? ? ? x' n y '1 1? ? x1 ?x y ' 2 1? ??? 2 ? ?? ? ? ? ? y ' n 1? ? x n y1 1? ?a b ? y 2 1? ? ? ?c d ? ?? l m ? ? ? y n 1? p? q? ? s? ?(5-3) 5.2 二维图形基本几何变换矩阵二维图形基本几何变换是指相对于坐 标原点和坐标轴进行的几何变换,包括平移(Translate)、比例(Scale)、旋转(Rotate)、反射(Reflect)和错切(shear)5种变换。物体变换物体变换是通过变换物体上每一个顶点实现的,因此 以点的二维基本几何变换为例讲解二维图 形基本几何变换矩阵 。 5.2.1 平移变换矩阵y 6 5 4 3 2 1P’P1 2Tx3 4 5Ty6 x? x' ? x ? Tx ? ? y' ? y ? TyO平移变换?x'?1 ? T ??0 ?Tx ?y ' 1? ? x ? Tx0 1 Ty 0? ? 0? 1? ??y ? Ty1 ? ?x??1 ? y 1? ? ? 0 ?Tx ?0 1 Ty0? ? 0? 1? ?Tx,Ty为平移参数(5-4) 5.2.2 比例变换矩阵y 6 5 4 3 2 1P’ P1 2Sx3 4Sy5 6 x? x' ? x ? S x ? ? y' ? y ? S yO比例变换?x'y ' 1? ? x ? S x0 Sy 0 0? 0? ? 1? ??y ? S y 1 ? ?x??S x T ?? ?0 ? ?0?S x y 1? ? ? ?0 ? ?00 Sy 00? 0? ? 1? ?Sx,Sy为比例系数(5-5) 5.2.3 旋转变换矩阵y 6 5 4 3 2 1P’ r β1 2P? x' ? r cos(? ? ? ) ? x cos ? ? y sin ? ? ? y' ? r sin(? ? ? ) ? x sin ? ? y cos ?α3 4 5 6 xOα为点的起始角,β为点的逆 时针方向旋转角旋转变换?x'? ?xy' 1? ? ?x ? cos? ? y sin ?? cos ? y 1? ? ? ?? sin ? ? ? 0 sin ? cos ? 0x sin ? ? y cos ? 1?sin ? cos ? 0 0? 0? ?(5-6) 1? ?0? ? cos ? ?? sin ? 0? T ? ? ? 1? ? ? ? 0 5.2.4 反射变换矩阵yyyOxO xOx(a)关于原点反射(b)关于x轴反射 反射变换(c)关于y轴反射关于原点反射的坐标表示为 。 相应的齐次坐标矩阵表示为? x' ? ? x ? ? y' ? ? y?x'y ' 1? ? ?? x ? y 1? ? ?x? ? 1 0 0? ? y 1? ? ? 0 ? 1 0 ? ? ? 0 1? ?0 ? 关于原点的二维反射变换矩阵为?? 1 0 0? ? T ?? 0 ? 1 0 ? ? ? 0 1? ?0 ?(5-7)关于x轴的二维反射变换矩阵为 ?1 0 0? ? T ?? 0 ? 1 0 ? ? ? ?0 0 1 ? ? 关于y轴的二维反射变换矩阵为? ? 1 0 0? ? T ?? 0 1 0 ? ? ? ? 0 0 1? ?(5-8)(5-9) 5.2.5 错切变换矩阵y yyOxOxOx(a)正方形y(b)沿x正向错切y(c)沿x负向错切yOxOxOx(d)沿y正向错切 (e)沿y负向错切 错切变换(f)沿x和y正向错切 沿x,y方向的错切变换的坐标表示为? x' ? x ? cy ? ? y' ? bx ? y相应的齐次坐标矩阵表示为?1 b 0? ? y 1? ? ? c 1 0 ? ? ? ?0 0 1 ? ??x 'y ' 1? ? ?x ? cy bx ? y 1? ? ?x因此,沿x,y两个方向的二维错切变换矩阵为?1 b 0 ? ? T ?? c 1 0 ? ? ? ?0 0 1 ? ?。其中b、c为错切参数(5-10) ?a b ? 的非对角线 在前面的变换中,子矩阵 T1 ? ? ? ?c d ?元素大多为零,如果c和b不为零,则意味着对图形进行错切变换。令b=0可以得到沿x方向的错切变换,c&0是沿x正向 的错切变换,c&0是沿x负向的错切变换。 令c=0可以得到沿y方向的错切变换,b&0是沿y正向 的错切变换,b&0是沿y负向的错切变换。 上面讨论的五种变换给出的都是点变换的公式,对 于线框模型,图形的变换实际上都可以通过点变换来完 成。例如直线段的变换可以通过对两个顶点坐标进行变 换,连接新顶点得到变换后的新直线段;多边形的变换 可以通过对每个顶点进行变换,连接新顶点得到变换后 的新多边形。曲线的变换可通过变换控制多边形的控制 点后,重新绘制曲线来实现。 符合下面形式的坐标变换称为二维仿射变换 (Affine Transformation)。?x'y ' 1? ?? ?x? a1,1 ? y 1? ? ?a1, 2 ? ? a1,3a 2,1 a 2, 2 a 2,30? ? 0? 1? ?(5-11)仿射变换具有平行线变换成平行线,有限点映射到 有限点的一般特性。平移、比例、旋转、反射和错切 五种变换都是二维仿射变换的特例,任何一组二维仿 射变换总可表示为这5种变换的组合。 5.3 二维复合变换5.3.1 复合变换原理P' ? P ? T ? P ? T1 ? T2 ?Tn其中,T为复合变换矩阵,T1 , T2 ?Tn 为单次基本几何变换矩阵。5.3.2 相对于任一参考点的二维几何变换相对于任一参考点的比例变换和旋转变换应表达为 复合变换形式,变换方法为首先将参考点平移到坐标 原点,对坐标原点进行比例变换和旋转变换,然后再进行反平移将参考点平移回原位Z。 例5-1 一个由顶点P1(10,10),P2(30,10) 和P3(20,25)所定义的三角形,如图所示,相对于 点Q(10,25)逆时针旋转30°,求变换后的三角形 顶点坐标。y 30 20 10y 30QP320 10P30 10 20 30 xP10 10 20 30P2xQ P1P2原始图形?1 0 T1 ? ? ? 0 1 ? ?? 10 ? 250? 0? ? 1? ?平移变换 ? ? ? ? ? 3 ? cos( 6 ) sin( 6 ) 0? ? 2 ? ? ? 1 ? ? T2 ? ?? sin( ) cos( ) 0? ? ?? 6 6 ? ? ? 2 0 1? ? 0 ? 0 ? ? ? ? ? ? ?1 2 3 2 0? 0? ? 0? ? 1? ? ? ?? 1 0 0? ? T3 ? ? 0 1 0 ? ? ? ?10 25 1? ?yy3030QP3 P21020 1020P310 20Q0P230 x10P110 20 30 x0P1 ? x1' ? ' ? x2 ' ? x3 ?? x1' ? ' ? x2 ' ? x3 ?y1' 1? ? x1 ? ' y2 1? ? ? ? x2 ' y3 1? ? x3 ? ?y1 1? y 2 1? ? ?T y 3 1? ?T ? T1 ? T2 ? T3y1' 1? ?10 10 1? ? 1 0 0? ? ? ? 0 ? ' y 2 1? ? ?30 10 1? ? 1 0 ? ? ? ' y 3 1? ?20 25 1? ? ? ?? 10 ? 25 1? ? ? ?? 3 ? ? 2 1 ? ?? ? 2 ? 0 ? ? ? 1 2 3 2 0 ? 0? ? ? 1 0 0? ? 17.5 12.01 1? ? ? ?34.82 22.01 1? 0? ? ? 0 1 0 ? ? ? ? ? 1? ? ?10 25 1? ? ? ?18.66 30 1? ? ? ? ?P1(17.5,12.01),P2(34.82,22.01)和P3(18.66,30) 习题3基本旋转变换复合旋转变换 5.3.2 相对于任意方向的二维几何变换相对于任意方向的变换方法是首先对任意方向做旋 转变换,使变换方向与坐标轴重合,然后对坐标轴进 行二维基本几何变换,最后做反向旋转变换,将任意 方向还原到原来的方向。例5-2 将图示三角形相对于轴线y=kx+b作反射变换, 计算每一步的变换矩阵。y 30 20 10y=kx+by 30 20 10(0,b)0 10 20 30 x0 10 20 30 x原始图形平移变换 ?1 0 0 ? ? T1 ? ? 0 1 0 ? ? ? ?0 ? b 1 ? ??cos ? T2 ? ? ? sin ? ? ? 0y 30 20 10y 30 20 10? sin ? cos ? 00? 0? ? 1? ?0102030x旋转变换?1 0 0? ? T3 ? ? 0 ? 1 0 ? ? ? ?0 0 1 ? ?10 20 30 x0反射变换 y 30 20 10y 30 20 100102030x0102030x反旋转变换反平移变换? cos ? T4 ? ? ?? sin ? ? ? 0sin ? cos ? 00? 0? ? 1? ??1 0 0 ? ? T5 ? ? 0 1 0 ? ? ? ?0 b 1 ? ? class CTransform//二维几何变换 { public: CTransform(); virtual ~CTransform(); void SetMat(CP2 *,int); void Identity(); void Translate(double,double);//平移变换矩阵 void Scale(double,double);//比例变换矩阵 void Scale(double,double,CP2);//相对于任意点的比例变换矩阵 void Rotate(double);//旋转变换矩阵 void Rotate(double,CP2);//相对于任意点的旋转变换矩阵 void ReflectO();//原点反射变换矩阵 void ReflectX();//X轴反射变换矩阵 void ReflectY();//Y轴反射变换矩阵 void Shear(double,double);//错切变换矩阵 void MultiMatrix();//矩阵相乘 public: double T[3][3]; CP2 *PO }; void CTransform::Identity()//单位矩阵 { T[0][0]=1.0;T[0][1]=0.0;T[0][2]=0.0; T[1][0]=0.0;T[1][1]=1.0;T[1][2]=0.0; T[2][0]=0.0;T[2][1]=0.0;T[2][2]=1.0; } void CTransform::Translate(double tx,double ty)//平移变换矩阵 { Identity(); T[2][0]= T[2][1]= MultiMatrix(); } void CTransform::Scale(double sx,double sy)//比例变换矩阵 { Identity(); T[0][0]= T[1][1]= MultiMatrix(); } void CTransform::Rotate(double beta)//旋转变换矩阵 { Identity(); double rad=beta*PI/180; T[0][0]=cos(rad); T[0][1]=sin(rad); T[1][0]=-sin(rad);T[1][1]=cos(rad); MultiMatrix(); } void CTransform::Rotate(double beta,CP2 p)//相对于任意点的旋转变换 矩阵 { Translate(-p.x,-p.y); Rotate(beta); Translate(p.x,p.y); } void CTransform::ReflectO()//原点反射变换矩阵 { Identity(); T[0][0]=-1; T[1][1]=-1; MultiMatrix(); } void CTransform::ReflectX()//X轴反射变换矩阵 { Identity(); T[0][0]=1; T[1][1]=-1; MultiMatrix(); } void CTransform::ReflectY()//Y轴反射变换矩阵 { Identity(); T[0][0]=-1; T[1][1]=1; MultiMatrix(); } void CTransform::Shear(double b,double c)//错切变换矩阵 { Identity(); T[0][1]=b; T[1][0]=c; MultiMatrix(); } void CTransform::MultiMatrix()//矩阵相乘 { CP2 *PNew=new CP2[num]; for(int i=0;i&i++) { PNew[i]=POld[i]; } for(int j=0;j&j++) { POld[j].x=PNew[j].x*T[0][0]+PNew[j].y*T[1][0] +PNew[j].w*T[2][0]; POld[j].y=PNew[j].x*T[0][1]+PNew[j].y*T[1][1] +PNew[j].w*T[2][1]; POld[j].w=PNew[j].x*T[0][2]+PNew[j].y*T[1][2] +PNew[j].w*T[2][2]; } delete []PN } 二维几何变换 5.4 二维图形裁剪5.4.1 图形学中常用的坐标系1.世界坐标系 描述现实世界中场景的固定坐标系称为世界坐标 系,世界坐标系是实数域坐标系,根据应用的需要可 以选择直角坐标系、圆柱坐标系、球坐标系以及极坐 标系等。ywywOwxwzwOxw二维直角坐标系三维右手直角坐标系 2.用户坐标系描述物体数学模型的坐标系称为用户坐标系,有时 也称为局部坐标系。用户坐标系也是实数域坐标系。 用户坐标系是可移动坐标系,用户坐标系的原点可以 放在物体的任意位Z上,坐标系也可以旋转任意角度。 对于立方体,可以将用户坐标系原点放Z在立方体中 心;对于圆柱,可以将用户坐标系的y轴作为旋转轴。3.观察坐标系观察坐标系是在世界坐标系中定义的坐标系,观 察坐标系原点位于视点,z轴垂直于屏幕,正向为视 线方向。二维观察坐标系主要用于指定图形的输出范 围。三维观察坐标系是左手系,用于生成物体的旋转 动画。 ywyv观察坐标系系输出结果Ov xvOw xw世界坐标系 观察坐标系xv yv二维观察坐标系屏幕坐标系ys0v 0s xs zs zv ywzw0wxw三维观察坐标系世界坐标系 4.屏幕坐标系屏幕坐标系为实数域二维直角坐标系。原点位于 屏幕中心,x轴水平向右为正,y轴垂直向上为正。 5.设备坐标系 显示器等图形输出设备自身都带有一个二维直角坐 标系称为设备坐标系。设备坐标系是整数域二维坐标 系,原点位于屏幕左上角,x轴水平向右,y轴垂直向 下,基本单位为像素。格化到?0.0,0.0?到?1.0, 1.0?的范围内的设备坐标系称为规格化设备坐标系。O xO1y1设备坐标系规格化设备坐标系 规格化设备坐标系独立于具体输出设备。一旦图形变换到规格化设备坐标系中,只要作一个简单的乘法运算即可映射到具体的设备坐标系中。由于规格化设备坐标 系能统一用户各种图形的显示范围,故把用户图形变换 成规格化设备坐标系中的统一大小标准图形的过程叫作 图形的逻辑输出。把规格化设备坐标系中的标准图形送到显示设备上输出的过程叫作图形的物理输出。有了规格化设备坐标系后,图形的输出可以在抽象的显示设备 上进行讨论,因而这种图形学又称为与设备无关的图形 学。 5.4.2 窗口与视区在观察坐标系中定义的确定显示内容的矩形区域称 为窗口。在屏幕坐标系中定义的输出图形的矩形区域称 为视区。图形输出需要进行从窗口到视区的变换,只有 窗口内的图形才能在视区中输出,并且输出的形状要根 据视区的大小进行调整,这称为窗视变换(window viewport transformation)。 在计算机图形学术语中,窗口最初是指要观察的图 形区域。但是随着Windows的出现,窗口概念已广泛 用于图形系统中,泛指任何可以移动,改变大小、激 活或变为无效的屏幕上的矩形区域。在本章中,窗口 回归到其的原始定义,是在观察坐标系中确定输出图 形范围的矩形区域。 多视区输出 5.4.3 窗视变换矩阵wy wyt (xw,yw)0000vy vyt (xv,yv)wyb窗口vyb O0000 视区Owxlwxrwxvxlvxrvx(1)将窗口左下角点(wxl,wyb)平移到观察坐标系原点。? 1 ? T1 ? ? 0 ?? wxl ? 0 1 ? w yb 0? ? 0? 1? ?(2)对原点进行比例变换,使窗口与视区大小相等, 将窗口变换为视区。 v xr ? v xl ??S x T2 ? ? ?0 ? ?0 0 Sy 0 0? 0? ? 1? ?,其中,? S x ? w ?w ? xr xl ? v ? v yb ?S y ? yt w yt ? w yb ? ? (3)进行反平移,将视区的左下角点平移到设备坐标 系的(vxl,vyb)点。窗视变换矩阵? 1 ? T ? T1 ? T2 ? T3 ? ? 0 ?? wxl ??1 ? T3 ? ? 0 ?v xl ?0 1 ? w yb0 1 v yb0? ? 0? 1? ?0 Sy 0 0? ? 1 ? 0? ? ? ?0 1? ? ? ?v xl 0 1 v yb 0? ? 0? 1? ?0? ? S x ? 0? ? ? ?0 1? ?0 ? ?窗视变换?xvy v 1? ? ?x wyw? Sx ? 1? ? ? 0 ?v xl ? wxl S x ?0 Sy v yb ? w yb S y0? ? 0? 1? ? 写成方程 令v xr ? v xl ? ?a ? S x ? w ? w xr xl ? ? ?b ? v xl ? wxl a ? v ? v yb ?c ? S y ? yt ? w yt ? w yb ? ? ?d ? v yb ? w yb c? xv ? S x xw ? vxl ? wxl S x ? ? yv ? S y yw ? v yb ? wyb S y则窗视变换的展开式为? xv ? ax w ? b ? ? yv ? cy w ? d(5-12) 5.5 Cohen-Sutherland直线裁剪算法在二维观察中,需要在观察坐标系下根据窗口大小对 二维图形进行裁剪(clipping),只将位于窗口内的图形 变换到视区输出。直线段裁剪是二维图形裁剪的基础,裁 剪的实质是判断直线段是否与窗口相交,如相交则进一步 确定直线段上位于窗口内的部分。5.5.1 编码原理Cohen-Sutherland直线段裁剪算法是最早流行的 编码算法。每段直线的端点都被赋予一组四位二进制 代码,称为区域编码(region code,RC),用来标识 直线段端点相对于窗口边界及其延长线的位Z。 假设窗口是标准矩形,由上、下、左、右4条边组成, 延长窗口的4条边形成9个区域。这样根据直线段的任 一端点P(x,y)所处的窗口区域位Z,可以赋予一组4 位二进制区域码RC=C3C2C1C0,从右到左依次代表左、 右、下、上。wyt 窗口 0000 wybwxlwxr窗口坐标 100110001010000100000010010101000110区域编码RC为了保证窗口内直线段端点的编码为零,定义规则如下C0:若端点的x&wxl,则C0=1,否则C0=0。 C1:若端点的x&wxr,则C1=1,否则C1=0。 C2:若端点的y&wyb,则C2=1,否则C2=0。 C3:若端点的y&wyt,则C3=1,否则C3=0。 5.5.2 裁剪步骤(1)若直线段的两个端点的区域编码都为0,即 RC0|RC1=0(二者按位相或的结果为零,即RC0=0且 RC1=0),说明直线段的两个端点都在窗口内,应 “简取”。 (2)若直线段的两个端点的区域编码都不为0,即 RC0&RC1≠0(二者按位相与的结果不为零,即RC0≠0 且RC1≠0),即直线段位于窗外的同一侧,说明直线 段的两个端点都在窗口外,应“简弃”。 (3)若直线段既不满足“简取”也不满足“简弃” 的条件,则需要与窗口进行“求交”判断。这时,直 线段必然与窗口边界或窗口边界的延长线相交,分两 种情况处理。 100110001010P0100101P101000110100110001010000100000010P0010101000110P1 裁剪直线段时,一般按固定顺序左(x=wxl), 右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口 边界与直线段的交点。5.5.3 交点计算公式对于端点坐标为P0(x0,y0)和P1(x1,y1)的直线 段,与窗口左边界(x=wxl)或右边界(x=wxr)交点 的y坐标的计算公式为y ? k ( x ? x0 ) ? y0(5-13)与窗口上边界(y=wyt)或下边界(y=wyb)交点的 x坐标的计算公式为 y ? y0 x? ? x0 (5-14) k 其中, k ? ( y1 ? y0 ) /( x1 ? x0 ) Cohen-Sutherland直线段裁剪算法 #define LEFT 1 //代表:0001 #define RIGHT 2 //代表:0010 #define BOTTOM 4 //代表:0100 #define TOP 8 //代表:1000 void CTestView::EnCode(CP2 &pt)//编码函数 { pt.rc=0; if(pt.x&Wxl) { pt.rc=pt.rc | LEFT; } else if(pt.x&Wxr) { pt.rc=pt.rc | RIGHT; } if(pt.y&Wyb) { pt.rc=pt.rc | BOTTOM; } else if(pt.y&Wyt) { pt.rc=pt.rc | TOP; } } void CTestView::Cohen()//Cohen-Sutherland算法 { CP2//交点坐标 EnCode(P[0]);//起点编码 EnCode(P[1]);//终点编码 while(P[0].rc!=0 || P[1].rc!=0)//处理至少一个顶点在窗口外 { if((P[0].rc & P[1].rc)!=0)//简弃之 { PtCount=0; } if(0==P[0].rc)//确保P[0]位于窗口之外 { CP2 T Temp=P[0]; P[0]=P[1]; P[1]=T } UINT RC=P[0]. double k=(P[1].y-P[0].y)/(P[1].x-P[0].x);//斜率 if(RC & LEFT)//P[0]点位于窗口的左侧 { p.x=W//计算交点y坐标 p.y=k*(p.x-P[0].x)+P[0].y; } else if(RC & RIGHT)//P[0]点位于窗口的右侧 { p.x=W//计算交点y坐标 p.y=k*(p.x-P[0].x)+P[0].y; } else if(RC & BOTTOM)//P[0]点位于窗口的下侧 { p.y=W//计算交点x坐标 p.x=(p.y-P[0].y)/k+P[0].x; } else if(RC & TOP)//P[0]点位于窗口的上侧 { p.y=W//计算交点x坐标 p.x=(p.y-P[0].y)/k+P[0].x; } EnCode(p); P[0]=p; } } 本章小结二维变换需要读者掌握基本几何变换矩阵。二维 图形基本几何变换的平移、比例、旋转、反射和错切 是仿射变换的特例,反过来,任何仿射变换? x' ? a1,1 x ? a1, 2 y ? a1,3 ? ? y' ? a 2,1 x ? a 2, 2 y ? a 2,3总可以表示为这五种变换的组合。 本 章 给 出 了 3 种 直 线 段 裁 剪 算 法 , 其 中 CohenSutherland裁剪算法是最为着名,创新性地提出了直线 段端点的编码规则,但这种裁剪算法需要计算直线段 与窗口的交点;中点分割裁剪算法避免了求解直线段 和窗口边界的交点,只需计算直线段中点坐标就可以 完成直线段的裁剪,但迭代计算工作量较大。 Liang-Barsky 裁剪算法是这 3 种算法中效率最高的算法,通过计算参数t,把二维裁剪问题转化成一维裁剪问题,直线段的裁剪转化为求解一组不等式的问 题。二维裁剪属于二维观察的内容。窗口建立在观察坐标系、视区建立在屏幕坐标系。为了减少窗视变换的计算量,本教材中假定窗口与视区的大小一致。 5.8 习题1.如图5-51所示,求P0(4,1)、P1(7,3)、P2 (7,7)、P3(1,4)构成的四边形绕 Q(5,4)逆 时针旋转45°的变换矩阵和变换后图形的顶点 y 坐标。8 7 6 5 4 3 2 1P2 P3 Q P1 P0xo12345678图5-51 四边形旋转 2.屏幕客户区xOy坐标系的原点位于左上角,x轴水平向右,最大值为MaxX,y轴垂直向下,最大值为MaxY。 建立新坐标系x’O’y’,原点位于屏幕客户区中心 (MaxX/2,MaxY/2),x’轴水平向右,y’轴垂直向上, 如图5-52所示。要求使用变换矩阵求解这两个坐标系 之间的转换关系。y’ x O O’ y x’图5-52 坐标系变换 3.建立坐标系xOy,原点O位于屏幕客户区中心,x轴水 平向右,y轴垂直向上。以(0,-b)点为中心,悬挂一 边长为a( ob ? 22 a )的正方形,如图5-53所示。要求按 下“动画”按钮时启动定时器,正方形按逆时针方向 绕自身中心(b点)匀速旋转,请编程实现。Oab图5-53 复合旋转变换 4.用编码裁剪算法裁剪线段P0(0,2),P1(3,3),裁剪窗 口为wxl=1,wxr=6,wyb=1,wyt=5,如图5-54所示。要求 写出:(1)窗口边界划分的9个区间的编码原则。 (2)线段端点的编码。 (3)裁剪的主要步骤。 (4)裁剪后窗口内直线段的端点坐标。y 6 5 4 3 2 1P1 P0O1234567x图5-54 直线段裁剪 5.窗视变换公式也可以使用窗口和视区的相似原理进 行推导,但要求点P(xw,yw)在窗口中的相对位Z等于点 P’( xv,yv)在视区中的相对位Z,请推导以下的窗视变换公式:vxr ? vxl ? ?a ? S x ? wxr ? wxl ? b ? vxl ? wxl ? a 变换系数为: ? ? ?c ? S y ? vyt ? vyb wyt ? wyb ? ? ?d ? vyb ? wyb ? c? xv ? a ? x w ? b ? ? yv ? c ? y w ? d 6.请按照图5-55所示,使用对话框输入直线段的起点和 终点坐标。在屏幕客户区左侧区域绘制输入直线段和 “窗口”,在屏幕客户区右侧区域绘制“视区”并输出 裁剪结果。这里需要用到窗视变换公式。请使用CohenSutherland算法编程实现。图5-55 含窗视变换的直线段裁剪效果图 7.*已知裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2,直线段的起点坐标为P1(3,3)终点坐标为P2(-2,-1),如图533所示。请用Liang -Barsky直线段裁剪算法分步说明裁剪过程,并求出直线在窗口内部分的端点C和D的坐标值。yP03 2CD1-2 -1 -1 -2O 1 2 3 xP2图5-57 直线段裁剪 8*在屏幕客户区中心绘制金刚石图案。使用鼠标移动 正方形代表的放大镜(鼠标指针位于放大镜中心)对 金刚石图案使用Cohen-Sutherland裁剪算法进行动态裁 剪,并在放大镜内绘制被裁剪金刚石图案的放大部分。 请使用MFC编程实现,要求放大倍数可以使用工具栏的按钮或鼠标左右键进行调整。正方形放大镜裁剪效果如图5-58所示。图5-58 正方形放大镜动态裁剪金刚石图案
实验四 二维几何变换 一、实验学时: 1 学时 二、实验类型: 验证型实验 三...观察变换中相//当于给出了投影参数 //该函数常用于在 2D 变换中指定裁剪窗口...西北农林科技大学实验报告学院名称: 理学院 姓课名: 学号: 报告日期:
专业年级:计算 131 程:计算机图形学 实验四一、实验目的: 二维图形的裁剪 1...学号: 报告日期: 第十五周 实验四一、实验目的 1)加深直线段的剪裁算法的理解...计算机图形学 二维裁剪 28页 1下载券
计算机图形学实验五直线... 13页 2下载...华东交通大学图形学课程设计课程设计名称:各种二维图形裁剪技术研究 姓名: 学号: 学院:基础学院 班级:信息与计算科学 2010-1 指导老师: 小组成员: 目录 1、摘要 ...二维图形的几何变换 10页 1财富值 第五章 二维图形变换 39页 1财富值 第4章...后面讲到了二维剪裁,即线段裁剪与 多边形裁剪。 第一节 用户坐标到屏幕坐标变换...学院名称:理学院 姓课名: 学号: 专业年级: 信计 111 班 程:计算机图形学 报告日期:
实验四 二维图形的裁剪 一、实验目的:(1)加深直线段的剪裁...二维图形的组合变换 流程图: 窗口到视区的变换 世界坐标系 屏幕坐标系 世界坐标 系内的变 换 关于窗口 的裁剪 窗口到视 区的变换 扫描转换 显示 1.打开 ...28页 1财富值 计算机图形学第6章二维图形... 20页 免费喜欢此文档的还喜欢 ...图 1 线段裁剪前情形 图 2 线段裁剪后情形 五、 总结与调试经验这次实验我提前...实验六 二维裁剪算法 Cohen_Sutherland 的实现 一、实验目的:理解并掌握直线裁剪算法。使用 Visual C++实现二维直线的裁剪的 Cohen_Sutherland 算法。对窗口进 行编码...变换,即几何变换、投影变换、裁剪变换、 视口变换等...图五、正射投影视景体 OpenGL 正射投影函数也有两...视口变换就是将视景体内投影的物体显示在二维的视口...
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 x265编码效率仍然低 的文章

 

随机推荐