《计算机图形学》实验报告——区域填充和剪裁

合集下载

实验报告格式9区域填充

实验报告格式9区域填充

学号
天津城建大学
计算机图形学实验报告
实验九区域填充
学生姓名
专业、班级
指导教师任丽敏
成绩
计算机与信息工程学院
2013 年月日
天津城建大学
设计性实验任务书
计算机与信息工程学院专业班姓名学号:
课程名称:计算机图形学
设计题目:多边形填充
完成期限:自2013 年11月8 日至2013 年11 月18 日
设计依据、要求及主要内容(可另加附页):
1设计依据:
本课程设计是依据教材<<计算机计算机图形学>>一书的第5章图形算法为设计依据, 用扫描线填充算法制作多边形填充的程序。

2设计要求:
用扫描线填充多边形
基本要求:
(1)数据输入项为:多边形的顶点数、各顶点x,y坐标。

对于扫描线填充算法要输入扫描线间距。

(2)填充区域输出在PictureBox控件中。

附加要求:(1)填充区中可内嵌多个多边形。

(2)对于扫描线填充算法使用一定距离的字符填充。

指导教师:任丽敏
实验目的:题目:
设计思想:原程序:运行结果:体会:。

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

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

实验题目:实验三图形裁剪算法1.实验目的:理解区域编码(Region Code,RC)设计Cohen-Sutherland直线裁剪算法编程实现Cohen-Sutherland直线裁剪算法2.实验描述:设置裁剪窗口坐标为:wxl=250;wxr=850;wyb=250;wyt=450;裁剪前如下图所示:裁剪后结果为:3.算法设计:Cohen-Sutherland 直线裁剪算法:假设裁剪窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如下图所示。

延长窗口四条边形成 9个区域。

根据被裁剪直线的任一端点 P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码C4C3C2C1。

编码定义规则:第一位C1:若端点位于窗口之左侧,即 X<Wxl,则 C1=1,否则 C1=0。

第二位C2:若端点位于窗口之右侧,即 X>Wxr,则 C2=1,否则 C2=0。

第三位C3:若端点位于窗口之下侧,即 Y<Wyb,则 C3=1,否则 C3=0。

第四位C4:若端点位于窗口之上侧,即 Y>Wyt,则 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)求解窗口与直线的交点。

计算机图形学图形区域填充效果

计算机图形学图形区域填充效果
CFill.cpp参考代码:
// Fill.cpp : implementation file
#include "stdafx.h"
#include "FloodFill.h"
#include "Fill.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
(1)种子填充算法原理
在多边形内部找到一个已知的象素点作为种子点,由此开始,利用区域的连通性找到多边形内部的 其它所有象素点进行填充。
(i)四向连通区域
①四向连通区域概念:从区域上任一点出发,在不超出区域边界的前提下,可通过4个方向:上、下、左、右的移动组合到达区域中的任意象素点,称此区域为四向连通区域。
{
//有需要填充的区域
if(spanNeedFill==FALSE)
{
spanNeedFill = TRUE;
}
x++;
}
if(spanNeedFill)
{
CPoint rightp(x-1,y);
stack.Push(x-1);
stack.Push(y);
spanNeedFill = FALSE;
virtual ~CStack();
};
#endif // !defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_)
CStack.cpp参考代码:
// Stack.cpp: implementation of the CStack class.
#if !defined(AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_) #define AFX_STACK_H__D198F788_4ED1_4C09_98E5_433BAB24D864__INCLUDED_

计算机图形学 实验三 二维图形的区域填充

计算机图形学 实验三 二维图形的区域填充

西北农林科技大学实习报告学院名称:理学院专业班级:姓名:学号:课程:计算机图形学实验报告日期:第十四周实验三二维图形的区域填充一、实验目的1)加深对填充算法的理解,分析比较种子填充和边缘填充的差异。

2)掌握二维图形区域种子填充的原理和算法。

二、实验步骤1)对任意多边形的几何形状进行分析,选定比较合适的算法模型。

2)画出程序流程图;3)编写程序的源程序;4)编辑源程序并进行调试;5)进行特殊模式的运行测试,并结合情况进行调整。

三、实验内容用种子填充算法编写程序实现区域填充,并能在计算机上编译运行,正确地实现任意多边形边界的单色填充。

原理边界填充算法可以让用户首先勾画图的轮廓,选择填充颜色和填充模式,然后拾取内部点,系统就可以自动给图的内部涂上所需要的颜色和图案。

该算法的输入是种子点坐标 ( x , y )、填充色和边界颜色。

算法从( x , y )开始检测相邻位置是否是边界颜色,若不是,就用填充色着色,并检测其相邻位置。

该过程延续到已经检测完区域边界颜色范围内的所有像素为止。

使用栈结构来实现4-连通边界填充算法的算法步骤如下:(1)种子像素入栈。

(2)执行如下三步操作:1 栈顶像素出栈。

2 将出栈像素置成填充色。

3 检查出栈像素的4-邻接点,若其中某个像素不是边界色且未置成多边形色,则把该像素入栈。

(3)检查栈是否为空,若栈非空重复执行步骤(2),若栈为空则结束。

边界填充算法可以用于填充带有内孔的平面区域。

其缺点是把太多的像素压入堆栈,有些像素甚至会入栈多次,这样一方面降低了算法的效率,另一方面还要求很大的存储空间以实现栈结构。

将之改进,可构造沿扫描线填充水平像素段的4-连通边界填充算法,其算法步骤如下:(1)种子像素入栈。

(2)执行如下三步操作:1 栈顶元素出栈。

