直线段的裁剪
计算机科学技术:计算机图形学题库三
![计算机科学技术:计算机图形学题库三](https://img.taocdn.com/s3/m/04400ad40875f46527d3240c844769eae109a35f.png)
计算机科学技术:计算机图形学题库三1、名词解释扫描转换答案:在矢量图形中,多边形用顶点序列来表示,为了在光栅显示器或打印机等设备上显示多边形,必须把它转换为点阵表示。
这种转换称为扫描转换。
2、单选下面对光栅扫描图形显示器描述正确的是()A.荧光粉涂层均匀离散分布;B.是一种点画设备;C.电子束从顶到底扫描;D.通过控制电子束的强弱实现色彩的强弱;答案:A3、填空题计算机图形系统由()系统和软件系统组成。
答案:硬件4、填空题在处理图形时常常涉及的坐标系有模型坐标系(),世界坐标系,观察坐标系,设备坐标系。
答案:局部坐标系5、单选计算机图形学与计算机图象学的关系是()。
A.计算机图形学是基础,计算机图象学是其发展B.不同的学科,研究对象和数学基础都不同,但它们之间也有可转换部分C.同一学科在不同场合的不同称呼而已D.完全不同的学科,两者毫不相干答案:B6、问答题简述中点分割法进行裁剪的过程?答案:中点分割剪取法,主要是对线段不断地进行对分,并排除在区域外的部分,找出线段落在窗口内的部分。
其方法主要是通过求出离线段的一个端点最近并且在区域内的点的方法,来确定线段落在窗口内的端点。
7、问答题局部光照模型和全局光照模型的不同之处是什么?答案:局部光照模型主要是考虑光源发出的光对物体的直接影响。
另外,全局光照模型除了处理光源发出的光之外,还考虑其他辅助光的影响,如光线穿过透明或半透明物体,以及光线从一个物体表面反射到另一个表面等。
8、判断题彩色阴极射线管主要是由红绿蓝三个彩色电子束的亮度不同,进而组合形成各种色彩的。
答案:错9、问答题什么叫做走样?什么叫做反走样?反走样技术包括那些?答案:走样指的是用离散量表示连续量引起的失真。
为了提高图形的显示质量。
需要减少或消除因走样带来的阶梯形或闪烁效果,用于减少或消除这种效果的方法称为反走样。
其方法是①前滤波,以较高的分辨率显示对象;②后滤波,即加权区域取样,在高于显示分辨率的较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均得到较低分辨率下的像素属性。
计算机图形学第6章二维图形的裁剪
![计算机图形学第6章二维图形的裁剪](https://img.taocdn.com/s3/m/dea01507b4daa58da0114aae.png)
• 重点:掌握二维图形点、线段、多边形和字符的裁剪算法 。
• 难点:理解二维图形的裁剪算法思想并且用C语言进行算法 的实现。
一、裁剪的意义 为了描述图形对象,我们必须存储它的全部信息,但有时为了达到分 区描述或重点描述某一部分的目的,往往将要描述的部分置于一个窗口内, 而将窗口外的部分“剪掉”,这个处理过程叫做裁剪,裁剪在计算机图形 处理中具有十分重要的意义。 裁剪实质上是从数据集合中抽取信息的过程,这个过程是通过一定的 计算方法来实现。
7.2.2 中点分割算法
二、中点分割算法实现: 1、将直线的两端点P1、P2编码得:C1、C2; 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内, 应予保留。 (2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少 有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线 段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。
如果上面四个不等式中任何一个不满足,则点(x,y)位于窗口之 外。 对于任意多边形窗口,需要根据多边形内点的判别准则进行判断。
7.2 线段的裁剪
直线段的裁剪比点复杂,其裁剪方法又是多边形裁剪和三维图形裁剪的 基础。 一、直线裁剪的基本思想 判断直线与窗口的位置关系: 1.确定直线是完全可见; 2.部分可见; 3.还是完全不可见。 对部分可见线段,求出它与窗口边界的交点,并将窗口内的线段输出。
一、中点分割算法思想: 1、中点公式
7.2.2 中点分割算法
2、中点分割法求交点的规则 如图中所示,当线段P1P2求出中点P后,舍弃线段的哪部分,由下面 两条规则决定:
中点分割法求交点规则
复习题计算机图形学提纲 FIN
![复习题计算机图形学提纲 FIN](https://img.taocdn.com/s3/m/39803b41fe4733687e21aaab.png)
1、编码裁剪算法的原理、方法。
中点分割裁剪算法的特点 P168编码裁剪算法(Cohen-Sutherland算法):直线段裁剪算法原理:对直线段p1(x1,y1)p2(x2,y2)分三种情况处理:(1) p1 p2都在裁剪窗口内,则该直线可见,简取之(2 )p1 p2均在窗口外,且在同一外侧,则完全不可见,简弃之(3)若均不满足,则该直线段可能与窗口相交,此时需要对直线段按交点进行分段,分段后重复上述处理。
算法步骤:1.输入直线段的两端点坐标及窗口的四条边界坐标。
2.对p1 p2进行编码,p1编码为code1,p2为code2.3.若code1|code2=0简取之,转6;若code1&code2≠0,简弃之,转7;均不成立时,转4.4.确保p1在窗口外部。
若在窗口内,将p1 p2交换坐标值与编码。
5.根据p1编码从低位开始找编码值为1的地方,从而确定p1在窗口的哪一侧,然后求出直线段与相应窗口边界交点S,并用S的坐标值替换P1的坐标值,转26.用直线扫描算法画出当前直线段p1p27.结束Code编码:1001 1000 10100001 0000 00100101 0100 0110中点分割算法(二分逼近确定直线段与窗口边界的交点)特点:用硬件执行加法和除2运算非常快。
2、三维图形基本变换矩阵P184、复合变换P191、绕任意轴旋转矩阵的复合方法P192,齐次坐标、规范化齐次坐标的概念与计算P151。
基本变换:旋转,错切,缩放,对称;投影变换;平移;整体比例变换平移:[x y z 1]->[x+tx y+ty z+tz 1]整体比例:[x y z 1]->[x/s y/s z/s 1]旋转:Z轴 [x y z 1]->[xcosa-ysina xsina+ycosa z 1]X轴 [x y z 1]->[x ycosa-zsina ysina+zcosa 1]Y轴 [x y z 1]->[ zsina+ xcosa y zcosa-xsina 1]对称:xoy面:[x y z 1]->[x y –z 1]Xoz面:[x y z 1]->[x –y z 1]Yoz面:[x y z 1]->[-x y z 1]错切:沿x方向 [x y z 1]->[x+dy+dz y z 1]沿y轴方向 [x y z 1]->[x y+dx+dz z 1]沿z轴方向 [x y z 1]->[ x y z+dx+dy 1]复合变换:1.相对任意参考点的三维变换平移到原点-〉变换-〉回到原位置2.绕任意轴的旋转变换使任意轴的起点与原点重合(平移);使方向轴与某一坐标轴重合(多次旋转);针对该坐标轴完成变换;用逆旋转变换使方向轴回到原始方向;用逆平移变换使方向轴回到原始位置齐次坐标:用n+1维向量表示n维向量齐次坐标规范化:使h=13、中点画圆算法的原理与方法P111基本原理:每次沿x方向上走一步,在y方向上减1或减0.算法:1输入圆的半径R2计算初始值d=1-R,x=0,y=R3绘制点(x,y)及其八分圆中的另外7个对称点(circlepoint(x,y,color))4判断d的符号。
计算机图形学期末编程大作业
![计算机图形学期末编程大作业](https://img.taocdn.com/s3/m/0d9b43725acfa1c7aa00cce7.png)
{Xs=dlgBresenhamline.m_Xs;
Ys=dlgBresenhamline.m_Ys;
Xe=dlgBresenhamline.m_Xe;
Ye=dlgBresenhamline.m_Ye;}
//使传入的端点坐标X值相等
2)Bresenham画圆算法
Bresenham画法与中点画法一样,也考虑从(0,R)到(R/ ,R/ )的八分之一圆周。取(0,R)为起点,按顺时针方向生成圆。从这段圆弧的任意一点出发,按顺时针方向生成圆时,为了最佳逼近该圆,下一像素的取法只有三种可能的选择:正右方像素,右下方像素和正下方像素。这三个像素中,与理想圆弧最近者为所求像素。
}
}
//斜率绝对值大于1
else
{//情况三:Y递增
if(Ys<=Ye)
{p=(dx<<1)-dy;
while(y<=Ye)
{dc.SetPixel(x,y,m_clr);
if(p<0)
{y++;p=p+(dx<<1);}
else
{x++;y++;p=p+((dx-dy)<<1);}
}
}
//情况四:Y递减
b.直线的绘制
图1-3直线参数对话框
鼠标左键点选菜单栏中的 菜单,会弹出下拉菜单,其中提供2种直线绘制的经典算法,包括DDA算法和Bresenham算法。我们可随意选择一种,例如Bresenham算法。
说表左键单击选定后,便会弹出参数输入对话框,如图3。
注意:由于在计算机的图形显示时,屏幕坐标默认以屏幕左上角点为(0,0)点,X轴方向水平指向右侧,Y轴方向竖直指向下侧。与我们实际中熟悉的坐标系不同,输入点坐标时要注意。例如直线的起止点坐标分别为(0,0)、(100,100),绘制结果如图5。
计算机图形学试题及答案
![计算机图形学试题及答案](https://img.taocdn.com/s3/m/96358f895fbfc77da369b12f.png)
一、 判断题(10x1=10分)1、 构成图形的要素可分为两类:刻画形状的点、线、面、体的非几何要素与反映物体表面属性或材质的明暗、色彩等的几何要素。
( 错误 )2、 参数法描述的图形叫图形;点阵法描述的图形叫图像。
( 正确 )3、 EGA/VGA 为增强图形显示效果的一种图形处理软件的名称。
( 错误 )4、 对山、水等不规则对象进行造型时,大多采用过程式模拟方法。
( 正确 )5、 若两个图形是拓扑等价的,则一个图形可通过做弹性运动与另一个图形相重合。
( 正确 )6、 0阶参数连续性和0阶几何连续性的定义是相同的。
( 正确 )7、 Bezier 曲线可做局部调整。
( 错误 )8、 字符的图形表示分为点阵和矢量两种形式。
( 正确 ) 9、 LCD 表示发光二极管显示器。
( 错误 )10、 使用齐次坐标可以将n 维空间的一个点向量唯一的映射到n+1维空间中。
( 错误 ) 二、 填空题(15x2=30分)1、目前常用的PC 图形显示子系统主要由3个部件组成:(1)帧缓冲存储器、(2)显示控制器、(3)ROM BIOS 。
2、 图形的输入设备有(4)键盘、鼠标、光笔(至少写三种);图形的显示设备有(5)CRT 显示器、LCD 、投影仪(至少写三种)。
3、常用坐标系一般可以分为:建模坐标系、用户坐标系、(6观察坐标系、(7)规格化设备坐标系、(8)设备坐标系。
4、在多边形的扫描转换过程中,主要是通过确定穿越多边形区域的扫描线的覆盖区间来填充,而区域填充则是从(9)给定的位置开始涂描直到(10)指定的边界条件为止。
5、一个交互式计算机图形系统应具有(11)计算 、(12)存储、(13)对话、(14)输入和输出等五个方面的功能。
三、 简答题(5x6=30分)1、 请列举常用的直线段裁减算法(四种)。
答:答:直接求交算法、编码算法、中点再分算法、Cyrus-Beck 算法。
2、 考虑三个不同的光栅系统,分辨率依次为480640⨯,10241280⨯,20482560⨯。
哈工大chapter 05裁剪、反走样
![哈工大chapter 05裁剪、反走样](https://img.taocdn.com/s3/m/3fd2c9dead51f01dc281f1b9.png)
Pm B P1
中点分割裁剪算法
中点分割裁剪算法
ϒ 对分辩率为2N次。 ϒ 主要过程只用到加法和除法运算,适合硬件 实现,它可以用左右移位来代替乘除法,这 样就大大加快了速度。
梁友栋-Barsky算法
设要裁剪的线段是P0P1。 P0P1和 窗口边界交于A,B,C,D四点,见图。 算法的基本思想是从A,B和P0三点中 找出最靠近的P1点,图中要找的点 是P0。从C,D和P1中找出最靠近P0的 点。图中要找的点是C点。那么P0C 就是P0P1线段上的可见部分。
哪些落在显示区之外,以便只显示落在显示区 内的那部分图形。这个选择过程称为裁剪。
图形裁剪算法,直接影响图形系统的效率。
点的裁剪
ϒ 图形裁剪中最基本的问题。
为(xL,yB),右上角坐标 为(xR,yT),对于给定点 P(x,y),则P点在窗口内的条 件是要满足下列不等式: xL <= x <= xR (xL,yB ϒ 并且yB <= y <= yT ) 否则,P点就在窗口外。 ϒ 问题:对于任何多边形窗口, 如何判别?
第五章 裁剪、反走样 方法
反走样方法 裁剪算法
反走样
ϒ 用离散量表示连续量引起的失真现象称之为走样
(aliasing) 。 光栅图形的走样现象
阶梯状边界; 图形细节失真; 狭小图形遗失:动画序列中时隐时现,产生闪烁。
时间上的混淆现象
轮子的转速是:1r/s(1HZ)
每0.75s采一次样(1/0.75HZ)
1
P0P1至少部分可见的充分条件是 max(0, t 0) ≤ min(1, t1 ) 且可见部分的参数区间为[max(0, t 0 ),min(1, t1)]。
t0 Q0 0 P0 t1 Q1 1 P1
直线裁剪算法
![直线裁剪算法](https://img.taocdn.com/s3/m/bfdde3d20d22590102020740be1e650e52eacfbf.png)
直线裁剪算法直线裁剪算法⼀、1、裁剪:确定图形哪些部分落在显⽰区之内,哪些落在显⽰区外。
这个选择的过程就称为裁剪。
2、直线段的裁剪:Cohen-Suther land、中点分割法和Liang-Barsky裁剪算法⼆、Cohen-Suther land算法⼜称编码裁剪算法,算法的基本思想是对每条直线分三种情况处理:1>若端点完全在裁剪窗⼝内----“简取”之2>若端点完全在裁剪窗⼝外,且满⾜下列四个条件之⼀----“简弃”之3>既不满⾜简取,也不满⾜简弃:对直线段按交点进⾏分段,分段后判断直线是“简取”还是“简弃”每条线段的端点都赋以四位⼆进制码D3D2D1D0,编码规则如下:(左右下上)例如:裁剪⼀条线段时,先求出端点P1,P2的编码code,然后进⾏⼆进制“或”和“与”运算(1)若code1|code2=0,对直线段简取(2)若code1&code2不等于0,对直线段简弃(3)若上述两条件都不成⽴,则需要求出直线段与窗⼝边界的交点,并在交点处把直线段⼀分为⼆3、存在问题:⼀条完全在窗⼝外的直线,进⾏与运算=0,还需求交点,然后所得结果还是全部舍弃三、三、中点分割算法1、核⼼思想:通过⼆分逼近来确定直线段与窗⼝的交点2、注意:1>若中点不在窗⼝内,则把中点和离窗⼝边界最远点构成的线段丢掉,线段上的另⼀点和该中点再构成线段求其中点2>若中点在窗⼝内,则以中点和最远点构成线段,求其中点,直到中点与窗⼝边界的坐标值在规定的误差范围内3、问题:中点分割算法会不会⽆限循环下去?不会。
因为屏幕像素是有限的,⼀般计算次数不会太多,⽽且允许在误差范围内四、Liang-Barsky裁剪算法1、主要思想:⽤参数⽅程表⽰⼀条直线段(0<=U<=1)X=X1+U*(X2-X1)=X1+U*△XY=Y1+U*(Y2-Y1)=Y1+U*△Y2、把直线看成是⼀条有⽅向的线段,把窗⼝的四条边及其延长线分成两类:⼊边和出边⼊边:左边界和下边界出边:右边界和上边界如何求出起点和终点的坐标?(即起点和终点的参数值u)判断线段某⼀部分是否在窗⼝内,可以简化为判断直线上⼀个点是否在窗⼝内的问题,窗⼝内的P点满⾜什么条件?3、举例:3、Liang-Barsky算法⼩结1>直线⽅程参数化2>直线段是有⽅向的3>把窗⼝的四条边分成⼊边和出边五、Cohen-Suther land算法和Liang-Barsky算法⽐较1、Cohen-Suther land算法的核⼼思想是编码,窗⼝和延长线把空间分成了9个区域2、线段要么⼤部分在窗⼝外,要么⼤部分在窗⼝内,使⽤Cohen-Suther land效果好3、⼀般情况下(线段贯穿窗⼝),优先使⽤Liang-Barsky算法4、两者均只能应⽤于矩形窗⼝。
计算机图形学实验三
![计算机图形学实验三](https://img.taocdn.com/s3/m/66bdb1dfe53a580216fcfefa.png)
太原工业学院实验报告GetClientRect(&rect);//获得客户区的大小pDC->SetMapMode(MM_ANISOTROPIC);//pDC自定义坐标系pDC->SetWindowExt(rect.Width(),rect.Height());//设置窗口范围pDC->SetViewportExt(rect.Width(),-rect.Height());//设置视区范围,x轴水平向右,y轴垂直向上pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//客户区中心为原点CDC memDC;//内存DCCBitmap NewBitmap,*pOldBitmap;//内存中承载的临时位图memDC.CreateCompatibleDC(pDC);//创建一个与显示pDC兼容的内存memDCNewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图pOldBitmap=memDC.SelectObject(&NewBitmap);//将兼容位图选入memDCmemDC.FillSolidRect(rect,pDC->GetBkColor());//按原来背景填充客户区,否则是黑色memDC.SetMapMode(MM_ANISOTROPIC);//memDC自定义坐标系memDC.SetWindowExt(rect.Width(),rect.Height());memDC.SetViewportExt(rect.Width(),-rect.Height());memDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);DrawWindowRect(&memDC);//绘制窗口if(PtCount>=1){memDC.MoveTo(Round(P[0].x),Round(P[0].y));memDC.LineTo(Round(P[1].x),Round(P[1].y));}pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);//将内存memDC中的位图拷贝到显示pDC中memDC.SelectObject(pOldBitmap);//恢复位图NewBitmap.DeleteObject();//删除位图}(2)绘制裁剪窗口void CTestView::DrawWindowRect(CDC* pDC)//绘制裁剪窗口{// TODO: Add your message handler code here and/or call defaultpDC->SetTextColor(RGB(128,0,255));pDC->TextOut(-10,Wyt+20,CString("窗口"));CPen NewPen3,*pOldPen3;//定义3个像素宽度的画笔NewPen3.CreatePen(PS_SOLID,3,RGB(255,128,0));pOldPen3=pDC->SelectObject(&NewPen3);pDC->Rectangle(Wxl,Wyt,Wxr,Wyb);pDC->SelectObject(pOldPen3);NewPen3.DeleteObject();}(3)Cohen-Sutherland算法void CTestView::Cohen()//Cohen-Sutherland算法{CP2 p;//交点坐标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;return;}if(0==P[0].rc)//确保P[0]位于窗口之外{CP2 Temp;Temp=P[0];P[0]=P[1];P[1]=Temp;}UINT RC=P[0].rc;double k=(P[1].y-P[0].y)/(P[1].x-P[0].x);//直线段的斜率//窗口边界按左、右、下、上的顺序裁剪直线段if(RC & LEFT)//P[0]点位于窗口的左侧{p.x=Wxl;//计算交点y坐标p.y=k*(p.x-P[0].x)+P[0].y;}else if(RC & RIGHT)//P[0]点位于窗口的右侧{p.x=Wxr;//计算交点y坐标p.y=k*(p.x-P[0].x)+P[0].y;}else if(RC & BOTTOM)//P[0]点位于窗口的下侧{p.y=Wyb;//计算交点x坐标p.x=(p.y-P[0].y)/k+P[0].x;}else if(RC & TOP)//P[0]点位于窗口的上侧{p.y=Wyt;//计算交点x坐标p.x=(p.y-P[0].y)/k+P[0].x;}EnCode(p);P[0]=p;}}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;}(4)人机交互void CTestView::OnDrawpic(){// TODO: Add your command handler code herePtCount=0;bDrawLine=TRUE;MessageBox(CString("鼠标画线,剪刀裁剪"),CString("提示"),MB_OKCANCEL);Invalidate(FALSE);}运行结果:实验拓展:在屏幕上显示一个直线构成的图案,使用鼠标选择两点绘制矩形代表窗口对图案矩形裁剪。
《计算机图形学》习题
![《计算机图形学》习题](https://img.taocdn.com/s3/m/f99a3438c5da50e2524d7ff7.png)
一、名词解释计算机图形学、图形消隐、裁剪、走样、反走样、参数方程、曲线拟合、曲线插值、曲线的参数化、区域填充、扫描转换二、判断正误(正确写T,错误写F)1.存储颜色和亮度信息的相应存储器称为帧缓冲存储器,所存储的信息被称为位图。
2.光栅扫描显示器的屏幕分为m行扫描线,每行n个小点,整个屏幕分为m╳n个中点,其中每个小点称为一个像素。
3.点阵字符用一个位图来表示,位图中的0对应点亮的像素,用前景色绘制;位图中的1对应未点亮的像素,用背景色绘制。
4.矢量字符表示法用(曲)线段记录字形的边缘轮廓线。
5.将矢量字符旋转或放大时,显示的结果通常会变得粗糙难看,同样的变换不会改变点阵字符的显示效果。
6.在光栅图形中,区域是由相连的像素组成的集合,这些像素具有相同的属性值或者它们位于某边界线的内部。
7.多边形的扫描变换算法不需要预先定义区域内部或边界的像素值。
8.用DDA算法生成圆周或椭圆不需要用到三角运算,所以运算效率高。
9.找出并消除物体中的不可见部分,称为消隐。
10.经过消隐得到的图形称为消隐图。
11.深度缓存算法并不需要开辟一个与图像大小相等的深度缓存数组,深度缓存算法能并行实现,深度缓存算法中没有对多边形进行排序。
12.在种子填充算法中所提到的八向连通区域算法同时可填充四向连通区。
13.Bezier曲线不一定通过其特征多边形的各个顶点,Bezier曲线两端点处的切线方向必须与起特征折线集(多边形)的相应两端线段走向一致,Bezier曲线可用其特征多边形来定义。
14.由三个顶点可以决定一段二次B样条曲线,若三顶点共线时则所得到的曲线褪化为一条直线段。
15.插值得到的函数严格经过所给定的数据点。
16.参数曲线的表示有形式和几何形式两种。
17.L-B参数直线裁剪算法中的裁剪条件为uP k<=Q k,当直线平行于裁剪边界的条件Q k=0。
18.L-B参数直线裁剪算法中的裁剪条件为uP k<=Q k,当P k<0时表示线段从裁剪边界外部指向内部。
潘正风《数字测图原理与方法》笔记和课后习题(含真题)详解(计算机地图绘图基础)
![潘正风《数字测图原理与方法》笔记和课后习题(含真题)详解(计算机地图绘图基础)](https://img.taocdn.com/s3/m/b0a6dc4c79563c1ec5da7166.png)
第十章 计算机地图绘图基础10.1 复习笔记【知识框架】【重点难点归纳】一、基本图形显示1.坐标系(见表10-1-1)表10-1-1 坐标系坐标系 基本图形显示 点的裁剪 直线段的裁剪 二维图形裁剪 多边形的裁剪 圆弧和曲线的裁剪 独立符号的自动绘制 基本线型绘制 地形图地物符号的自动绘制 线状符号的自动绘制 平行线绘制 线状符号的绘制 多边形轮廓线内绘制晕线 面状符号的自动绘制 面状符号的绘制 网格法由距离加权平均求网格点高程 三角网法的三角网连接 在网格边上等高线点的平面位置 等高线的自动绘制 等高线点的寻找 在三角形边上等高线的平面位置 在网格上等高线点的追踪 在三角形网上等高线点的追踪 等高线的光滑 计算机地图绘图基础由下向上图10-1-1 计算机屏幕坐标系2.二维图形裁剪(1)点的裁剪在笛卡儿坐标系中,窗口左下角的坐标为,窗口右上角的坐标为若某一点的坐标为x、y,同时满足和,则该点在窗口内,否则在窗口外被裁掉。
(2)直线段的裁剪直线段的裁剪算法有多种,这里介绍编码裁剪算法。
这种方法由窗口的边界分成的9个区按一定的规则用四位二进制编码来表示。
这样,当线段的端点位于某一区时,该点的位置可以用其所在区域的四位二进制码来唯一确定,通过对线段两端点的编码进行逻辑运算,就可确定线段相对于窗口的关系。
(3)多边形的裁剪把整个多边形先相对于窗口的第一条边界裁剪,然后再把形成的新多边形相对于窗口的第二条边界裁剪,如此进行到窗口的最后一条边界,从而把多边形相对于窗口的全部边界进行了裁剪。
(4)圆弧和曲线的裁剪圆弧和曲线都可以用一组短的直线段来逼近,因此,圆弧和曲线的裁剪可采取对每一条短直线段的裁剪来实现对圆弧和曲线的裁剪。
二、地形图地物符号的自动绘制1.独立符号的自动绘制(1)首先建立表示这些符号特征点信息的符号库,独立符号特征点的数据采集是将图式上的独立符号和说明符号放大20倍绘在毫米格网纸上,进行符号特征点的坐标采集,采集坐标时均已符号的定位点作为坐标原点。
直线裁剪算法研究(Cohen_Sutherland算法和Liang_Barsky算法)
![直线裁剪算法研究(Cohen_Sutherland算法和Liang_Barsky算法)](https://img.taocdn.com/s3/m/b6ee93c851e79b89680226ec.png)
直线裁剪算法研究摘要:直线裁剪是计算机图形学中的一个重要技术,在对常见的直经线裁剪的算法分析的基础上,针对Cohen-Sutherland算法和Liang-Barsky算法进行了分析研究。
并对两种算法了计算直线与窗口边界的交点时,进行了有效有比较。
关键词:裁剪;算法;Cohen-Sutherland;Liang-Barsky;1 引言直线是图形系统中使用最多的一个基本元素。
所以对于直线段的裁剪算法是被研究最深入的一类算法,目前在矩形窗口的直线裁剪算法中,出现了许多有效的算法。
其中比较著名的有:Cohen-Sutherland算法、中点分割算法、Liang-Ba rsky算法、Sobkow-Pospisil-Yang 算法,及Nicholl-Lee-Ncholl算法等。
2 直线裁剪的基本原理图1所示的为直线与窗口边界之间可能出现的几种关系。
可以通过检查直线的两个端点是否在窗口之确定如何对此直线裁剪。
如果一直线的两个端点均在窗口边界之(如图1中P5到P6的直线),则此直线应保留。
如果一条直线的一个端点在窗口外(如P9)另一个点在窗口(如P10),则应从直线与边界的交点(P9)处裁剪掉边界之外的线段。
如果直线的两个端点均在边界外,则可分为两种情况:一种情况是该直线全部在窗口之外;另一种情况是直线穿过两个窗口边界。
图中从P3到P4的直线属于前一种情况,应全部裁剪掉;从P7到P8的直线属于后一种情况,应保留P7到P8的线段,其余部分均裁剪掉。
图1直线相对干窗口边界的栽剪直线裁剪算法应首先确定哪些直线全部保留或全部裁剪,剩下的即为部分裁剪的直线。
对于部分裁剪的直线则首先要求出这些直线与窗口边界的交点,把从交点开始在边界外的部分裁剪掉。
一个复杂的画面中可能包含有几千条直线,为了提高算法效率,加快裁剪速度,应当采用计算量较小的算法求直线与窗口边界的交点。
3 cohen-sutherland直线裁剪算法Cohen-Sutherland算法的大意是:对于每条线段P1P2,分为3种情况处理。
cohen-sutherland 直线段裁剪算法
![cohen-sutherland 直线段裁剪算法](https://img.taocdn.com/s3/m/9f26ee6159fb770bf78a6529647d27284b7337fc.png)
Cohen-Sutherland 直线段裁剪算法是一种计算机图形学中的算法,用于裁剪二维图形中超出指定矩形区域的线段。
算法步骤如下:
定义四个常量,分别表示矩形区域的四个边界:TOP, BOTTOM, LEFT, RIGHT。
对于每条待裁剪的线段,计算其与矩形区域的交集情况,可以使用一个 4 位的二进制数表示,其中每一位分别表示线段与矩形上、下、左、右边界的交集情况。
例如,如果线段与矩形上边界有交集,则二进制数的第 0 位为 1,否则为 0。
根据线段的端点坐标和矩形区域的边界坐标,判断线段与矩形区域的相对位置关系,可以分为以下三种情况:
a. 线段完全在矩形区域内,不需要裁剪,直接保留。
b. 线段完全在矩形区域外,不需要裁剪,直接舍弃。
c. 线段部分在矩形区域内,部分在矩形区域外,需要进行裁剪。
4. 对于需要裁剪的线段,根据其与矩形边界的交点坐标,将线段裁剪成两部分,分别计算每部分与矩形区域的交集情况,并递归进行裁剪,直到所有线段都被处理完毕。
Cohen-Sutherland 直线段裁剪算法可以快速地裁剪二维图形中超出指定矩形区域的线段,是计算机图形学中的常用算法之一。
论述cohen-suthorland直线段裁剪算法的编码原理
![论述cohen-suthorland直线段裁剪算法的编码原理](https://img.taocdn.com/s3/m/a41566b64793daef5ef7ba0d4a7302768f996f55.png)
论述cohen-suthorland直线段裁剪算法的编码原理1. 引言1.1 概述Cohen-Sutherland直线段裁剪算法是一种常用的计算机图形学算法,用于确定直线段是否与给定裁剪窗口相交,从而实现对直线段的裁减。
该算法以编码方式表示直线段位置关系,并根据编码结果进行裁剪判断,具有简单高效的特点,在计算机图形学领域得到广泛应用。
1.2 文章结构本文将详细论述Cohen-Sutherland直线段裁剪算法的编码原理及实现过程。
首先介绍算法的背景和相关概念,解释其在计算机图形学中的重要性。
接下来,详细说明Cohen-Sutherland算法的步骤以及编码方法,并阐述其实现过程中所需进行的初始化设置、裁剪区域判定和直线段裁剪计算等操作。
然后,通过效果评估对该算法进行评价,并分析其优点和缺点。
最后,总结论述并提出在进一步研究方向上可能存在的建议。
1.3 目的本文旨在深入探讨Cohen-Sutherland直线段裁剪算法的编码原理及其应用。
通过对该算法进行详细的解释和分析,读者将能够全面了解算法的工作原理,并具备实现及优化该算法的能力。
此外,我们也希望通过对其效果的评估和优缺点的分析,为使用该算法的工程师和学术研究人员提供参考,以便更好地选择合适的裁剪算法并应用于具体问题中。
2. Cohen-Sutherland直线段裁剪算法的编码原理2.1 算法简介Cohen-Sutherland直线段裁剪算法是一种常用的二维直线段裁剪方法,它通过将裁剪区域划分为9个小区域来判断并去除不需要显示的部分,从而实现快速而准确的线段裁剪。
2.2 算法步骤Cohen-Sutherland直线段裁剪算法主要包括以下步骤:步骤1:对于给定的两个端点P1和P2,首先利用编码方法将两个端点进行编码。
编码中使用4位二进制数表示每个点所处位置。
步骤2:根据编码结果判断两个端点是否在裁剪区域内。
如果两个端点的编码值为0000(即都在可视范围内),则可以直接输出该线段;否则,执行下一步。
计算机图形学--第五讲 裁剪的基本概念与直线裁剪
![计算机图形学--第五讲 裁剪的基本概念与直线裁剪](https://img.taocdn.com/s3/m/bc8080b34b35eefdc8d333e2.png)
12直线生成算法圆与椭圆的绘制算法5图元的概念436区域填充算法裁剪反走样技术4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—算法实现◆第一步◆第二步4.5 裁剪—编码实现(第一步)九个区域,每一个区域采用四位编码对于任一端点左),赋予一个◆左:若◆右:若◆下:若◆上:若4.5 裁剪—编码实现(第一步)对要被裁剪的线段的两个端点,如果其所在的区域的编码均是如果两个编码的见的,可简弃之;如果两个编码的少一个端点非在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之。
再对另一段重复进行上述处理,直到该线段完全被舍弃或找到位于窗口内的一段线段为止。
4.5 裁剪—析出点。
求出其交点见的,因而只要对上述处理步骤。
y=裁剪结束。
算法步骤界坐标:code2(0100)之,转则交换段与窗口边界的交点除p算法的编码实现到另一端点间的线段重复上述过程直到接受或拒绝;计算线段if(LEFT&codeelse if(RIGHT&codeelse if(BOTTOM&code {y=YB;else if(TOP & code !=0) {y=YT;Cohen-SutherlandNicholl et al. An efficient new algorithm for 2-D line clipping: its4.5 裁剪—4.5 裁剪—4.5 裁剪—(((4.5 裁剪—)界L上;要条件A和该处内法向量P(t)4.5 裁剪—)。
4.5 裁剪—)终点组:N i ⋅(P 2-P 1)<0 起点组:N i ⋅(P 2-P 1)>0 特殊情况:N i ⋅(P 2-P 1)=0这时,,P 1P 2与对应边平行, 这时有两种情况:线段在区域外侧或内侧:前一种情况对应于N i ⋅(P 2-P 1)<0,可直接判断线段在多边形之外前一种情况对应于N i ⋅(P 2-P 1)>0,则不于考虑,继续处理其他边。
计算机图形学试题及答案 (2)
![计算机图形学试题及答案 (2)](https://img.taocdn.com/s3/m/2cc4976969eae009581becf3.png)
一、 判断题(10x1=10分)1、 构成图形的要素可分为两类:刻画形状的点、线、面、体的非几何要素与反映物体表面属性或材质的明暗、色彩等的几何要素。
( 错误 )2、 参数法描述的图形叫图形;点阵法描述的图形叫图像。
( 正确 )3、 EGA/VGA 为增强图形显示效果的一种图形处理软件的名称。
( 错误 )4、 对山、水等不规则对象进行造型时,大多采用过程式模拟方法。
( 正确 )5、 若两个图形是拓扑等价的,则一个图形可通过做弹性运动与另一个图形相重合。
( 正确 )6、 0阶参数连续性和0阶几何连续性的定义是相同的。
( 正确 )7、 Bezier 曲线可做局部调整。
( 错误 )8、 字符的图形表示分为点阵和矢量两种形式。
( 正确 )9、 LCD 表示发光二极管显示器。
( 错误 )10、 使用齐次坐标可以将n 维空间的一个点向量唯一的映射到n+1维空间中。
( 错误 ) 二、 填空题(15x2=30分)1、目前常用的PC 图形显示子系统主要由3个部件组成:(1)帧缓冲存储器、(2)显示控制器、(3)ROM BIOS 。
2、 图形的输入设备有(4)键盘、鼠标、光笔(至少写三种);图形的显示设备有(5)CRT 显示器、LCD 、投影仪(至少写三种)。
3、常用坐标系一般可以分为:建模坐标系、用户坐标系、(6观察坐标系、(7)规格化设备坐标系、(8)设备坐标系。
4、在多边形的扫描转换过程中,主要是通过确定穿越多边形区域的扫描线的覆盖区间来填充,而区域填充则是从(9)给定的位置开始涂描直到(10)指定的边界条件为止。
5、一个交互式计算机图形系统应具有(11)计算 、(12)存储、(13)对话、(14)输入和输出等五个方面的功能。
三、 简答题(5x6=30分)1、 请列举常用的直线段裁减算法(四种)。
答:答:直接求交算法、编码算法、中点再分算法、Cyrus-Beck 算法。
2、 考虑三个不同的光栅系统,分辨率依次为480640⨯,10241280⨯,20482560⨯。
计算机图形学期末复习题
![计算机图形学期末复习题](https://img.taocdn.com/s3/m/bb5b422bee06eff9aef807bc.png)
计算机图形学复习题1.X扫描线算法中,每次用一条扫描线进行填充,对一条扫描线填充的过程可分为4个步骤:求交、排序、配对、填色。
2. 一组型值点来指定曲线曲面的形状时,形状完全通过给定的型值点列,用该方法得到的曲线曲面称为曲线曲面的插值,而用控制点列来指定曲线曲面的形状时,得到的曲线曲面不一定通过控制点列,该方法称为曲线曲面的拟合。
3. 在中点画线算法中(假设直线的斜率0<k<1),设已确定点亮象素点P(Xp,Yp),则下一个与直线最接近的像素点的坐标是(Xp+1,Yp)和(Xp+1,Yp+1),设这两点的中点为M。
构造判别式d=F(M)(F(x,y)=ax+by+c=0是直线的方程);则若d>0,下一个点取(Xp+1,Yp),d的增量表达式为d+=2*a;若d<0,下一个点取(Xp+1,Yp+1),d的增量表达式为d+=2*(a+b)。
4. 种子填充算法的填充区域可以分为四连通区域和八连通区域。
5、在生成圆弧的正负法中,设圆的方程为F(x,y)=X2+Y2-R2=0;假设求得Pi的坐标为(xi,yi);则若F(xi,yi)<0,下一个点取(xi+1,yi);若F(xi,yi)>0,下一个点取(xi,yi-1)。
6、在Cohen-Sutherland线段裁剪算法中,假设线段P1P2的编码分别为CODE1、CODE2,则若code1=code2=0成立,表示线段P1P2是显然可见线段;若code1&code2!=0成立,表示线段P1P2是显然不可见线段。
7.常用的直线扫描转换算法有:数值微分法,中点画线法,Bresenham算法。
8.曲线和曲面的基本表示方法有两种:参数表示,非参数表示。
9.反走样的目的是_用于减少或消除走样现象的技术。
10、编码法是一种适合于裁剪_直线段的裁剪算法11、根据消隐空间的不同,消隐算法分为__物体空间__的消隐和___图像空间_的消隐。
计算机图形学 实验四 二维图形的裁剪
![计算机图形学 实验四 二维图形的裁剪](https://img.taocdn.com/s3/m/de0ee3f319e8b8f67c1cb9a4.png)
西北农林科技大学实习报告学院名称:理学院专业班级:姓名:学号:课程:计算机图形学实验报告日期:第十五周实验四二维图形的裁剪一、实验目的1)加深直线段的剪裁算法的理解。
2)熟练掌握一种裁剪算法的编程方法。
二、实验步骤1)分析直线段和矩形窗口的位置关系,选定比较合理算法流程。
2)画出程序流程图。
3)编写程序的源程序。
4)编辑源程序并进行调试。
5)进行特殊模式的运行测试,并结合情况进行调整。
三、实验内容1)在编码算法、中点分割算法、Liang-Barsky算法三种中任选一种作为编程模型。
2)编写直线段裁剪的源程序。
3)建议有能力的学生编写多边形裁剪程序。
4)在计算机上编辑编译运行,实现直线段的裁剪。
原理1.直线和窗口的关系:直线和窗口的关系可以分为如下3类:(1)整条直线在窗口内。
此时,不需剪裁,显示整条直线。
(2)整条直线在窗口外,此时,不需剪裁,不显示整条直线。
(3)部分直线在窗口内,部分直线在窗口外。
此时,需要求出直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部分。
直线剪裁算法有两个主要步骤。
首先将不需剪裁的直线挑出,即删去在窗外的直线。
然后,对其余直线,逐条与窗框求交点,并将窗口外的部分删去。
2.Cohen-Sutherland直线剪裁算法:(1)输入直线段的两端点坐标p1(x1,y1),p2(x2,y2),以及窗口的4条边界坐标,y wt ,y wb,y wl,y wr.(2)对p1,p2进行编码,点p1的编码为code1,点p2的编码为code2.(3)若code1| code2=0,对直线p1p2“简取”之,转(6);否则,若code1& code2≠0,对直线段“简弃”之,转(7);当上述两条均不满足时,进行步骤(4)。
(4)确保p1在窗口外部。
若p1在窗口内,则交换p1和p2的坐标值和编码。
(5)根据p1编码从低位开始寻找值为1的地方,从而确定p1在窗口外的哪一侧,然后求出直线段与相应窗口边界的交点S,并用交点S的坐标值替换p1的坐标值,即在交点S处把线段一分为二,因此可以去掉p1S。
第6章图形裁剪
![第6章图形裁剪](https://img.taocdn.com/s3/m/9a2bd25187c24028905fc31f.png)
下面假定裁剪是针对用户坐标系中窗口边界进行的, 裁剪完成后,再把窗口内图形映射到视区。所以裁剪的 目的是显示可见点和可见部分,删除视区外的部分。
第六章 图形裁剪(Clipping)
在用户坐标系中定义的图形往往是大而复杂的,而 输出设备如显示屏幕的尺寸及其分辨率却是有限的,为 了能够清晰地观察某一部分或对其进行某些绘图操作, 就需要将所关心的这一局部区域的图形从整个图形中区 分出来,这个区分指定区域内和区域外的图形过程称为裁 剪,所指定的区域称为裁剪窗口。
在用户坐标中设置观察坐标系,在观察坐标系中定 义一个观察窗口。观察坐标系用来任意设置矩形窗口的 方向。一旦建立了观察参考系,就可以将用户坐标系下 的描述变换到观察坐标系下。
2019/11/18
计算机图形学演示稿 纪玉波制作
2
(C)
2019/11/18
计算机图形学演示稿 纪玉波制作
3
(C)
3.规范化设备坐标系(Normalized Device Coordinates) 在规范化坐标系下(取值范围从0到1)定义视区,将
设备坐标定义,一般也定义成矩形,由其左下角和右上角两
点坐标来定义。所以,用户可以利用窗口来选择需要观察那
一部分图形,而利用视图区来指定这一部分图形在屏幕上显
示的位置。标准的窗口区和视图区一般都是矩形,其各边分
别与坐标轴平行。
2019/11/18
计算机图形学演示稿 纪玉波制作
6
(C)
用户定义的图形从窗口区到视图区的输出过程如下: 从 应 用 程 序 得 到 图 形 的 用 户 坐 标 (WC-World Coordinates)→对窗口区进行裁剪(WC)→窗口区到视图区的 规格化变换(NDC-Normalized Device Coordinate) →视图区 从 规 格 化 设 备 系 到 设 备 坐 标 系 的 变 换 (DC-Device Coordinate)→在图形设备上输出图形。
计算机图形学-实验五直线和多边形的裁剪
![计算机图形学-实验五直线和多边形的裁剪](https://img.taocdn.com/s3/m/fa3f4c3b876fb84ae45c3b3567ec102de2bddf26.png)
大学实验报告学院:计算机科学与信息学院专业:软件工程班级:102班** 实验组实验时间指导教师成绩实验工程名称实验五直线和多边形的裁剪实验目的掌握直线段的裁剪算法以及多边形的裁剪算法实验要求熟练掌握直线段的裁剪算法以及多边形的裁剪算法的根本原理,并编写测试代码进展实验。
实验原理Cohen-Sutherland直线剪裁算法以区域编码为根底,将窗口及其周围的,8个方向以4 bit的二进制数进展编码。
右图所示的编码方法将窗口及其邻域分为5个区域:⑴域:区域(0000)。
⑵上域:区域(1001, 1000, 1010)。
⑶下域:区域(0101, 0100, 0110)。
⑷左域:区域(1001, 0001, 0101)。
⑸右域:区域(1010, 0010, 0110)。
当线段的两个端点的编码的逻辑"与〞非零时,线段为显然不可见的,对*线段的两个端点的区号进展位与运算,可知这两个端点是否同在视区的上、下、左、右;Cohen-Sutherland直线剪裁算法的算法思想是:对于每条线段P1P2分为三种情况处理。
〔1〕假设P1P2完全在窗口,则显示该线段P1P2简称"取〞之。
〔2〕假设P1P2明显在窗口外,则丢弃该线段,简称"弃〞之。
〔3〕假设线段既不满足"取〞的条件,也不满足"弃〞的条件,则在交点处把线段分为两段。
其while (code1 != 0 || code2 != 0) {if ((code1 & code2) != 0) {// 两端点的编码相与不为0,表示直线在窗口外return;}if (code1 != 0) {code = code1;} else {code = code2;}if ((LEFT & code) != 0) {// 直线的端点与矩形窗口的左边编码相与!=0* = *L;y = y1 + (y2 - y1) * (*L - *1) / (*2 - *1);// 求直线与矩形窗口的左边界的交点} elseif ((RIGHT & code) != 0) {// 直线的端点与矩形窗口的右边编码相与!=0* = *R;y = y1 + (y2 - y1) * (*R - *1) / (*2 - *1);// 求直线与矩形窗口的右边界的交点} elseif ((BOTTOM & code) != 0) {// 直线的端点与矩形窗口的下边编码相与!=0y = YB;* = *1 + (*2 - *1) * (YB - y1) / (y2 - y1);// 求直线与矩形窗口的下边界的交点} elseif ((TOP & code) != 0) {// 直线的端点与矩形窗口的上边编码相与!=0y = YT;* = *1 + (*2 - *1) * (YT - y1) / (y2 - y1);// 直线的端点与矩形窗口的上// 边编码相与!=0}if (code == code1) {*1 = *;y1 = y;code1 = encode(*, y);} else {*2 = *;y2 = y;code2 = encode(*, y);}}g.drawLine((int) (*1 + 0.5), (int) (y1 + 0.5), (int) (*2 + 0.5),(int) (y2 +0.5));}二、多边形裁剪的核心代码为:通过点集画直线或者多边形:privatevoid draw() {//通过点集画直线或者多边形for (int i = 1; i < points.size(); i++) {Point p1 = new Point();p1 = points.get(i);int *1 = (int) p1.get*();int y1 = (int) p1.getY();Point p2 = new Point();p2 = points.get(i - 1);int *2 = (int) p2.get*();int y2 = (int) p2.getY();g.drawLine(*1, y1, *2, y2);}}多边形的裁剪函数:private Point[] cutPicture(Point[] point, Point[] edge) {// 剪裁函数,参数为〔点集,边〕Point[] intersectPoint = new Point[20];//存放交点的集合for (int j = 0; j < 20; j++) {intersectPoint[j] = new Point();}Point s = new Point();Point p = new Point();Point t = new Point();int i = 0;int length = point.length;s = point[length - 1];for (int j = 0; j < length; j++) {p = point[j];if (inside(p, edge)) {// sp在窗口,情况1if (inside(s, edge)) {intersectPoint[i] = p;i += 1;} else {// s在窗口外,情况4t = intersect(s, p, edge);intersectPoint[i] = t;i += 1;intersectPoint[i] = p;i += 1;}} elseif (inside(s, edge)) {// s在窗口,p在窗口外,情况3t = intersect(s, p, edge);intersectPoint[i] = t;i += 1;}// 情况2没有输出s = p;}List<Point> tempList = new ArrayList<Point>();for (int k = 0; k < i; k++) {if (intersectPoint[k] != null) {Point pt = intersectPoint[k];tempList.add(pt);}}Point[] temp = new Point[tempList.size()];for (int j = 0; j < tempList.size(); j++) {temp[j] = new Point();temp[j] = tempList.get(j);}intersectPoint = temp;return intersectPoint;}判断点是否在裁剪边的可见侧:privateboolean inside(Point point, Point[] edge) {//判断点是否在裁剪边的可见侧// 裁剪边为窗口下边if ((edge[0].y == edge[1].y) && (edge[0].* < edge[1].*)) {if (point.y >= edge[0].y) {returntrue;}}// 裁剪边为窗口上边if ((edge[0].y == edge[1].y) && (edge[0].* > edge[1].*)) {if (point.y <= edge[0].y) {returntrue;}}// 裁剪边为窗口右边if ((edge[0].* == edge[1].*) && (edge[0].y < edge[1].y)) {if (point.* <= edge[0].*) {returntrue;}}// 裁剪边为窗口左边if ((edge[0].* == edge[1].*) && (edge[0].y > edge[1].y)) {if (point.* >= edge[0].*) {returntrue;}}returnfalse;}直线段与窗口边界求交:private Point intersect(Point s, Point p, Point[] edge) {//直线段与窗口边界求交,并返回交点Point t = new Point();if (edge[0].y == edge[1].y) {// 水平裁剪边t.y = edge[0].y;t.* = s.* + (edge[0].y - s.y) * (p.* - s.*) / (p.y - s.y);} elseif (edge[0].* == edge[1].*) {// 垂直裁剪边t.* = edge[0].*;t.y = s.y + (edge[0].* - s.*) * (p.y - s.y) / (p.* - s.*);}return t;}鼠标的监听类〔部类〕:class MouseMonitor e*tends MouseAdapter {//通过鼠标的单击获取点,并画出直线或者多边形publicvoid mouseClicked(MouseEvent e) {points.add(e.getPoint());if (points.size() > 1) {draw();}}}键盘的监听类〔部类〕:class KeyMonitor e*tends KeyAdapter {// 键盘控制publicvoid keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_R:// 清空画布和点集panel.repaint();points.removeAll(points);break;case KeyEvent.VK_W://对裁剪窗口的处理g.setColor(Color.RED);g.drawRect(*L, YB, *R - *L, YT - YB);//存放裁剪窗口的边top = new Point[2];// 存放裁剪窗口的上边top[0] = new Point(*L, YB);top[1] = new Point(*R, YB);right = new Point[2];//存放裁剪窗口的右边right[0] = new Point(*R, YB);right[1] = new Point(*R, YT);bottom = new Point[2];//存放裁剪窗口的下边bottom[0] = new Point(*R, YT);bottom[1] = new Point(*L, YT);left = new Point[2];//存放裁剪窗口的左边left[0] = new Point(*L, YT);left[1] = new Point(*L, YB);break;case KeyEvent.VK_A://对直线段进展裁剪g.setColor(Color.GREEN);Point p1 = points.get(0);Point p2 = points.get(1);lineCut(p1.get*(), p1.getY(), p2.get*(), p2.getY()); break;case KeyEvent.VK_B://对多边形进展裁剪source = new Point[points.size()];//得到多边形的点for (int i = 0; i < points.size(); i++) {source[i] = points.get(i);}g.setColor(Color.GREEN);wT = cutPicture(source, top);//得到多边形与裁剪窗口上边的交点wR = cutPicture(wT, right);//得到多边形与裁剪窗口右边的交点wB = cutPicture(wR, bottom);//得到多边形与裁剪窗口下边的交点wL = cutPicture(wB, left);//得到多边形与裁剪窗口左边的交点第二种情况:线段在裁剪窗口的部,线段完全可见。
试用编程裁剪法
![试用编程裁剪法](https://img.taocdn.com/s3/m/f37a13320166f5335a8102d276a20029bd646391.png)
试用编程裁剪法
(1) 用户可以先点击“画矩形”按钮,然后在绘图区按住鼠标并拖动,便能绘制出一个用户想要的矩形。
(2)点击“画直线”按钮,然后在绘图区的任意两个位置分别用鼠标点击一-下(即确定直线的两个端点),便可以绘制出一条用户想要的直线。
(3) 点击“裁剪”按钮,便执行裁剪算法,即进行直线段的裁剪,并会把裁剪的最终结果以图形的形式反映在绘图区.上。
(4) 点击“清屏”按钮,可实现屏幕的清屏,方便用户重新绘制矩形和直线段。
根据书本的步骤编写Cohen- Sutherland算法,感觉思路很清晰,就是把代码模块化,尽量一个方法里面的代码行数不要超过30行。
这也方便以后的维护和修改。
当怎么来验证我这个算法的编写是否正确呢?简单的输入几个参数值,再看输出结果,显然不够直观。
所以,便参阅了一些JAVA编程的书籍,比如《JAVA语言与面向对象程序设计》-清华大学出版社,《JAVA 参考大全》之类的书籍。
主要是看图形绘制部分和响应鼠标事件的代码实现。
例题代码看懂了,以为模仿一下就可以实现我的实验目的了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验:直线段的裁剪
姓名:龙泽学号:20141090068 指导教师:吴昊
实验内容:采用Liang-Barsky算法对直线段进行裁剪。
实验设计:本次实验采用的是Liang-Barsky算法,根据这个算法需先定义直线段的起点坐标(x1,y1),终点坐标(x2,y2),以及裁剪框(矩形)的左边界(wxl),右边界(wxr),上边界(wyt),下边界(wyb),如void Line_Clipping(float x1, float y1, float x2, float y2,float Wxl,float Wxr,float Wyt,float Wyb),再结合鼠标mouse函数,实现点击鼠标左键显示矩形框和待裁剪的直线段,点击鼠标右键进行裁剪并显示裁剪过后的直线段,最终显示出来。
由于在Line_Clipping函数下用到了line函数,所以我在上面定义了个line 函数来绘制直线段(绘制直线段所采用的算法为Bresenham算法)。
程序代码:
#include <windows.h>
#include <GL/glut.h>
//初始化OpenGL场景
void myinit (void)
{
glClearColor (1, 1,1, 0); //将背景置成白色
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,500,0,500); //设置投影变换,使用正交投影
}
void setPixel(int x, int y)//在指定位置(x,y)绘制点图元
{
glBegin (GL_POINTS);
glVertex2i(x,y);//绘制点的坐标
glEnd ( );
}
// 绘制直线的方法
void line (int x1,int y1,int x2,int y2)//输入线段的两个端点坐标和画线颜色
{
int x,y,dx,dy,s1,s2,p,temp,interchange,i;
x=x1;
y=y1;//设置象素坐标初值
dx=abs(x2-x1);
dy=abs(y2-y1);//分别计算之间的差值
if(x2>x1)
s1=1;
else
s1=-1;
if(y2>y1)
s2=1;
else
s2=-1; //判断起点和终点的位置,以确定是该加一个单位还是该减一个单位
if(dy>dx)//y方向增长快,将总步数设为y2-y1,每一步的y值为:y=y+1
{
temp=dx;
dx=dy;
dy=temp;
interchange=1;
}
else
interchange=0;//x方向增长快,将总步数设为x2-x1,每一步的x值为:x=x+1
p=2*dy-dx; //设置初始误差判别值
for(i=1;i<=dx;i++)
{
setPixel(x,y);
if(p>=0)
{
if(interchange==0)
y=y+s2;
else
x=x+1;
p=p-2*dx;
}
if(interchange==0)
x=x+s1;
else
y=y+s2;
p=p+2*dy;
}
}
//Liang-Barsky算法
int Clip_Top(float p,float q,float &umax,float &umin)
{ float r=0.0;
if(p<0.0) //线段从裁剪窗口外部延伸到内部,取最大值r并更新umax
{ r=q/p;
if (r>umin) return 0; //umin>umax的情况,弃之
else if (r>umax) umax=r;
}
else if(p>0.0) //线段从裁剪窗口内部延伸到外部,取最小值r并更新umin
{ r=q/p;
if (r<umax) return 0; //umin>umax的情况,弃之
else if(r<umin) umin=r;
}
else //p=0时,线段平行于裁剪窗口
if(q<0.0) return 0;
return 1;
}
void Line_Clipping(float x1, float y1, float x2, float y2,float Wxl,float Wxr,float Wyt,float Wyb)//定义线段的坐标和矩形的四条边界
{
float dx=x2-x1,dy=y2-y1,umax=0.0,umin=1.0;
//比较左、右边界,获得最大的umax
if (Clip_Top(-dx,x1-Wxl,umax,umin)) //左边界
if (Clip_Top(dx,Wxr-x1, umax,umin))//右边界
//比较下、上边界,获得最小的umin
if (Clip_Top(-dy,y1-Wyb, umax,umin))//下边界
if (Clip_Top(dy,Wyt-y1, umax,umin))//上边界
line((int)(x1+umax*dx),(int)(y1+umax*dy),(int)(x1+umin*dx),
(int)(y1+umin*dy));
}
void display(void)//需要点击鼠标显示,所以这里的display函数下为空
{
}
//鼠标响应函数,控制当鼠标接收到不同的用户操作时将要执行的后续命令。
void mouse(int button, int state, int x, int y)
{
Float x1=70,y1=480,x2=480,y2=80, Wxl=100,Wxr=400,Wyt=400,Wyb=200;//给定直线和矩形的各项参数数值
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)//如果按下鼠标左键,则显示矩形和待裁剪的直线段
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除缓存
glColor3f(0,0,0); //给定矩形线条的颜色
line(Wxl,Wyt,Wxr,Wyt); //定义矩形的上边界
line(Wxl,Wyb,Wxr,Wyb); //定义矩形的下边界
line(Wxr,Wyb,Wxr,Wyt); //定义矩形的右边界
line(Wxl,Wyb,Wxl,Wyt); //定义矩形的左边界
glColor3f(0,0,255); //给定直线的颜色
line (x1,y1,x2,y2); //给定直线的起点坐标和终点坐标
glFlush (); //绘图结束
break;
case GLUT_MIDDLE_BUTTON:
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)//如果按下鼠标右键,则显示裁剪过后的直线段
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除缓存
glColor3f(0,0,0); //给定剪裁后的矩形的颜色
line(Wxl,Wyt,Wxr,Wyt);
line(Wxl,Wyb,Wxr,Wyb);
line(Wxr,Wyb,Wxr,Wyt);
line(Wxl,Wyb,Wxl,Wyt); //分别给定矩形的四条边的坐标 glColor3f(255,0,0); //给定剪裁后的直线的颜色
Line_Clipping(x1,y1,x2,y2,Wxl,Wxr,Wyt,Wyb); //调用上面的Line_Clipping函数进行裁剪
glFlush (); //绘图结束
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); //初始化glut
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //初始化显示模式,采用单缓存,RGB彩色系统
glutInitWindowSize (500, 500); //初始化窗口大小
glutInitWindowPosition (100, 100); // 初始化窗口位置
glutCreateWindow ("直线的裁剪"); //创建窗口
myinit (); //自定义初始化
glutDisplayFunc(display); //注册显示函数
glutMouseFunc(mouse);
glutMainLoop(); //进入OpenGL的主循环。
开始工作
return 0;
}
实验结果:
经过大量的调试以后,运行的结果如下:
点击鼠标左键如图:
点击鼠标右键如图:。