当前位置:文档之家› 多边形裁剪的Sutherland―Hodgman算法(计算机图形学)

多边形裁剪的Sutherland―Hodgman算法(计算机图形学)

多边形裁剪的Sutherland―Hodgman算法(计算机图形学)
多边形裁剪的Sutherland―Hodgman算法(计算机图形学)

多边形裁剪的Sutherland—Hodgman算法

1>. Sutherland—Hodgman多边形裁剪算法思想

该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,…,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。

当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):

1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;

2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;

3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列;

4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。

2>. Sutherland—Hodgman多边形裁剪算法步骤

考虑多边形相对于一条边界及其延长线进行裁剪的算法:

1.从主函数得到待裁剪多边形的顶点序列P[][2]、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界);

2.赋初值:

将顶点序列中的最后一个顶点赋给前一顶点S;

设置初始标志flag:

if(S在边界内侧)flag=0;

else flag=1;

设新的顶点序列数j=0;

3.对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列

Q[][2]中:

for(对第一个顶点直到最后一个顶点,逐一处理){if(Pi在边界内

侧){if(flag!=0){flag=0;

求交点并放入新的多边形顶点序列Qjxx;

j++;}将当前顶点放入新的多边形顶点序列Qj中:

Qj=Pi;

j++;}else{if(flag==0){flag=1;

求交点并放入新的多边形顶点序列Qjxx;

j++;}}

将当前顶点赋给S:

S=Pi;}

4.做返回准备:

将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中:

P=Q;

将新的多边形顶点数j放回原多边形顶点数n中:

n=j;

//////////////////////////////////////////////////////////////////////////////////// //

//-----多边形裁剪的Sutherland—Hodgman算法---------//

//////////////////////////////////////////////////////////////////////////////////// /

void CMyClip_AView:

:ClipedgeL(CPoint polypoint[], CPoint clipwindow[],UINT polynum)

/*其中参数polypoint[]为多边形顶点,clipwindow[]为裁剪窗口顶点,polynum 为多边形顶点数目*/{//找出裁剪窗口边界

long xl,xr,yt,yb;

UINT i;

xl=clipwindow[0].x;

xr=clipwindow[0].x;

yt=clipwindow[0].y;

yb=clipwindow[0].y;

for(i=1;i<=4;i++){if(xl>clipwindow[i].x)

xl=clipwindow[i].x;

if(xr

xr=clipwindow[i].x;

if(yb>clipwindow[i].y)

yb=clipwindow[i].y;

if(yt

yt=clipwindow[i].y;}//

CPoint B[Polygon_Num],C[Polygon_Num];

UINT m_nA,m_nB;

int x,y;

long tem1,tem2;

m_nA=polynum;/*记载原始多边形顶点个数*/

m_nB=0;/*记载新生成多边形顶点个数*/

for(i=0;i=xl && polypoint[i+1].x>=xl) /*边两个端点都在内部,保留*//*因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到,因此只保留的两个点中的第一个*/{B[m_nB].x =polypoint[i].x ;

B[m_nB].y =polypoint[i].y ;

m_nB=m_nB+1;

continue;}if(polypoint[i].x=xl)/*边两个端点起点在外部,终点在内部,求交点,然后交点,终点都应该送入临时数组*/{/*保留交点*/

x=xl;

tem1=(xl-polypoint[i].x);

//tem2=(xl-x1)*dy/dx+y1;

//y/x=dy/dx---->y=x*dy/dx

tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-

polypoint[i].x)+polypoint[i].y;

y=tem2;

B[m_nB].x =x;

B[m_nB].y =y;

m_nB=m_nB+1;

continue;}if(polypoint[i].x>=xl && polypoint[i+1].x

{/*保留内部点*/

B[m_nB].x =polypoint[i].x ;

B[m_nB].y =polypoint[i].y ;

m_nB=m_nB+1;

/*保留交点*/

x=xl;

tem1=(xl-polypoint[i].x);

tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-

polypoint[i].x)+polypoint[i].y;

y=tem2;

B[m_nB].x =x;

B[m_nB].y =y;

m_nB=m_nB+1;

continue;}}

//把第一个点的数据拷贝到最后

//形成裁剪后的多边形

if(i==m_nA){B[m_nB]=B[0];}//下------------------

m_nA=0;

for(i=0;i

//两个点全在下方{continue;//下一条边}if(B[i].y>=yb && B[i+1].y>=yb) //p1,p2都在yb上方{C[m_nA].x =B[i].x;

C[m_nA].y =B[i].y;

m_nA++;

continue;}if(B[i].y=yb)

//p1在下,P2在上,留交点,外->内{y=yb;

tem1=yb-B[i].y;

//tem2=x1+(yb-y1)*dx/dy

tem2=tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y) + B[i].x;

x=tem2;

C[m_nA].x =x;

C[m_nA].y =y;

m_nA++;

continue;}if(B[i].y>=yb && B[i+1].y

//p1在上方,P2在下方,留P1和交点,内-外{//save p1

C[m_nA].x=B[i].x;

C[m_nA].y=B[i].y;

m_nA++;

//留交点

y=yb;

tem1=yb-B[i].y;

//tem2=x1+(yb-y1)*dx/dy

tem2=tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y)+B[i].x;

x=tem2;

C[m_nA].x =x;

C[m_nA].y =y;

m_nA++;

continue;}}

//形成第二次裁剪多边形

if(i==m_nB){C[m_nA]=C[0];}//右------------------