2 填充出栈元素所在扫描行的连续像素段,从出栈的像素开始沿扫描线向左和向右填充,直到遇到边界像素为止,即每出栈一个像素,就对包含该像素的整个扫描线区间进行填充,并且记录下此时扫描线区间的x坐标范围[ x1, x2 ]。

实验二:图形填充算法实验报告

实验二:图形填充算法实验报告

《计算机图形学》实验报告(实验二:图形填充算法)一、实验目的及要求用两种方法做图形的填充算法!二、理论基础1.边填充算法对于每一条扫描线和每条多边形的交点(x1,y1),将该扫描线上的交点右方的所有像素取补。

2.种子填充算法利用栈来实现种子填充算法。

种子像素入栈,当栈非空时重复执行如下步骤:将栈顶像素出栈,将出栈像素置成多边形色,按左,上,右,下顺序检查与出栈像素相邻的四个像素,若其中某个像素不再边界且未置成多边形,则把该像素入栈!三、算法设计与分析1、边填充算法void CEdge_mark_fillView::OnDraw(CDC* pDC){CEdge_mark_fillDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);int d[500][500]={0};int inside;int x,y;Bresenham(80,101,100,400,d);Bresenham(100,300,290,400,d);Bresenham(292,400,382,50,d);Bresenham(380,50,202,150,d);Bresenham(200,150,82,101,d);for(y=0;y<500;y++){inside=0;for(x=0;x<500;x++){if(d[x][y]==1)if(d[x+1][y]!=1){inside=!(inside);}if(inside!=0)pDC->SetPixel(x,y,12);}}}2、种子填充int x=299,y=51;COLORREF oldcolor;COLORREF newcolor;oldcolor=RGB(256,256,256);newcolor=RGB(123,123,123);pDC->MoveTo (40,40);pDC->LineTo (80,40);pDC->LineTo (70,80);pDC->LineTo (40,40);FloodFill(51,51,RGB(255,255,255),RGB(0,0,255));pDC->LineTo (40,40);void CMyView::FloodFill(int x,int y,COLORREF oldcolor,COLORREF newcolor) {CDC* pDC;pDC=GetDC();if(pDC->GetPixel(x,y)==oldcolor){pDC->SetPixel(x,y,newcolor);FloodFill(x,y-1,oldcolor,newcolor);FloodFill(x,y+1,oldcolor,newcolor);FloodFill(x-1,y,oldcolor,newcolor);FloodFill(x+1,y,oldcolor,newcolor);}四、程序调试及结果的分析1、2、四、实验心得及建议由于很多不会,所以这次没能按时当堂完成,下来花了不少时间才弄出来,第二种尤其比较麻烦,在同学的帮助下才做出来了。

计算机图形学--填充报告2

计算机图形学--填充报告2

计算机图形学课程名称多边形填充实验名称一、实验目的及要求软件环境:Microsoft studio visual C++ 6.0 MFC硬件:计算机(1)理解窗口到视区的变换(2)学习使用MFC的图形编程(3)实现五角多边形的填充二、实验内容仿照Windows的附件程序“画图”, 用C++语言编制一个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互方式在图形绘制区绘制填充多边形(2) 设置线条的颜色、线型和线条宽度,对绘制的图元进行线条和填充属性的修改;三、实验步骤1.新建MFC应用程序(a)新建工程。

运行VC++6.0,新建一个MFC AppWizard[exe]工程,并命名为“多边形”,选择保存路径,确定。

(b)详细步骤不再细述,接下来如图(c)在view.cpp中输入代码并编译运行无误得到结果三、实验内容// 多边形View.cpp : implementation of the CMyView class//#include "stdafx.h"#include "多边形.h"#include "多边形Doc.h"#include "多边形View.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CMyViewIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)//{{AFX_MSG_MAP(CMyView)ON_COMMAND(ID_DUOBIANXING, OnDuobianxing)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMyView construction/destructionCMyView::CMyView(){// TODO: add construction code here}CMyView::~CMyView(){}BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////// // CMyView drawingvoid CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// Circle(100,RGB(0,168,168),pDC) ;// TODO: add draw code for native data here}///////////////////////////////////////////////////////////////////////////// // CMyView printingBOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}///////////////////////////////////////////////////////////////////////////// // CMyView diagnostics#ifdef _DEBUGvoid CMyView::AssertValid() const{CView::AssertValid();}void CMyView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMyDoc* CMyView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));return (CMyDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CMyView message handlersvoid CMyView::OnDuobianxing(){// TODO: Add your command handler code here//CMyDoc* pDoc = GetDocument();//ASSERT_VALID(pDoc);CDC *pDC=GetDC();const int POINTNUM=10; //多边形点数.typedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;struct point{float x;float y;}polypoint[POINTNUM]={200,150,350,50,350,400,250,250,100,350,200,200,300,200,400,200};//多边形顶点int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY)MaxY=polypoint[i].y;AET *pAET=new AET;pAET->next=NULL;NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}for(i=0;i<=MaxY;i++){for(int j=0;j<POINTNUM;j++)if(polypoint[j].y==i){if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y){NET *p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTN UM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y){NET *p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTN UM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}for(i=0;i<=MaxY;i++){NET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}//断表排序,不再开辟空间AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}//配对填充颜色p=pAET->next;while(p && p->next){for(float j=p->x;j<=p->next->x;j++)pDC->SetPixel(static_cast<int>(j),i,RGB(168,255,55));p=p->next->next;//考虑端点情况}}ReleaseDC(pDC);}四、实验结果五、实验总结分析做这个实验要借助数组链表和指针的用法,通过研究,更熟练了用指针进行扫描来绘制圆,通过做这实验,也提升了我对这门课的兴趣。

计算机图形学实验(3-6)

计算机图形学实验(3-6)

实验三:区域填充一、实验目的区域填充是指先将区域内的一点(常称为种子点)赋予给定颜色,然后将这种颜色扩展到整个区域内的过程。

区域填充技术广泛应用于交互式图形、动画和美术画的计算机辅助制作中。

本实验采用递归填充算法或扫描线算法实现对光栅图形的区域填充。

通过本实验,可以掌握光栅图形编程的基本原理和方法。

二、实验内容掌握光栅图形的表示方法,实现种子算法或扫描线算法。

通过程序设计实现上述算法。

建议采用VC++实现OpenGL程序设计。

三、实验原理、方法和手段递归算法在要填充的区域内取一点(X,Y)的当前颜色记为oldcolor,用要填充的颜色newcolor去取代,递归函数如下:procedure flood-fill(X,Y,oldcolor,newcolor:integer);beginif getpixel(framebuffer,x,y)=oldcolorthen beginsetpixel(framebuffer,x,y,newcolor);flood-fill(X,Y+1,oldcolor,newcolor);flood-fill(X,Y-1,oldcolor,newcolor);flood-fill(X-1,Y,oldcolor,newcolor);flood-fill(X+1,Y,oldcolor,newcolor);endend扫描线算法扫描线算法的效率明显高于递归算法,其算法的基本思想如下:(1)(初始化)将算法设置的堆栈置为空,将给定的种子点(x,y)压入堆栈。

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

(3)(区段填充)从种子点(x,y)开始沿纵坐标为y的当前扫描线向左右两个方向逐个象素进行填色,其值置为newcolor,直到抵达边界为止。

(4)(定范围)以x left和x right分别表示在步骤3中填充的区段两端点的横坐标。

(5)(进栈)分别在与当前扫描线相邻的上下两条扫描线上,确定位于区间[x left,x right]内的给定区域的区段。

计算机图形学实验四 区域填充算法的实现

计算机图形学实验四   区域填充算法的实现

实验四区域填充算法的实现班级 08信计2班学号 20080502082 姓名分数一、实验目的和要求:1、理解区域的表示和类型。

2、能正确区分四连通和八连通的区域3、了解区域填充的实验原理。

4、利用C++实现区域填充的递归算法。

二、实验内容:1假设在多边形内有一像素已知,由此出发利用连通性找到区域内所有像素。

2 取(x,y)为种子点将整个区域填充为新的颜色。

3 进行递归填充。

三、实验结果分析区域填充属性包括填充样式,填充颜色和填充图案的类型。

C语言中定义了某种图形后,即可调用-floodfill函数,对指定区域进行填充. 程序代码#define pi 3.141592#define MAX(a,b) (a>b)? a:b#define MIN(a,b) (a<b)? a:b#include "graphics.h"#include "math.h"struct edge {int ymax;float x;float delat;struct edge * pedge; };struct point{int x;int y;} ;struct et { struct edge * pedge;int n;};struct edge g_aet[10];struct edge dge[10];struct et g_et[10];struct point point1,point2;int ZUO(float x){ if((int)x==x)return (int)x;return (int)x+1;}int YOU(float x){ if((int)x==x)return (int)x-1;return (int)x;}int k=400,l=0;void draw1(){int i,t,j,a,c,p,z; float b;struct edge temp;for(i=k;i<=l;i++){a=0;for(t=0;t<=9;t++){ if(g_et[t].n==i) break;}for(j=0;j<=9;j++){ if(g_aet[j].ymax==0) break;}if(t!=10){ g_aet[j].ymax=g_et[t].pedge->ymax;g_aet[j].x=g_et[t].pedge->x;g_aet[j].delat=g_et[t].pedge->delat;if(g_et[t].pedge->pedge!=0){g_aet[j+1].ymax=g_et[t].pedge->pedge->ymax;g_aet[j+1].x=g_et[t].pedge->pedge->x;g_aet[j+1].delat=g_et[t].pedge->pedge->delat; }}for(j=0;j<=9;j++){ if(g_aet[j].ymax==0) break; }j--;for(t=0;t<=j;t++){ for(z=0;z<=j-1;z++){if(g_aet[z].x>g_aet[z+1].x){ temp.ymax=g_aet[z].ymax;temp.x=g_aet[z].x;temp.delat=g_aet[z].delat;g_aet[z].ymax=g_aet[z+1].ymax;g_aet[z].x=g_aet[z+1].x;g_aet[z].delat=g_aet[z+1].delat;g_aet[z+1].ymax=temp.ymax;g_aet[z+1].x=temp.x;g_aet[z+1].delat=temp.delat;}}}for(j=0;j<=9;j++){ if(g_aet[j].ymax==0) break; }j--;for(p=0;p<=j;p++){ a++;if(a%2!=0)b=g_aet[p].x;else{for(c=ZUO(b);c<=YOU(g_aet[p].x);c++)putpixel(c,i,2);}}for(t=0;t<=j;t++){ if(g_aet[t].ymax==(i+1)){ g_aet[t].ymax=0;g_aet[t].x=0;g_aet[t].delat=0;}g_aet[t].x+=g_aet[t].delat;}for(t=0;t<=j;t++){ for(z=0;z<=j-1;z++){if(g_aet[z].x<g_aet[z+1].x){ temp.ymax=g_aet[z].ymax;temp.x=g_aet[z].x;temp.delat=g_aet[z].delat;g_aet[z].ymax=g_aet[z+1].ymax;g_aet[z].x=g_aet[z+1].x;g_aet[z].delat=g_aet[z+1].delat;g_aet[z+1].ymax=temp.ymax;g_aet[z+1].x=temp.x;g_aet[z+1].delat=temp.delat;}}}}}void generate(){int i,y,n=1,m,q,p;float x;for(i=0;i<=9;i++){if(n==1){ point2.x=point1.x=300;point2.y=point1.y=200;n++;}else{ if(n%2==0){ x=40*cos(i*pi/5)+200;y=40*sin(i*pi/5)+200;}else{ x=100*cos(i*pi/5)+200;y=100*sin(i*pi/5)+200;}if(point1.y==y) { n++; continue;}m=MIN(point1.y,y);if(x==point1.x){ dge[i-1].delat=0;dge[i-1].ymax=MAX(point1.y,y);dge[i-1].x=x;dge[i-1].pedge=0;for(q=0;q<=9;q++){ if(g_et[q].n==m) break;}if(q==10){g_et[i-1].pedge=&dge[i-1];g_et[i-1].n=m;}else{g_et[q].pedge->pedge=&dge[i-1];g_et[i-1].n=0;}}else{dge[i-1].delat=(float)(x-point1.x)/(y-point1.y);dge[i-1].ymax=MAX(point1.y,y);if(point1.y>y) dge[i-1].x=x;else {dge[i-1].x=point1.x; }dge[i-1].pedge=0;for(q=0;q<=9;q++){ if(g_et[q].n==m) break;}if(q==10){ g_et[i-1].pedge=&dge[i-1];g_et[i-1].n=m;}else{g_et[q].pedge->pedge=&dge[i-1];g_et[i-1].n=0;}}p=MAX(point1.y,y);k=MIN(k,m);l=MAX(l,p);point1.x=x;point1.y=y;n++;}}if(point1.y==point2.y) return;else{if(point2.x==point1.x){dge[i-1].delat=0;dge[i-1].ymax=MAX(point1.y,point2.y);dge[i-1].x=point2.x;}else{ dge[i-1].ymax=MAX(point1.y,point2.y);if(point1.y>point2.y) dge[i-1].x=point2.x;else {dge[i-1].x=point1.x;}dge[i-1].delat=(float)(point2.x-point1.x)/(point2.y-point1.y);}}m=MIN(point1.y,point2.y);k=MIN(k,m);l=MAX(l,dge[i-1].ymax);g_et[i-1].n=m;g_et[i-1].pedge=&dge[i-1];}void main(){ int driver=DETECT,mode; int i; registerbgidriver(EGA VGA_driver);initgraph(&driver,&mode,"\\tc");initgraph(&driver,&mode,"\\tc");for(i=0;i<=9;i++){ g_aet[i].ymax=0; g_aet[i].x=0; g_aet[i].delat=0;g_et[i].pedge=0;}generate();draw1();circle(200,200,100); circle(200,200,40);getch();closegraph();}。

填充算法实验报告

填充算法实验报告

填充算法实验报告实验报告:填充算法研究与实验1. 实验目的填充算法在计算机图形学中有着广泛的应用,并且对于计算机图形学的发展有着重要意义。

本次实验旨在通过对填充算法的研究与实验,了解填充算法的原理和应用,掌握填充算法的基本实现方法,实现简单的填充效果。

2. 实验背景填充算法是计算机图形学中的一种常用算法,用于将指定区域进行填充。

填充算法可以应用于图像的编辑、区域选择、图像渲染等方面。

常见的填充算法包括区域种子填充算法、扫描线填充算法等。

3. 实验内容本次实验主要研究和实现了区域种子填充算法和扫描线填充算法。

区域种子填充算法是指通过指定一个待填充的种子点,在其周围的区域进行填充。

扫描线填充算法是指通过扫描图像的每一行,在特定条件下对像素进行填充。

在实验中,我们首先实现了区域种子填充算法。

通过在待填充的区域中选择一个点作为种子点,然后从指定点出发,通过递归或栈的方式对相邻的像素进行着色,直到遇到与起始点像素颜色不同的像素为止,从而完成填充效果。

其次,我们实现了扫描线填充算法。

这种算法的核心是扫描图像的每一行,在每一行上找到待填充区域的边界并将其记录下来,然后根据边界的位置对每一个像素进行填充。

我们采用了活性边表和扫描线转换算法来实现扫描线填充算法。

4. 实验结果通过实验我们成功实现了区域种子填充算法和扫描线填充算法,在输入指定的区域和种子点后,程序能够快速地对指定区域进行填充,生成了良好的填充效果。

5. 实验分析区域种子填充算法是一种简单且直观的填充算法,但对于复杂区域的填充效果并不理想。

它的主要缺点是可能导致栈溢出或填充效果不均匀,因此在实际应用中不太常用。

相比之下,扫描线填充算法具有更好的填充效果和效率。

其使用了活性边表和扫描线转换算法,可以在进行每一行的扫描时快速地找到边界并进行填充。

但该算法无法很好地处理较复杂的几何形状,例如存在凹陷和自相交的区域。

6. 实验总结通过本次实验,我们深入学习了填充算法的基本原理和实现方法,并成功实现了区域种子填充算法和扫描线填充算法。

计算机图形学-区域填充

计算机图形学-区域填充

实验(No. 4)题目:区域填充实验目的及要求:一、实验目的:掌握基本光栅图形的生成原理和算法。

使用Visual C++实现区域填充。

二、实验要求:1 在OnDraw函数里绘制一个欲填充的多边形区域;--用CPen类;2 在C**View类里添加一个实现函数FloodFill4;-p443 在OnDraw函数里确定种子点,调用该实现函数;4 每人单独完成实验,多边形的边的数目和座标不能和例子相同。

5 不要取中文类名;工程(project)以自己名字全拼和/或学号来命名;6 思考能否像实验五那样,做出一个菜单来实现填充算法?三、实验设备:微机,Visual C++6.0四、实验内容及步骤:1 打开VC,打开原来建立的工程CG。

文件名为cg.dsw。

2 在CGView.cpp文件中(类CCGView中),添加函数void FloodFill4(int x, int y, COLORREFoldColor, COLORREF newColor)。

方法如下:在VC界面的ClassView中,右键单击CCGView 类,出现图1所示的界面,点击“Add Member Function…”菜单,出现图2的对话框,在其中分别完成对函数FloodFill的定义和声明。

图1图23 在函数体void FloodFill4(int x, int y, COLORREF oldColor, COLORREF newColor)中,实现这个内点表示的4连通区域的递归填充算法。

具体代码参考教材P44。

需要注意的是,FloodFill4函数中调用GetPixel和SetPixel函数之前需要得到设备上下文,即在函数体前部加入如下代码:CDC *pDC = this->GetDC();调用方式为:COLORREF color = pDC->GetPixel(x,y);同理,调用SetPixel函数的方式为:pDC->SetPixel(x,y,newColor);并在FloodFill4函数结尾前加上代码:this->ReleaseDC(pDC);以释放DC,避免对资源的过多占用。

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

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

课程设计报告课程名称计算机图形学课题名称多边形裁剪与填充专业计算机科学与技术班级学号姓名指导教师刘长松曹燚年月日湖南工程学院课程设计任务书课程名称计算机图形学课题多边形裁剪与填充专业班级学生姓名学号指导老师刘长松曹燚审批任务书下达日期年月日任务完成日期年月日一、设计内容与设计要求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字以上(不含程序原代码)。

【2018最新】实验5 计算机图形学 实验报告-实用word文档 (12页)

【2018最新】实验5 计算机图形学 实验报告-实用word文档 (12页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==实验5 计算机图形学实验报告实验5 实验报告格式《计算机图形学》实验5实验报告xxxxxxxxxxxxxxxx实验题目:多边形裁剪与填充实验内容:1 阅读理解提供的参考资料。

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

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

参考资料:1 fillPolygon.java2 clipSC2.java2变换与剪裁.ppt3多边形的填充.ppt基本概念:(详细叙述自己对实验内容的理解)变换与裁剪基本概念的理解:矢量:矢量是一个n元组,在坐标系中它对应于n维空间的一个点,这个点可以代表物体在空间的位置,也可以代表其运动状态等。

模型坐标系(局部坐标系):当构造单个对象的数字模型时,为了方便,可以将其置于一个特定的坐标系下,即模型坐标系或局部坐标系.世界坐标系:为描述图形场景中所有图形之间的空间关系,将它们置于一个统一的坐标系中,该坐标系被称为世界坐标系。

标准化设备坐标系:有些图形系统,对设备坐标系进行了规范化,将坐标范围限定在区间{x,y,z | 0≤x≤1, 0≤y≤1, 0≤z≤1}内,称标准化设备坐标系投影: 三维空间中的对象要在二维的屏幕或图纸上显示出来,就必须通过投影。

投影的方法有两种,平行投影和透视投影。

视区:在屏幕或绘图纸上定义一个矩形,称为视区,也称为视口,窗口内的景物在视区中显示。

平移:点(x′,y′,z′)由点(x, y, z)在x, y和z轴方向分别移动距离Δx,Δy和Δz得到。

两点坐标间的关系为x′=x+Δxy′=y+Δy (4.1)z′=z+Δz放大和缩小—以原点为中心的缩放:设点(x, y, z)经缩放变换后得点(x′,y′,z′)。

两点坐标间的关系为其中sx,sy和sz 分别为沿x, y和z轴方向放缩的比例。

计算机图形学第三次实验

计算机图形学第三次实验

重庆大学学生实验报告实验课程名称计算机图形学开课实验室DS1501学院软件学院年级一三级专业班学生姓名学号开课时间2015 至2016 学年第 1 学期软件学院制《基本图形元素的生成算法(直线)》实验报告开课实验室:年月日2)上述两条件均不满足,则计算图形与裁剪边界的交点,将该线段分为分别位于裁剪区域内、外的两段,再重复1)。

