实验5实验报告格式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学》实验5实验报告

实验题目:多边形裁剪与填充

实验内容:1 阅读理解提供的参考资料。

2编写并调通一个多边形裁剪的java程序。

3编写并调通一个多边形填充的java程序。

参考资料:1 fillpolygon.java 2 clipsc2.java

2变换与剪裁.ppt

3多边形的填充.ppt 基本概念:(详细叙述自己对实验内容的理解)

多边形的裁剪:

选择显示的内容--图形在窗口内的部分被显示出来,窗口外的部分被裁剪掉。

图形中每个基本元素都要经过裁剪,因此裁剪直接影响整个图形系统的效率。

多边形的填充:

多边形填充就是把多边形的顶点表示转换为点阵表示,即从多边形的给定边界出发,求

出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜色。实际上,

也就是多边形内的区域的着色过程。

算法设计:(详细叙述自己设计的的算法)

多边形的裁剪:

1、算法的的基本思想:

对于每条线段p1p2分为三种情况处理。

(1)若p1p2完全在窗口内,则显示该线段p1p2简称“取”之。

(2)若p1p2明显在窗口外,则丢弃该线段,简称“弃”之。

(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两

段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

2、sutherland–cohen算法分成两部分:

第一步是判定:

1) 完全在窗口内的直线段,称为

完全可见的线段;

2) 完全在窗口外的线段,称为

完全不可见线段。

第二步处理不能断定为完全可见或完全不可见的线段。

这时需要计算出直线段和窗口边界的一个交点,这个交点把直线分成两段,其中一条为

完全不可见的线段,被抛弃。

对余下部分再作第一步的判断,重复上述过程,直到直线段余下的部分可用第一步的判

断得出肯定的结论为止。

多边形的填充:

1、多边形填充的扫描线算法:

1:计算扫描线与多边形各边的交点,设交点个数为n;

2:把所有的交点按x值递增的顺序进行排列;

3:将排序后的第1个与第2个交点,第3个与第4个交点,??第n-1个与第n个交

点配对,每对交点就代表扫描;线与多边形的一个相交区间;

4:把相交区间内的像素置成多边形的颜色,相交区间外的像素置成背景色。

2、边缘填充算法:

对多边形p的每一非水平边上的各像素做向右求反运算即可

3、边界标志算法:

1:以值为boundary-color 的特殊颜色勾画多边形p的边界。设多边形顶点为pi= (xi,

yi),0≤i≤n, xi, yi均为整数;置pn+1=p0。每一条扫描线上着上这种特殊颜色的点

的个数必定是偶数(包括零)。

2:设interior_point 是一布尔变量。对每一条扫描线从左到右进行搜索,如果当前

是像素位于多边形p内,则interior_point=true,需要填上值为polygon_color的颜

色;否则该像素在多边形p外,需要填上值为background_color的颜色。

4、扫描线种子填充算法:

1:(初始化)将算法设置的堆栈置为空。将给定的种子点(x, y)压入堆栈 2:

(出栈)如果堆栈为空,算法结束;否则取栈顶元素(x, y)作为种子点

3:(区段填充)从种子点(x, y)开始,沿纵坐标为y的当前扫描线向左右两个方向

逐个像素用新的颜色值进行填充,直到边界为止即象素颜色等于边界色。设区间

两边界的横坐标分别为xleft 和xright。

4:在与当前扫描线相邻的上下两条扫描线上,以区间[xleft, xright]为搜索范围,求

出需要填充的各小区间,把各小区间中最右边的点并作为种子点压入堆栈,转到步

骤2。

代码:(给出编写的两个java程序和注解)

package last; //applet程序演示

//sutherland–cohen裁剪算法

import java.awt.*;

import java.applet.applet; public class clipsc2 extends applet { int xl=100,xr=200,yb=100,yt=200; public void paint(graphics g)

{ setbackground(color.gray); graphics2d g2=(graphics2d)g;

g2.setpaint(color.green); //画一绿色的矩形

g2.drawline((int)xl,(int)yb,(int)xl,(int)yt);

g2.drawline((int)xl,(int)yb,(int)xr,(int)yb);

g2.drawline((int)xl,(int)yt,(int)xr,(int)yt);

g2.drawline((int)xr,(int)yb,(int)xr,(int)yt); g2.setpaint(color.blue); //蓝色

的长斜线//g2.drawline(50,50,280,280); g2.drawline(50,150,250,150);

g2.setpaint(color.red); //调用裁减算法,矩形内的部分改画红线

//sutherland_cohen(g2,50,50,280,280); sutherland_cohen(g2,50,150,250,150); } //窗口的四条边把整个平面分成九个区域,每一个区域采用四位编码表示: //对要被裁

剪的线段的两个端点,如果其所在的区域的编码均是 0000,则这条线段完全可见; public

int code(float x,float y) { } int c=0; if(x<xl)c=c|1; else

if(x>xr)c=c|2; if(y<yb)c=c|4; else if(y>yt)c=c|8; return c; //二进制分

别为 0 1 10 100 1000 //如果两个编码的逻辑与不为0000,则这条线段完全不可

见。其它则部分可见

//sutherland_cohen裁减算法

public void sutherland_cohen(graphics g,float x0,float y0,float x2,float y2) { int c1,c2,c; float x,y,wx,wy; boolean accept=false,done=false;

相关文档
最新文档