m_nB=0;

for(i=0;ixr && C[i+1].x>xr)

//P1,P2都在右方--go next{continue;}if(C[i].x<=xr && C[i+1].x<=xr) //P1,P2都在左方,留P1{B[m_nB].x =C[i].x;

B[m_nB].y =C[i].y;

m_nB++;

continue;}if(C[i].x>xr && C[i+1].x<=xr)

//P1在右方,P2在左方,留交点{x=xr;

tem1=C[i].x-xr;

tem2=C[i].y-tem1*(C[i+1].y-C[i].y)/(C[i+1].x-C[i].x);

y=tem2;

B[m_nB].x =x;

B[m_nB].y =y;

m_nB++;

continue;}if(C[i].x<=xr && C[i+1].x>xr)

//P1在内,P2在外,留P1和交点{//save p1

B[m_nB].x =C[i].x;

B[m_nB].y =C[i].y;

m_nB++;

//save交点

x=xr;

tem1=C[i].x-xr;

tem2=C[i].y-tem1*(C[i+1].y-C[i].y)/(C[i+1].x-C[i].x);

y=tem2;

B[m_nB].x =x;

B[m_nB].y =y;

m_nB++;

continue;}}

//三次裁剪后的新多边形

if(i==m_nA){B[m_nB]=B[0];}//上-------------------

m_nA=0;

for(i=0;iyt && B[i+1].y>yt)

//p1,p2都在上方,next{continue;}if(B[i].y<=yt && B[i+1].y<=yt)

//p1,p2都在下方,留P1{C[m_nA].x =B[i].x;

C[m_nA].y =B[i].y;

m_nA++;

continue;}if(B[i].y>yt && B[i+1].y<=yt)

//P1在上方,P2在下方外->内,留交点{y=yt;

tem1=B[i].y-yt;

//tem2=x1+(yb-y1)*dx/dy

tem2=B[i].x-tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y);

x=tem2;

C[m_nA].x =x;

C[m_nA].y =y;

m_nA++;

continue;}if(B[i].y<=yt && B[i+1].y>yt)

//P1在下方,P2在上方,内->外,留P1和交点{//save p1,,, C[m_nA].x =B[i].x;

C[m_nA].y =B[i].y;

m_nA++;

//save交点

y=yt;

tem1=B[i].y-yt;

//tem2=x1+(yb-y1)*dx/dy

tem2=B[i].x-tem1*(B[i+1].x-B[i].x)/(B[i+1].y-B[i].y); x=tem2;

C[m_nA].x =x;

C[m_nA].y =y;

m_nA++;

continue;}}

//形成裁剪后的多边形

if(i==m_nB){C[m_nA]=C[0];}CClientDC dc(this); CPen tempen;

tempen.CreatePen(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(tempen);

dc.MoveTo(C[0]);

for(i=1;i<=m_nA;i++){dc.LineTo(C[i]);}}//.....

Weiler-Atherton任意多边形裁剪算法

Weiler-Atherton任意多边形裁剪 Sutherland-Hodgeman算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及任意多边形窗口(含凹多边形窗口)的裁剪。Weiler-Atherton多边形裁剪算法正是满足这种要求的算法。 一、Weiler-Atherton任意多边形裁剪算法描述: 在算法中,裁剪窗口、被裁剪多边形可以是任意多边形:凸的、凹的(内角大于180o)、甚至是带有内环的(子区),见下图。 裁剪窗口和被裁剪多边形处于完全对等的地位,这里我们称: 1、被裁剪多边形为主多边形,记为A; 2、裁剪窗口为裁剪多边形,记为B。 主多边形A和裁剪多边形B的边界将整个二维平面分成了四个区域: 1、A∩B(交:属于A且属于B); 2、A-B(差:属于A不属于B); 3、B-A(差:属于B不属于A); 4、A∪B(并:属于A或属于B,取反;即:不属于A且 不属于B)。 内裁剪即通常意义上的裁剪,取图元位于窗口之内的部 分,结果为A∩B。 外裁剪取图元位于窗口之外的部分,结果为A-B。 观察右图不难发现裁剪结果区域的边界由被裁剪多边形的 部分边界和裁剪窗口的部分边界两部分构成,并且在交点处边 界发生交替,即由被裁剪多边形的边界转至裁剪窗口的边界, 或者反之。由于多边形构成一个封闭的区域,所以,如果被裁 剪多边形和裁剪窗口有交点,则交点成对出现。这些交点分成两类: 一类称“入”点,即被裁剪多边形由此点进入裁剪窗口,如图中a、c、e; 一类称“出”点,即被裁剪多边形由此点离开裁剪窗口,如图中b、d、f。 二、Weiler-Atherton任意多边形裁剪算法思想:

计算机图形学裁剪算法详解

裁剪算法详解 在使用计算机处理图形信息时,计算机部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之,哪些落在显示区之外,以便只显示落在显示区的那部分图形。这个选择过程称为裁剪。最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗。但那样太费时,一般不可取。这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪再扫描转换的方法。 (a)裁剪前 (b) 裁剪后 图1.1 多边形裁剪 1直线段裁剪 直线段裁剪算法比较简单,但非常重要,是复杂图元裁剪的基础。因为复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。常