在分段时,依据端点的区域码分别计算线段与各条裁剪边界的交点,如图3.10所示,对P1就需要分别计算交点P3和P4;即只要按顺序检测端点区域码的每一位,当某位不为0时,才把线段与对应的裁剪边界进行求交。

四、实验步骤程序代码部分://扫描线算法:BOOL PtInPolygon (int x,int y, int a[][2],int nCount)//POINT p, LPPOINT ptPolygon, int nCount) {int nCross = 0; // 交点for (int i = 0; i < nCount; i++){POINT p1,p2 ;p1.x= a[i][0];p1.y= a[i][1];p2.x= a[(i + 1) % nCount][0];p2.y= a[(i + 1) % nCount][1];// 求解 y=p.y 与 p1p2 的交点if ( p1.y == p2.y ) // p1p2 与 y=p0.y平行continue;if ( y < min(p1.y, p2.y) ) // 交点在p1p2延长线上continue;if ( y >= max(p1.y, p2.y) ) // 交点在p1p2延长线上continue;// 求交点的 X 坐标 --------------------------------------------------------------double zx = (double)(y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;if ( zx > x )nCross++; // 只统计单边交点}// 单边交点为偶数,点在多边形之外 ---return (nCross % 2 == 1);}void EdgeMarkFill(CDC *p, int a[][2],int n,COLORREF boundarycolor,COLORREF newcolor) {int i,j,x,y,flag,xmin,xmax,ymin,ymax;CPen *pPen = new CPen();pPen ->CreatePen(PS_SOLID, 2, boundarycolor);CGdiObject *pOldPen = p ->SelectObject(pPen);p ->MoveTo(220+20*a[0][0],220-20*a[0][1]);for(i=0;i<n;i++){if(i+1==n)p ->LineTo(220+20*a[0][0],220-20*a[0][1]);//DDALine(p,a[i][0],a[i][1],a[0][0],a[0][1],boundarycolor);elsep ->LineTo(220+20*a[i+1][0],220-20*a[i+1][1]);//DDALine(p,a[i][0],a[i][1],a[i+1][0],a[i+1][1],boundarycolor);}delete pPen;xmin=xmax=a[0][0];ymin=ymax=a[0][1];for(i=0;i<n;i++){if(a[i][0]<xmin)xmin=a[i][0];if(a[i][0]>xmax)xmax=a[i][0];if(a[i][1]<ymin)ymin=a[i][1];if(a[i][1]>ymax)ymax=a[i][1];}for(j=ymin;j<ymax;j++)for(i=xmin;i<xmax;i++)if(PtInPolygon(i,j,a,n))setpoint(p,i,j,newcolor);}结果如图。

计算机图形学实验四 :裁剪

计算机图形学实验四 :裁剪

贵州大学实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131glColor3f(0.0f, 1.0f, 0.0f);glVertex2f(x1, y1);glEnd();}//矩形的结构体typedef struct Rectangle{float xmin;float xmax;float ymin;float ymax;} Rectan;Rectan rect;int x0, y0, x1, y1;//求出坐标点的Cohen-Sutherland编码int CompCode(int x, int y, Rectan rect) {int code = 0x00;if (y < rect.ymin){code = code | 4;}if (y>rect.ymax){code = code | 8;}if (x>rect.xmax){code = code | 2;}if (x<rect.xmin){code = code | 1;}return code;}//裁剪直线int cohensutherlandlineclip(Rectan rect, int& x0, int& y0, int& x1, int& y1) {int accept = 0, done = 0;float x, y;int code0, code1, codeout;int x00 = x0, y00 = y0, x11 = x1, y11 = y1;code0 = CompCode(x0, y0, rect);code1 = CompCode(x1, y1, rect);//直线全部在矩形框内部,应保留if (!(code0 | code1)){accept = 1;done = 1;}//直线和矩形不相交,并且划直线的两点在矩形同侧(上、下、右。

实验5实验报告格式 多边形裁剪与填充

实验5实验报告格式 多边形裁剪与填充