用的线段裁剪方法有三种:Cohen-Sutherland,中点分割算法和梁友栋-barskey 算法。 1.1 Cohen-Sutherland裁剪 该算法的思想是:对于每条线段P1P2分为三种情况处理。(1)若P1P2完全在窗口,则显示该线段P1P2简称“取”之。(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。 为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,将二维平面分成九个区域。每个区域赋予4位编码CtCbCrCl.其中各位编码的定义如下:

图1.2 多边形裁剪区域编码图5.3线段裁剪 裁剪一条线段时,先求出P1P2所在的区号code1,code2。若code1=0,且code2=0,则线段P1P2在窗口,应取之。若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。可判断线段完全在窗口外,可弃之。否则,按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。在对另一段重复上述处理。在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。 Cohen-Sutherland裁减算法 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4

计算机图形学试题附答案完整版

名词解释 将图形描述转换成用像素矩阵表示的过程称为扫描转换。 1.图形 2.像素图 3.参数图 4.扫描线 5.构造实体几何表示法 6.投影 7.参数向量方程 8.自由曲线 9.曲线拟合 10.曲线插值 11.区域填充 12.扫描转换 三、填空 1.图形软件的建立方法包括提供图形程序包、和采用专用高级语言。 2.直线的属性包括线型、和颜色。 3.颜色通常用红、绿和蓝三原色的含量来表示。对于不具有彩色功能的显示系统,颜色显示为。 4.平面图形在内存中有两种表示方法,即和矢量表示法。 5.字符作为图形有和矢量字符之分。 6.区域的表示有和边界表示两种形式。 7.区域的内点表示法枚举区域内的所有像素,通过来实现内点表示。 8.区域的边界表示法枚举区域边界上的所有像素,通过给赋予同一属性值来实现边界表示。 9.区域填充有和扫描转换填充。 10.区域填充属性包括填充式样、和填充图案。 11.对于图形,通常是以点变换为基础,把图形的一系列顶点作几何变换后,

连接新的顶点序列即可产生新的变换后的图形。 12.裁剪的基本目的是判断图形元素是否部分或全部落在之内。 13.字符裁剪方法包括、单个字符裁剪和字符串裁剪。 14.图形变换是指将图形的几何信息经过产生新的图形。 15.从平面上点的齐次坐标,经齐次坐标变换,最后转换为平面上点的坐标,这一变换过程称为。 16.实体的表面具有、有界性、非自交性和闭合性。 17.集合的内点是集合中的点,在该点的内的所有点都是集合中的元素。 18.空间一点的任意邻域内既有集合中的点,又有集合外的点,则称该点为集合的。 19.内点组成的集合称为集合的。 20.边界点组成的集合称为集合的。 21.任意一个实体可以表示为的并集。 22.集合与它的边界的并集称集合的。 23.取集合的内部,再取内部的闭包,所得的集合称为原集合的。 24.如果曲面上任意一点都存在一个充分小的邻域,该邻域与平面上的(开)圆盘同构,即邻域与圆盘之间存在连续的1-1映射,则称该曲面为。 25.对于一个占据有限空间的正则(点)集,如果其表面是,则该正则集为一个实体(有效物体)。 26.通过实体的边界来表示一个实体的方法称为。 27.表面由平面多边形构成的空间三维体称为。 28.扫描表示法的两个关键要素是和扫描轨迹。 29.标量:一个标量表示。 30.向量:一个向量是由若干个标量组成的,其中每个标量称为向量的一个分量。 四、简答题 1. 什么是图像的分辨率?

多边形裁剪

#python实现可视化的多边形裁剪 import matplotlib.pyplot as plt import copy import math from tkinter import * def cross_point(line1,line2,winx,winy):#计算交点函数 year1 = copy.deepcopy(line1) pop1 = copy.deepcopy(line2) winx1 = copy.deepcopy(winx) winy1 = copy.deepcopy(winy) node_class = [] minx = min(winx) maxx = max(winx) miny = min(winy) maxy = max(winy) count = 0 for i in range(len(line1)-1): count1=0 x1=line1[i]#取四点坐标 y1=line2[i] x2=line1[i+1] y2=line2[i+1] k1=(y2-y1)*1.0/(x2-x1)#计算k1,由于点均为整数,需要进行浮点数转化 b1=y1*1.0-x1*k1*1.0#整型转浮点型是关键 nodey = k1*minx*1.0+b1*1.0 if (y1<=nodey<=y2 or y2<=nodey<=y1) and (miny<=nodey<=maxy) and ([maxx,nodey] not in node_class): node_class.append([minx,nodey]) count=count+1 count1=count1+1 nodey1 = k1*maxx*1.0+b1*1.0 if (y1<=nodey1<=y2 or y2<=nodey1<=y1) and (miny<=nodey1<=maxy) and ([maxx,nodey1] not in node_class): node_class.append([maxx,nodey1]) count=count+1 count1=count1+1 nodex = (miny*0.1 - b1*0.1)/(k1*0.1)

计算机图形学裁剪

《计算机图形学》实验报告 学院:理学院专业:信息与计算科学班级:姓名学号指导教师实验时间 4. 实验地点计算机实验室成绩实验项目名称裁剪 实 验 环 境 VC++ 6.0 实 验内容 (1)理解直线裁剪的原理(Cohen-Surtherland算法、梁友栋算法) (2)利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。 (3)调试、编译、修改程序。 实验原理编码裁剪算法的主要思想是:对于每条线段,分为三种情况处理。(1)若线段完全在窗口之内,则显示该线段,称为“取”;(2)若线段明显在窗口之外,则丢弃该线段,称为“弃”;(3)若线段既不满足“取”的条件,也不满足“舍”的条件,则把线段分割为两段。其中一段完全在窗口之外,可弃之;对另一段则重复上述处理 实验过程#include #include #include #define LEFT_EDGE 1 #define RIGHT_EDGE 2 #define BOTTOM_EDGE 4 #define TOP_EDGE 8 void LineGL(int x0,int y0,int x1, int y1) { glBegin(GL_LINES); glColor3f(1.0f,0.0f,0.0f); glVertex2f(x0,y0); glColor3f(0.0f,1.0f,0.0f); glVertex2f(x1,y1); glEnd();

} struct Rectangle { float xmin,xmax,ymin,ymax; }; Rectangle rect; int x0,y0,x1,y1; int CompCode(int x,int y,Rectangle rect) { int code=0x00; if(yrect.ymax) code=code|8; if(x>rect.xmax) code=code|2; if(x

计算机图形学 多边形裁剪与填充 计算机图形学课程设计

课程设计报告 课程名称计算机图形学 课题名称多边形裁剪与填充 专业计算机科学与技术 班级计算机0902 学号 姓名 指导教师刘长松曹燚 2012年10 月9 日

湖南工程学院 课程设计任务书 课程名称计算机图形学课题多边形裁剪与填充 专业班级计算机0902 学生姓名 学号 指导老师刘长松曹燚 审批 任务书下达日期2012年9月15 日 任务完成日期2012 年10月9 日

一、设计内容与设计要求 1.设计内容: 交互式地实现多边形的裁剪和填充。。 2.设计要求: 1)窗口功能设计。 2)实现鼠标画多边形与数据存储功能。 3)实现鼠标剪裁窗口选择功能。 4)实现多边形裁剪和填充功能。 3.算法提示: 多边形裁剪算法分析: 基本思想是一次用窗口的一条边裁剪多边形,窗口的一条边以及延长线构成裁剪线,该线把平面分成两个部分:可见一侧,不可见一侧。用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入点。 对于每一条裁剪边,只是判断点在窗口的哪一测以及求线段与裁剪边的交点算法应随之改变。 多边形填充算法分析: 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin 和ymax),从y=ymin 到 y=ymax, 每次用一条扫描进行填充。对一条扫描线填充的过程可分为四个步骤: a.求交b.排序c.交点配对d.区间填色。 二、进度安排 第 3 周星期一8:00——12:00 星期二8:00——12:00 星期三8:00——12:00 星期四8:00——12:00 星期五8:00——12:00 第 4 周星期一8:00——12:00 附: 课程设计报告装订顺序:封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。 正文总字数要求在5000字以上(不含程序原代码)。