《计算机图形学》实验5实验报告实验题目:多边形裁剪与填充实验内容:1 阅读理解提供的参考资料。

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

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

参考资料:1 fillPolygon.java2 clipSC2.java2变换与剪裁.ppt3多边形的填充.ppt基本概念:1.多边形的填充多边形的填充:讨论二维区域的填充问题,即面着色的问题,也就是为指定的平面区域填上所需要的颜色。

多边形填充就是把多边形的顶点表示转换为点阵表示,即从多边形的给定边界出发,求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或颜色。

实际上,也就是多边形内的区域的着色过程。

2.Sutherland–Cohen裁剪算法裁剪作用:选择显示的内容--图形在窗口内的部分被显示出来,窗口外的部分被裁剪掉. 图形中每个基本元素都要经过裁剪,因此裁剪直接影响整个图形系统的效率。

裁剪类型:二维裁剪、三维裁剪裁剪窗口:矩形,凸多边形,任意多边形视见体:棱台、立方体裁剪对象:直线段、多边形、文字等Sutherland–Cohen算法分成两部分:第一步是判定:1) 完全在窗口内的直线段,称为完全可见的线段;2) 完全在窗口外的线段,称为完全不可见线段。

为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。

窗口的四条边把整个平面分成九个区域,每一个区域采用四位编码表示:在x=xL左侧的区域,编码的第四位是1;在x=xR右侧的区域,编码的第三位是1;在y=yB下侧的区域,编码的第二位是1;在y=yT上侧的区域,编码的第一位是1。

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

线段KL为例,从K点(1001)的编码分析出K在x=xL的左侧,KL必和x=xL有交点,求出其交点M,KM显然是完全不可见的,因而只要对ML从第一步开始重复上述处理步骤。

由于ML还是不能用第一步下结论,又从M的编码发现M在y=yT的上侧,因而要求ML 和y=yT的交点N。

实训4 区域填充和图形的裁剪

实训4  区域填充和图形的裁剪

实训4 区域填充和图形的裁剪一、实验目的1.通过实验,进一步理解和掌握扫描线填充算法;2.掌握用扫描线填充算法进行区域填充的基本过程;3.通过编程,会在TC环境下用扫描线填充算法编程实现一个饼型图的绘制;4.通过实验,进一步理解和掌握Sutherland 裁剪算法;5.掌握用Sutherland 裁剪算法裁减多边形的基本过程;6.通过编程,会在TC环境下用Sutherland 算法编程实现用矩形窗口对多边形的裁剪。

二、实验环境计算机、Turbo C或其他C语言程序设计环境三、实验内容1.用扫描线填充算法编程实现一个彩色饼型图的绘制;2.用Sutherland 算法编程实现用矩形窗口对多条直线的裁剪。

四、实验步骤1.算法、原理清晰,有详细的设计步骤;对于每条线段P1P2,分为三种情况处理。

a.若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。

b.若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。

c.若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。

其中一段完全在窗口外,可弃之。

然后对另一段重复上述处理。