计算机图形学实验报告-二维裁剪

计算机科学与技术学院 2013-2014学年第一学期《计算机图形学》实验报告 班级: 学号: 姓名: 教师: 成绩:

实验项目(3、二维裁剪) 一、 实验目的与要求 (1) 掌握线段裁剪算法原理,并实现其算法。 (2) 理解多边形裁剪、字符裁剪算法思想,能编程实现其算法。 二、 实验内容 设计菜单程序,利用消息处理函数,完成以下要求: (1) 实现直线段的标号法(Cohen-Sutherland )、矩形窗口裁剪算法。 (2) 参考教材中的算法,用矩形窗口实现多边形的Sutherland-Hodgman 裁剪算法。 三、 重要算法分析 以下分析Cohen-Sutherland 和Sutherland-Hodgma n 两个算法,其中Cohen-Sutherland 算法的基本思想通过编码的方法快速实现对直线段的裁剪;Sutherland-Hodgman 算法基本思想是用窗口的四条边所在的直线依次来裁剪多边形。 (一) Cohen-Sutherland 算法 该算法的基本思想是:对于每条待裁剪的线段P 1,P 2分三种情况处理: (1) 若P 1P 2完全在窗口内,则显示该线段。 (2) 若P 1P 2完全在窗口外,则丢弃该线段。 (3) 若线段既不满足“取”的条件,也不满足“舍”的条件,则求线段与窗口边界的交点,在交点处把线段分为两段。 1. 编码原则 具体编码过程为将延长线窗口的四条边线(y T 、y B 、x R 、x L ),将二维平面分成九个区域,全为0的区域是裁剪窗口,其中各位编码的定义如下: {T y y other T C >= 10 {B y y other B C <=10 {R x x other R C >= 10 {L x x other L C <=10 按照如上定义,相应区域编码如图1所示。

计算机图形学-实验五 直线和多边形的裁剪

大学实验报告 学院:计算机科学与信息学院专业:软件工程班级: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 x = XL; y = y1 + (y2 - y1) * (XL - x1) / (x2 - x1);// 求直线与矩形窗口的左边界的交点 } else if ((RIGHT & code) != 0) {// 直线的端点与矩形窗口的右边编码相与!=0 x = XR; y = y1 + (y2 - y1) * (XR - x1) / (x2 - x1);// 求直线与矩形窗口的右边界的交点 } else if ((BOTTOM & code) != 0) {// 直线的端点与矩形窗口的下边编码相与!=0 y = YB; x = x1 + (x2 - x1) * (YB - y1) / (y2 - y1);// 求直线与矩形窗口的下边界的交点 } else if ((TOP & code) != 0) {// 直线的端点与矩形窗口的上边编码相与!=0 y = YT; x = x1 + (x2 - x1) * (YT - y1) / (y2 - y1);// 直线的端点与矩形窗口的

计算机图形学课程总结

计算机图形学报告 前言 计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 其从狭义上是来说是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。由于计算机图形学在许多领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。 计算机图形学的发展趋势包括以下几个方面: 1、与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点; 2、研究和谐自然的三维模型建模方法; 3、利用日益增长的计算性能,实现具有高度物理真实的动态仿真; 4、研究多种高精度数据获取与处理技术,增强图形技术的表现; 5、计算机图形学与图像视频处理技术的结合; 6、从追求绝对的真实感向追求与强调图形的表意性转变。 1、三维物体的表示 计算机图形学的核心技术之一就是三维造型三维物体种类繁多、千变万化,如树、花、云、石、水、砖、木板、橡胶、纸、大理石、钢、玻璃、塑料和布等等。因此,不存在描述具有上述各种不同物质所有特征的统一方法。为了用计算机生成景物的真实感图形,就需要研究能精确描述物体特征的表示方法。根据三维物体的特征,可将三维物体分为规则物体和非规则物体两类。

计算机图形学(简单多边形裁剪算法)

简单多边形裁剪算法 摘要:多边形裁剪算法与线性裁剪算法具有更广泛的实用意义,因此它是目前 裁剪研究的主要课题。本文主要介绍了一种基于多边形顶点遍历的简单多边形裁剪算法,它有效降低了任意多边形裁剪复杂度。通过记录交点及其前驱、后继信息,生成结果多边形,该算法简化了交点的数据结构,节省了存储空间,降低了算法的时间复杂度,具有简单、易于编程实现、运行效率高的特点。 关键词:多边形裁剪;交点;前驱;后继;矢量数组 一、技术主题的基本原理 简单多边形裁剪算法综合考虑现有多边形裁剪算法的优缺点,它是一种基于多边形顶点遍历来实现简单多边形裁剪工作的。其主要的原理是遍历多边形并把多边形分解为边界的线段逐段进行裁剪,输出结果多边形。 二、发展研究现状 近年来,随着遥感绘图、CAD辅助设计、图象识别处理技术的发展,图形裁剪算法从最初在二维平面上线和图形的裁剪扩展到三维空间里体和场的裁剪,国内外相继提出不少行之有效的算法,但越来越复杂的图形和计算也对算法的速度和适用性提出了越来越高的要求。因此,不断简化算法的实现过程,完善细节处理,满足大量任意多边形的裁剪也就成了当今算法研究的焦点之一。 以往多边形裁剪算法不是要求剪裁多边形是矩形,就是必须判断多边形顶点的顺时针和逆时针性,即存在不实用或者是增加了多边形裁剪算法的难度。为了解决现在的问题,我们研究现在的新多边形算法,其中,裁剪多边形和被裁剪多边形都可以是一般多边形,且不需要规定多边形输入方向。它采用矢量数组结构,只需遍历剪裁多边形和被裁剪多边形顶点即完成多边形的裁剪,具有算法简单、运行效率高的特点。 三、新算法设计 1、算法的思想 本算法是为了尽量降低任意多边形裁剪算法复杂度而提出的,其主要思想是采用矢量数组结构来遍历裁剪多边形和被裁多边形顶点,记录裁剪多边形和被裁减多边形交点及其前驱、后继信息,并通过记录相邻交点的线段,然后通过射线法选择满足条件的线段,之后进行线段连接,输出对应的裁剪结果。算法数据结构简单,即没有用常用的数据结构,如线性链表结构、双向链表结构和树形结构,这样就节省了存储空间,增加算法的效率。 2、主要数据结构 多边形裁剪算法的核心是数据结构,它决定了算法的复杂度和计算效率。兼顾数据结构简单和节省存储空间的目的,简单多边形裁剪算法是基于矢量数组vector的数据结构进行裁剪的,多边形矢量数组的每个元素表示多边形顶点,且按顶点输入的顺序存储。裁剪多边形和被裁剪多边以下我们分别用S和C表示,

计算机图形学_实验报告三_图形裁剪算法

图形裁剪算法 1.实验目的: 理解区域编码 设计直线裁剪算法 编程实现直线裁剪算法 2.实验描述: 设置裁剪窗口坐标为:wxl=250;wxr=850;wyb=250;wyt=450;裁剪前如下图所示: 裁剪后结果为: 3.算法设计: 直线裁剪算法: 假设裁剪窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如下图所示。延长窗口四条边形成9个区域。根据被裁剪直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码C4C3C2C1。

编码定义规则: 第一位C1:若端点位于窗口之左侧,即XWxr,则C2=1,否则C2=0。 第三位C3:若端点位于窗口之下侧,即YWyt,则C4=1,否则C4=0。 裁剪步骤: 1. 若直线的两个端点的区域编码都为0,即RC1|RC2=0(二者按位相或的结果为0,即RC1=0 且RC2=0),说明直线两端点都在窗口内,应“简取”。 2. 若直线的两个端点的区域编码都不为0,即RC1&RC2≠0(二者按位相与的结果不为0,即RC1≠0且RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”。 3. 若直线既不满足“简取”也不满足“简弃”的条件,直线段必然与窗口相交,需要计算直线与窗口边界的交点。交点将直线分为两段,其中一段完全位于窗口外,可“简弃”。对另一段赋予交点处的区域编码,再次测试,再次求交,直至确定完全位于窗口内的直线段为止。 4. 实现时,一般按固定顺序左(x=wxl)、右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口与直线的交点。

梁友栋-Barsky直线裁剪算法计算机图形学课程设计

河南理工大学 万方科技学院 课程设计报告 2011 — 2012学年第二学期 课程名称计算机图形学 设计题目计算机图形学基本算法 演示系统设计 学生姓名 学号 专业班级网络11升—1班 指导教师徐文鹏 2012 年5 月28 日

目录 第1章设计内容与要求 (1) 1.1 总体目标和要求 (1) 1.2内容与要求 (1) 1.2.1 直线的生成 (1) 1.2.2 圆弧的生成 (1) 1.2.3 线段裁剪 (2) 1.2.4 多边形裁剪 (2) 1.2.5 综合 (2) 第2章总体设计 (3) 2.1 Bresenham算法画直线 (3) 2.1.1 Bresenham算法画直线理论基础 (3) 2.1.2 Bresenham算法画直线原理 (3) 2.2 Bresenham算法画圆 (4) 2.2.1 Bresenham算法画圆理论基础 (4) 2.2.2 Bresenham算法画圆原理 (5) 2.3 梁友栋-Barsky算法进行线段裁剪 (6) 2.3.1梁友栋-Barsky算法进行线段裁剪基本原理 (6) 2.4 Sutherland-Hodgman算法进行多边形裁剪 (8) 2.4.1 Sutherland—Hodgman多边形裁剪算法思想 (8) 2.4.2 点在边界内侧的判断方法 (8) 2.4.4 Sutherland-Hodgeman多边形裁剪算法特点 (8) 第3章详细设计 (9) 3.1 Bresenham算法画直线 (9) 3.1.1 Bresenham 算法画线算法具体实现过程 (9) 3.2 Bresenham算法画圆 (9) 3.2.1 Bresenham 算法画圆核心代码 (9)

计算机图形学常用算法及代码大全

2.1.1 生成直线的DDA算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。 一、直线DDA算法描述: 设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得 可通过计算由x方向的增量△x引起y的改变来生成直线: 也可通过计算由y方向的增量△y引起x的改变来生成直线: 式(2-2)至(2-5)是递推的。 二、直线DDA算法思想: 选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(x i+1,y i+1)经取整后送到显示器输出,则得到扫描转换后的直线。 之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。 另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。 三、直线DDA算法实现: 1、已知直线的两端点坐标:(x1,y1),(x2,y2) 2、已知画线的颜色:color 3、计算两个方向的变化量:dx=x2-x1 dy=y2-y1 4、求出两个方向最大变化量的绝对值: steps=max(|dx|,|dy|) 5、计算两个方向的增量(考虑了生成方向): xin=dx/steps

yin=dy/steps 6、设置初始象素坐标:x=x1,y=y1 7、用循环实现直线的绘制: for(i=1;i<=steps;i++) { putpixel(x,y,color);/*在(x,y)处,以color色画点*/ x=x+xin; y=y+yin; } 五、直线DDA算法特点: 该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。 //@brief 浮点数转整数的宏 实现代码 #define FloatToInteger(fNum) ((fNum>0)?static_cast(fNum+0.5):static_cast(fNum-0.5)) /*! * @brief DDA画线函数 * * @param pDC [in]窗口DC * @param BeginPt [in]直线起点 * @param EndPt [in]直线终点 * @param LineCor [in]直线颜色 * @return 无 */ void CDrawMsg::DDA_DrawLine(CDC *pDC,CPoint &BeginPt,CPoint &EndPt,COLORREF LineCor) { l ong YDis = (EndPt.y - BeginPt.y); l ong XDis = (EndPt.x-BeginPt.x); l ong MaxStep = max(abs(XDis),abs(YDis)); // 步进的步数 f loat fXUnitLen = 1.0f; // X方向的单位步进 f loat fYUnitLen = 1.0f; // Y方向的单位步进

PS移动 多边形 裁剪工具

PS二:移动、多边形、裁剪工具 前言:如果小工具后面带有小三角样式,即说明该种工具还有其他类似的小工具可以使用,方式是鼠标左键长按小工具图标,会自动跳出其他几个小工具,点击选择即可。 1:移动工具(v):点击图层后可以选中图层进行编辑或移动图层至需要的位置。 先建立一个空白图层,大小像素任意。 打开一个文件夹,找任意图片,按住鼠标左键选中并拖动图片拉到PS图层界面中。拉动过程中鼠标不要松开。 此时右边图层面板就会出现两个图层(如果没有图层面板,可以在PS软件最上面的第一排菜单栏中点击“窗口”-“图层”,快捷键F7)。一开始新建的是背景层,另外一个是刚才拖进去的图片图层。

然后在这个状态下,可以使用“移动工具”随意拖动该图层,也可以对齐进行其他编辑(在编辑前必须先在图层上右键-栅格化图层,再进行编辑。以后将仔细介绍图层的编辑。)。 2:多边形套索工具:可以根据自己的意图来裁剪或选择图层上某个部分。 用上面的移动工具拖入一个需要修改的图层,这边就按刚才的图片举例,如果图片上的微信号换掉了,就需要把微信号删除掉,在PS里说裁剪掉。栅格化图层后,先点击多边形套索工具,然后在微信号的边缘依次点击鼠标左边选出需要裁切掉的地方。

点击第一点后,会出现一条直线,可以点击第二点,一直到收尾相连,这时的选框已经选出来。直接按键盘“Delete”键即可。 删除后图层上会出现一个虚线选框,按快捷键ctrl+d 取消选框即可。然后可以编辑自己需要的内容。 3:裁剪工具(C):是裁剪画布大小的工具,就如同剪刀一样。裁剪掉的东西是不能再拼回去的哦。(原则上不可以,但是PS功能非常强大,以后会告诉大家如果来拼回去,嘻嘻...)点击“裁剪工具”后,画布四周会出现虚线框和八个小框。

计算机图形学

《计算机图形学》思考练习题 第一章计算机图形学概论 1.比较计算机图形学与图象处理技术相同点和不同点。 计算机图形学是研究怎样用数字计算机生成、处理和显示图形的一门学科。 图像处理技术研究如何对连续图像取样、量化以产生数字图像,如何对数字图像做各种变换以方便处理,如何滤去图像中的无用噪声,如何压缩图像数据以便存储和传输,图像边缘提取,特征增强和提取。 2.列举三个计算机图形的应用实例。 勘探、绘制地形地貌,系统模拟,虚拟现实。辅助教学设计。 3.简述计算机图形学发展动向。 造型技术—真实图形生成技术—人机交互技术—基于网络的图形技术 第二章计算机图形系统概述 1.叙述计算机图形系统的基本功能。 输入、输出、计算、存储、对话 他的基本功能是帮助人们设计、分析、采集、存贮图形、视频甚至音乐等信息。 2.输入设备可有哪几种逻辑功能?请举出各自对应的物理设备。 .定位(locator): 指定一个坐标点。对应的物理设备有鼠标器、键盘、数字化仪、触摸屏等。.笔划(stroke): 指示一个坐标点系列, 如指定一条曲线的控制点等。主要物理设备有数字化仪。.送值(valuator): 输入一个数值。最常用的物理设备是键盘的数字键。 .字符串(string):输入一个字符串。键盘字母键 .拾取(pick):各种定位设备 .选择(choise): 鼠标器,数字化仪,键盘功能键等 3.画出图形软件的层次结构及主要组成。 ------------------------------------ | 应用程序| | ---------------------------- | | 图形支撑软件| | | ------------------- | | | 高级语言| | | | ------------ | | | | 操作系统| ------------------------------------ 主要部分:图形核心系统GKS 计算机图形元文件CGM 计算机图形设备接口CGI 程序员层次结构图形系统PHIGS 4.颜色查找表的概念及实现原理。 颜色查找表是一维线性表,其每一项的内容对应一种颜色,它的长度由帧缓存单元的位数决定。实现原理:把颜色码放在一个独立的表中,帧缓存存放的是颜色表中各项的索引值,这样在帧缓存单元的位数不增加的情况下,具有了大范围挑选颜色的能力。 5.光栅扫描显示器结构与工作原理。

计算机图形学裁剪算法

一、实验目标 1.了解Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的基本思想; 2.掌握Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的算法实现; 二、实验内容 本次实验主要是实现Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法。 Cohen-sutherland线段裁剪算法思想: 该算法也称为编码算法,首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。只有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。 对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。 Cohen-sutherland线段裁剪算法步骤: 1、分区编码 延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代码值如图中所示。 四位二进制代码的编码规则是: (1)第一位置1:区域在左边界外侧

(2)第二位置1:区域在右边界外侧 (3)第三位置1:区域在下边界外侧 (4)第四位置1:区域在上边界外侧 裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。 设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则,可以求出P1和P2所在区域的分区代码C1和C2。 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。 (2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。 3、求交点 假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。 为了规范算法,令线段的端点P 1为外端点,如果不是这样,就需要P 1 和P 2 交换端点。 当条件(C1&0001≠0)成立时,表示端点P1位于窗口左边界外侧,按照求交公式,进行对左边界的求交运算。 依次类推,对位于右、下、上边界外侧的判别,应将条件式中的0001分别改为0010、0100、1000即可。 求出交点P后,用P1=P来舍去线段的窗外部分,并对P1重新编码得到C1,接下来算法转回第2步继续对其它边界进行判别。 Liang-Barsky线段裁剪算法思想: 我们知道,一条两端点为P1(x1,y1)、P2(x2,y2)的线段可以用参数方程形式表示: x= x1+ u·(x2-x1)= x1+ u·Δx y= y1+ u·(y2-y1)= y1+ u·Δy0≤u≤1式中,Δx=x2-x1,Δy=y2-y1,参数u在0~1之间取值,P(x,y)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。如果点P(x,y)位于由坐标(xw min,

多边形裁剪的Sutherland―Hodgman算法(计算机图形学)

多边形裁剪的Sutherland—Hodgman算法 1>. Sutherland—Hodgman多边形裁剪算法思想 该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,…,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。 当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则): 1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列; 2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列; 3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列; 4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。 2>. Sutherland—Hodgman多边形裁剪算法步骤 考虑多边形相对于一条边界及其延长线进行裁剪的算法: 1.从主函数得到待裁剪多边形的顶点序列P[][2]、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界); 2.赋初值: 将顶点序列中的最后一个顶点赋给前一顶点S; 设置初始标志flag: if(S在边界内侧)flag=0;

else flag=1; 设新的顶点序列数j=0; 3.对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列 Q[][2]中: for(对第一个顶点直到最后一个顶点,逐一处理){if(Pi在边界内 侧){if(flag!=0){flag=0; 求交点并放入新的多边形顶点序列Qjxx; j++;}将当前顶点放入新的多边形顶点序列Qj中: Qj=Pi; j++;}else{if(flag==0){flag=1; 求交点并放入新的多边形顶点序列Qjxx; j++;}} 将当前顶点赋给S: S=Pi;} 4.做返回准备: 将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中: P=Q; 将新的多边形顶点数j放回原多边形顶点数n中: n=j; //////////////////////////////////////////////////////////////////////////////////// // //-----多边形裁剪的Sutherland—Hodgman算法---------//

计算机图形学复习题

1、计算机图形学的相关学科有哪些?它们之间的相互关系怎样? 与计算机图形学密切相关的几门学科有:图像处理、模式识别、计算几何。它们研究的都是与图形图象处理有关的数据模型、图象再现的内容,它们相互结合、相互渗透。 2、图形系统的任务是什么? 图形系统的任务是:建立数学模型、视像操作、图形显示。 3、计算机图形学的主要研究内容是什么? 计算机图形学是研究通过计算机将数据转换为图形,并在专门的设备上输出的原理、方法和技术的学科。 4、举出六种你所知道的图形输出设备。 光栅扫描显示器、随机扫描显示器、直视存储管显示器、激光打印机、笔绘仪、喷墨绘图仪、静电绘图仪等。 5、什么叫刷新?刷新频率与荧光物质的持续发光时间的关系如何? 屏幕上的荧光涂层受到电子束打击后发出的荧光只能维持很短的时间,为了使人们看到一个稳定而不闪烁的图形,整个画面必须在每秒钟内重复显示许多次,这也称为屏幕刷新。 刷新频率与荧光物质的持续发光时间成反比,即荧光物质的持续发光时间越长,刷新频率可以低一些;否则,荧光物质的持续发光时间越短,刷新频率必须高。 6、随机扫描显示器和光栅扫描显示器显示图形有什么不同?它们各自依靠什么对屏幕图形进行刷新的? 随机扫描显示器显示图形时,电子束的移动方式是随机的,电子束可以在任意方向上自由移动,按照显示命令用画线的方式绘出图形,因此也称矢量显示器。而光栅扫描显示器显示图形时,电子束依照固定的扫描线和规定的扫描顺序进行扫描。电子束先从荧光屏左上角开始,向右扫一条水平线,然后迅速地回扫到左边偏下一点的位置,再扫第二条水平线,照此固定的路径及顺序扫下去,直到最后一条水平线,即完成了整个屏幕的扫描。 随机扫描显示器依靠显示文件对屏幕图形进行刷新;光栅扫描显示器则依靠帧缓存实现对屏幕图形的刷新。 7、光栅扫描显示系统为什么要采用彩色表?隔行扫描的优点是什么? 对于光栅扫描显示系统,为了显示很多种颜色,帧缓存的容量就要很大。但实际上对一幅具体的画面而言,其使用的颜色数目并不多(几百至几千种)。为了解决帧缓存容量不能过大而又满足实际需要,产生了彩色表。采用彩色表后,一幅画面实际使用的颜色值放入彩色表,而帧缓存各单元保存的不再是相应象素的颜色值,而仅是该象素颜色的一个索引,它是彩色表的某个入口地址。 隔行扫描只需用逐行扫描一半的时间就能看见整个屏幕显示,因此隔行扫描技术用于较慢的刷新频率。

多边形裁剪报告

多边形裁剪实验报告 一、实验内容 1.实验目的: ●理解多边形裁剪算法的基本思想,掌握多边形裁剪算法及其特 点。 ●能够应用多边形裁剪算法,编程实现裁剪指定多边形的功能。 2.常见的解决方法以及各方法的优点: a)Sutherland-Hodgman(逐边)裁剪算法 优点:原理简单实用。 缺点:对于凸多边形的裁剪将显示出一条多余的裁剪边界直线。这种情况在裁剪后的多边形有两个或多个分离部分的时候出现,因为只有一个输出顶点表,所以表中的最后一个顶点总是连着第一个顶点。 二、试验方法 1.Sutherland-Hodgman裁剪算法所用方法的原理 采用分割处理策略,将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。顺序是左上右下,前边的结果永远是后边的输入。一次用窗口的一条边裁剪多边形,考虑窗口的一条边以

及其延长线构成的裁剪线,该线把平面分为两个部分:可见一侧和不可见一侧。对于两个端点均在可见一侧,则输出一个端点;对于两个端点均在不可见一侧,则输出0个端点;如果起始端点在可见一侧,终止端点在不可见一侧,则输出线段与裁剪边的交点;如果起始端点在不可见一侧,终止端点在可见一侧,则输出线段与裁剪边的交点以及终止端点。 程序设计思路 (1)输入第一个顶点S,输入第一个顶点F (2)判断定点是否输入完毕,如果输入完毕,F—>P,处理线段SP (3)如果顶点未输入完毕,则输入顶点P,处理线段SP,P->S,然后再 判断顶点是否输入完毕,转到第二步 (4)处理线段SP,判断SP是否与裁剪线相交,如果与裁剪线相交, 则求出SP与裁剪线的交点 (5)输出交点 (6)如果SP与裁剪线不相交,则判断P是否位于可见一侧,如果P 位于可见一侧,则输出顶点P (7)如果P位于不可见一侧,则直接舍弃P (8)线段SP处理完毕,算法结束。

相关主题
文本预览
相关文档 最新文档