2.依据算法、步骤或程序流程图,用C语言编写源程序;参考程序:#include <graphics.h>#include <stdio.h>int lt,rt,bm,tp;int wx[2],wy[2],wt[2],wb[2],wl[2],wr[2];void exlip(int wx[2],int wy[2]);void flagw(int *pti,int wx[2],int wy[2]){int i=*pti;wt[i]=0;wb[i]=0;wl[i]=0;wr[i]=0;if(wx[i]<lt) wl[i]=1;if(wx[i]>rt) wr[i]=1;if(wy[i]<tp) wt[i]=1;if(wy[i]>bm) wb[i]=1;}void exclip(int wx[2],int wy[2]){int i;if(wl[0]*wl[1]+wr[0]*wr[1]+wt[0]*wt[1]+wb[0]*wb[1]!=0) return; i=0;if(wl[0]+wr[0]+wt[0]+wb[0]==0){i=1;if(wl[1]+wr[1]+wt[1]+wb[1]==0){line(wx[0],wy[0],wx[1],wy[1]);return;}}if(wl[i]==1){wy[i]=wy[0]+(wy[1]-wy[0])*(lt-wx[0])/(wx[1]-wx[0]);wx[i]=lt;flagw(&i,wx,wy);exclip(wx,wy);}if(wr[i]==1){wy[i]=wy[0]+(wy[1]-wy[0])*(rt-wx[0])/(wx[1]-wx[0]);wx[i]=rt;flagw(&i,wx,wy);exclip(wx,wy);}if(wt[i]==1){wx[i]=wx[0]+(wx[1]-wx[0])*(tp-wy[0])/(wy[1]-wy[0]);wy[i]=tp;flagw(&i,wx,wy);exclip(wx,wy);}if(wb[i]==1){wx[i]=wx[0]+(wx[1]-wx[0])*(bm-wy[0])/(wy[1]-wy[0]);wy[i]=bm;flagw(&i,wx,wy);exclip(wx,wy);}}void clip(int left,int top,int right,int bottom,int px,int py,int qx,int qy) {int ui;lt=left;rt=right;bm=bottom;tp=top;wx[0]=px;wy[0]=py;wx[1]=qx;wy[1]=qy;setcolor(4);line(px,py,qx,qy);setcolor(2);for(ui=0;ui<2;ui++) flagw(&ui,wx,wy);exclip(wx,wy);}main(){int driver=DETECT,mode=0;initgraph(&driver,&mode,"");setbkcolor(BLUE);setcolor(YELLOW);rectangle(140,100,340,340);clip(140,100,340,340,200,300,250,250);clip(140,100,340,340,250,400,400,200);clip(140,100,340,340,70,200,250,240);getch();closegraph();}3.编辑源程序并进行调试;4.进行运行测试,并结合情况进行调整;5.对运行结果进行保存与分析;Cohen-SutherLand裁剪算法的原理。

计算机图形学--区域填充算法的实现

计算机图形学--区域填充算法的实现

计算机图形学--区域填充算法的实现实验四区域填充算法的实现班级 08信计二学号 64 姓名刘辉分数一、实验目的和要求:1、理解区域的表示和类型;2、能够正确区分四连通、八连通的区域;3、了解填充函数、区域填充的实现原理;4、了解掌握区域填充的各种算法(种子填充算法、扫描线算法、边填充算法等),并实现种子填充算法和扫描线算法;5、用种子填充算法实现四连同区域和八连通区域的填充,并观察他们之间的区别;6、分析对比种子填充算法和扫描线算法实现的像素逼近效果和程序执行速度;二、实验原理:用点阵方法表示的多边形区域,如果其内部像素具有同一种颜色,而边界像素具有另一种颜色,可以使用种子填充算法和扫描线算法等填充。

种子填充算法是从区域内任一个种子像素位置(x,y)开始,由内向外将填充色扩散到整个多边形区域的填充过程;扫描线填充算法是当给定种子点(x,y)时,首先填充种子点所在扫描线上位于给定区域的一个区段,然后确定与这一段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来的过程。

三、实验内容及步骤:3.1、实验内容:1.利用种子算法实现内点表示的四连通区域的填充。

如:设(x,y)为内点表示的四连通区域内的一点,oldcolor为区域的原色,要将整个区域填充为新的颜色newcolor;2.利用扫描线算法实现以上区域的填充。

如:填充以下图案,圆中填充蓝色,三角形中填充红色;3.2、实验步骤:种子填充算法的步骤:1.种子入栈;2.当栈非空时,进行下面的操作,否则结束;3.栈顶元素出栈,如果是未填充的内部点,则将其填充,继续考察与其连通的点,若是为填充的内部点,则该点入栈,返回2步。

扫描线填充算法的步骤:1.初始化,置栈为空,将种子点(x,y)入栈。

2.出栈,若栈空则结束;否则取栈顶元素(x,y),以y作为扫描线。

3.填充并确定种子点所在区段,从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。

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

实验报告模板
《计算机图形学》实验报告
区域填充算法、裁剪算法
一、实验目的及要求
上机用所学的算法来填充多边形区域,在所给的区域里面剪裁所给出的线段。

二、理论基础
区域填充:区域填充所采用的算法是种子天填充算法。

算法的主要思想是在所给定的区域类取一点作为种子,然后向种子坐标的上下左右,或者上下左右,左上,左下,右上,右下八个方向进行填充,从而达到填充整个区域的目地。

但是由于在上述的算法中其他的新种子呀进行入栈,就会使得很多用过的种子从新入栈,使效率不高。

所以重新设计了一下算法,采用取一点先横向填充,即(x0,y0)y0,不变x0++或者x0--,在所给定的范围之类填充完了之后再采用y+1,y-1.上下两个方向进行填充。

剪裁:选用了Cohe-SutherLand算法,剪裁算法的主体思想是先将整个区域分成9个区域。

如图所示
1001 1000 1010
0001 0000 0010
0101 0100 0110
其中0000里面是所需要的剪裁的部分。

在一条直线在这个区域里面。

它的两个端点将会落在上面的区域中的任何一个区域中。

1) 当线段完全在框里面,取这个两个端点;2) 当这条直线明显在区域外面,则抛弃;3) 如果不满足上面的2个条件,则把线段分成两段,其中一段在外面,则放弃,在里面则保留。

通过上面的标记来判断端点是否在区域里面。

三、算法设计与分析
剪裁:
void COpenglForMFCView::OnAreaCut()
{
// TODO: Add your command handler code here
m_bClip = !m_bClip ;
if( !m_bClip )
return ;
// 直线端点集合数组一定为端点对偶数个点坐标和裁剪准备时数据一致
int nvLines[8][2] = {{0,0},{100,100},{10,201},{-200,-50},{-50,-140},{-50,140},{-80,10},{240,270}};
// 裁剪窗口边界坐标上下左右
int nvClip[4] = {100,-100,-100,100};
// 加入裁剪代码得到最终的直线端点代码存入裁剪后数据集
// 存入的数据位nvLineFinal
int nvLineFinal[8][2] ; //存入最终的剪裁的坐标
// 处理过程
// AfxMessageBox(_T("Please Insert The Clip Code!") );
// 保存过程
vLineFinal.clear() ;
int i = 0 ;
int nValidLineNum = 0 ; // 有效直线端点对数目根据实际情况修改有效坐标Point2D oPtTmp ;
////////////////////////算法填写位置///////////////////////////////////////////////
float x0,y0,x1,y1,left,right,bottom,top,x,y;
int code1,code2,code;
//将存入边界的上下左右的信息
top = nvClip[0];
bottom =nvClip[1];
left = nvClip[2];
right = nvClip[3];
for (i=0;i<8;i+=2)
{
x0 = nvLines[i][0]; //存入任意直线的起点与终点坐标
y0 = nvLines[i][1];
x1 = nvLines[i+1][0];
y1 = nvLines[i+1][1];
encode(x0,y0,&code1,top,right,bottom,left);
encode(x1,y1,&code2,top,right,bottom,left);
while(code1<<1>0||code2<<1>0)
{
if ((code1&code2)<<1>0) break;
code = code1;
if(code1==0) code = code2;
if ((1&code)<<1>0) //1是左边线段与左边界相交
{
x = left;
y = y0 + (y1 - y0)*(left - x0)/(x1-x0);
}
else if((2&code)<<1>0) //2是右边界线段与右边界相交
{
x = right;
y = y0 + (y1 - y0)*(right - x0)/(x1-x0);
}
else if ((4&code)<<1>0) //4是底边界线段与底边界相交
{
y = bottom;
x = x0 + (x1-x0)*(bottom - y0)/(y1-y0);
}
else if ((8&code)<<1>0) //8是顶边界线段与顶边界相交
{
y = top;
x = x0 + (x1-x0)*(top - y0)/(y1-y0);
}
if (code == code1)
{
x0 = x;
y0 = y;
encode(x0,y0,&code1,top,right,bottom,left);
}
else
{
x1 = x;
y1 = y;
encode(x1,y1,&code2,top,right,bottom,left);
}
}
/*oPtTmp.x=x0;
oPtTmp.y=y0;
vLineFinal.push_back(oPtTmp) ;
oPtTmp.x=x1;
oPtTmp.y=y1;
vLineFinal.push_back(oPtTmp) ; */
//if
((x0>left&&x0<right)&&(x1>left&&x1<right)&&(y0>bottom&&y0<top)&&(y1>bottom&&y1<top) )
{
nvLineFinal[nValidLineNum][0] = x0; //将最终的坐标存入数组
nvLineFinal[nValidLineNum][1] = y0;
nvLineFinal[nValidLineNum+1][0] = x1;
nvLineFinal[nValidLineNum+1][1] = y1;
nValidLineNum += 2;
}
}
/////////////////////////////////////////////////////////////////////////////
for( i = 0 ; i < nValidLineNum ; ++i )
{
oPtTmp.x = nvLineFinal[i][0] ;
oPtTmp.y = nvLineFinal[i][1] ;
vLineFinal.push_back(oPtTmp) ;
}
// 将裁剪窗口边界信息保存
vClipWnd.clear() ;
// 左上
oPtTmp.x = nvClip[2] ;
oPtTmp.y = nvClip[0] ;
vClipWnd.push_back(oPtTmp) ;
// 左下
oPtTmp.y = nvClip[1] ;
vClipWnd.push_back(oPtTmp) ;
// 右下
vClipWnd.push_back(oPtTmp) ;
oPtTmp.x = nvClip[3] ;
vClipWnd.push_back(oPtTmp) ;
// 右上
vClipWnd.push_back(oPtTmp) ;
oPtTmp.y = nvClip[0] ;
vClipWnd.push_back(oPtTmp) ;
// 左上
vClipWnd.push_back(oPtTmp) ;
oPtTmp.x = nvClip[2] ;
vClipWnd.push_back(oPtTmp) ;
return ;
}
四、程序调试及结果的分析
五、实验心得及建议
在实验过程中,将画线分成了几个部分。

分别是k为无穷的时候,0<k<=1,k>1,-1<=k<0,k<-1.这几种情况。

采用了分而治之的思想,各个击破。

但是在算法实现中还是遇到了一些困难。

例如对c++的不了解,花费了大量的时间在阅读程序上,还有就不问题考虑的不过全面。

花费了很多时间去了调试,另一个是在细节方面处理得不够好,所画的直线有些地方还是有“折”样。

评语:。

相关文档
最新文档