搜档网
当前位置:搜档网 › 计算机图形学 多边形裁剪与填充 计算机图形学课程设计

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

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

课程设计报告

课程名称计算机图形学

课题名称多边形裁剪与填充

专业计算机科学与技术

班级计算机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字以上(不含程序原代码)。

一、题目内容说明:

1、交互式地实现多边形的裁剪和填充。

2、功能要求:

1)窗口功能设计。

2)实现鼠标画多边形与数据存储功能。

4)实现鼠标剪裁窗口选择功能。

5)实现多边形裁剪和填充功能。

二、总体设计:

本程序使用MFC实现多边形的裁剪和填充绘图程序。

多边形裁剪算法分析:

基本思想是一次用窗口的一条边裁剪多边形,窗口的一条边以及延长线构成裁剪线,改线把平面分成两个部分:可见一侧,不可见一侧。用一条裁剪边多多边形进行裁剪,得

到一个顶点序列,作为吓一条裁剪边处理过程的输入点。

对于每一条裁剪边,只是判断点在窗口的哪一测以及求线段与裁剪边的交点算法应随之改变。

仅用一条裁剪边时,逐次多边形裁剪框图:

在CGraphics类的CutRectangular(CRect)函数中实现对多边形的裁剪

多边形填充算法分析:

确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax),

从y=ymin 到 y=ymax, 每次用一条扫描进行填充。对一条扫描线填充的过程可分为四个步骤: a.求交b.排序c.交点配对d.区间填色。在CGraphics类中的FillPlogon函数中实现多边形的填充算法。

三、模块设计:

各个程序函数的功能,参数,变量的说明:

MFC应用程序框架中类的详细解析:

1.MainFrm:创建窗口及窗口里的菜单、工具栏、状态栏等实现交互的按钮。

1)函数int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){}创建菜单、工具栏、状栏。

2)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)设置窗口的大小和初始位置。

2.图像裁剪View:视图,负责内存数据与用户的交互,包括数据的显示、菜单的选取,

鼠标的响应。

1.void CMyView::OnLButtonDown(UINT nFlags, CPoint point){}对鼠标按下

左键的响应,如果是自定义裁剪的区域操作就捕获鼠标按下的点,画裁剪区

域,如果是自定义点坐标的操作就捕获鼠标的点画多边形。

2.void CMyView::OnMouseMove(UINT nFlags, CPoint point){}对

鼠标移动的响应。用捕获的点画出相应的矩形裁剪边框。画边框的时候,先

用白色擦出原先的矩形边框,再用虚线画出新的举行边框

3.void CMyView::OnRButtonUp(UINT nFlags, CPoint point){}对鼠标放开左

键的相应。如果是自定义点的坐标,就获取新的初始裁减矩形范围。

4.void CMyView::OnLButtonUp(UINT nFlags, CPoint point){}对鼠标放开左

键的响应

5.void CMyView::OnInitialUpdate(){}初始化裁剪区域和在窗口中画一个矩

形和一个五角星。

6.void CMyView::OnDraw(CDC* pDC){}重画窗口,用

voidCMyView::OnInitialUpdate{}来启动它,通过消息映射表处理菜单、工

具条、快捷键和其他用户消息。定义裁剪矩形区域,并赋值。当自定义多边

形坐标时,在各个点坐标处画一个小圆,以显示点的位置。画出多边形。

3.图像裁剪DOC:文档,负责内存数据与磁盘的交互。

1、void CMyDoc::OnFillployon(){}

2、void CMyDoc::OnUpdateFillployon(CCmdUI* pCmdUI){}

3、void CMyDoc::OnCutRect(){}

4、void CMyDoc::OnUpdateCutRect(CCmdUI* pCmdUI){}

4.CGraphics:实现多边形的填充和裁剪。

1、构造函数CGraphics():PointCount(10),Point(NULL){}初始化五角星的顶点

坐标。

2、析构函数~CGraphics(){}删除动态生成的Point指针。

3、bool DrawPloyon(CDC*);在指定设备中画多边形。

4、bool FillPloyon(CDC*);填充多边形。

5、bool InterCross(CPoint,CPoint,CPoint,CPoint,CPoint&);判断两条线段

是否相交。

6、bool CutRect(CRect);对多边形进行裁剪。

7、bool IsInSquareRgn(CRect,CPoint,int);对多边形裁剪时,判断线段断点是

否在可视一侧。

8、bool SortArray(int*,int);冒泡排序。

四、详细设计:

1、创建窗口、菜单、工具栏、状栏的函数。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbar\n");

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\n");

return -1; // fail to create

}

// TODO: Delete these three lines if you don't want the toolbar to

// be dockable

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

return 0;

}

2、鼠标按下左键的响应函数

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)

{

//对鼠标按下左键的相应

CScrollView::OnLButtonDown(nFlags, point);

if(m_bDefineRect)

{

//如果是自定义裁减的区域的操作

SetCapture();//捕获鼠标

m_bCaptured = TRUE;

CDC *dc=GetDC();

CRect rect(TopLeft,BottomRight);

dc->SelectStockObject(WHITE_PEN);

dc->Rectangle(rect);

InvalidateRect(rect,false);

TopLeft = point;

::SetCursor(::LoadCursor(NULL, IDC_CROSS));//设置鼠标样子为十字形的}

if(m_bDefinePointV)

{

//如果是自定义点坐标的操作

PointArray.Add(point);

CRect ellipseRect;

ellipseRect.top = point.y - 5;

ellipseRect.bottom = point.y + 5;

ellipseRect.left = point.x - 5;

ellipseRect.right = point.x + 5;

InvalidateRect(ellipseRect,true);

}

}

3、鼠标移动时的响应函数

void CMyView::OnMouseMove(UINT nFlags, CPoint point)

{

CScrollView::OnMouseMove(nFlags, point);

//对鼠标移动时的相应

if (m_bCaptured)

{

//画出相应的矩形裁减边框

CDC *dc=GetDC();

CRect rect(TopLeft,BottomRight);

dc->SelectStockObject(WHITE_PEN);

dc->Rectangle(rect);//用白色擦除原先的矩形边框

InvalidateRect(rect,false);

BottomRight=point;

CRect newrect(TopLeft,BottomRight);

CPen pen;

pen.CreatePen(PS_DOT,1,RGB(0,0,0));

dc->SelectObject(pen);

dc->Rectangle(newrect);//用虚线画出新的矩形边框 }

}

void CMyView::OnLButtonUp(UINT nFlags, CPoint point) {

CScrollView::OnLButtonUp(nFlags, point);

//对鼠标放开左键的响应

if (m_bCaptured)

{

::ReleaseCapture();

m_bCaptured = false;

m_bDefineRect = false;

}

}

void CMyView::OnViewDefineRect()

{

//设置是否自定义裁减区域

m_bDefineRect = true;

}

void CMyView::OnEditDefinePoint()

{

//设置是否自定义点的坐标

m_bDefinePointV = true;

}

4、放开鼠标右键的响应

void CMyView::OnRButtonUp(UINT nFlags, CPoint point) {

////对鼠标放开右键的相应

CScrollView::OnRButtonUp(nFlags, point);

if(m_bDefinePointV)

{

CMyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->m_grahics.PointCount=PointArray.GetSize();

if(pDoc->m_grahics.Point)

delete pDoc->m_grahics.Point;

pDoc->m_grahics.Point = new CPoint[pDoc->m_grahics.PointCount];

for(int i=0;im_grahics.PointCount;i++)

pDoc->m_grahics.Point[i]=PointArray.GetAt(i);//对Point点坐标重新赋值PointArray.RemoveAll();

m_bDefinePointV=false;

CRect rect;

this->GetClientRect(rect);

InvalidateRect(rect);

//获取新的初始裁减矩形范围

int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;

int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;

for(i=1;im_grahics.PointCount;i++)

{

if(minX > pDoc->m_grahics.Point[i].x)

minX = pDoc->m_grahics.Point[i].x;

if(minY > pDoc->m_grahics.Point[i].y)

minY = pDoc->m_grahics.Point[i].y;

if(maxX < pDoc->m_grahics.Point[i].x)

maxX = pDoc->m_grahics.Point[i].x;

if(maxY < pDoc->m_grahics.Point[i].y)

maxY = pDoc->m_grahics.Point[i].y;

}

TopLeft = CPoint(minX,minY);

BottomRight = CPoint(maxX,maxY);

}

}

5、初始化函数

void CMyView::OnInitialUpdate()

{

CScrollView::OnInitialUpdate();

CSize sizeTotal;

sizeTotal.cx = sizeTotal.cy = 100;

SetScrollSizes(MM_TEXT, sizeTotal);

CMyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//设置初始的裁减区域

int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;

int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;

for(int i=1;im_grahics.PointCount;i++)

{

if(minX > pDoc->m_grahics.Point[i].x)

minX = pDoc->m_grahics.Point[i].x;

if(minY > pDoc->m_grahics.Point[i].y)

minY = pDoc->m_grahics.Point[i].y;

if(maxX < pDoc->m_grahics.Point[i].x)

maxX = pDoc->m_grahics.Point[i].x;

if(maxY < pDoc->m_grahics.Point[i].y)

maxY = pDoc->m_grahics.Point[i].y;

}

TopLeft = CPoint(minX,minY);

BottomRight = CPoint(maxX,maxY);

}

6、重画窗口的函数,是MFC自动生成的,我们可以在里面添加自己的代码,用来实现消息映射表处理菜单、工具条、快捷键和其他用户消息。

void CMyView::OnDraw(CDC* pDC)

{

CMyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

int left,top,right,buttom;

left=min(TopLeft.x,BottomRight.x);

right=max(TopLeft.x,BottomRight.x);

top=min(TopLeft.y,BottomRight.y);

buttom=max(TopLeft.y,BottomRight.y);

CRect rect(left,top,right,buttom);

//定义裁减矩形区域,并赋值

CPen penDot,penSolid;

penDot.CreatePen(PS_DOT,1,RGB(0,0,0));

pDC->SelectObject(penDot);

pDC->Rectangle(rect);

//用虚线画出裁减矩形区域

penSolid.CreatePen(PS_SOLID,1,RGB(0,0,0));

pDC->SelectObject(penSolid);

if(PointArray.GetSize())

{

//当自定义多边形点坐标时,在各个点坐标处画一个小圆,以显示点的位置

int i;

for(i=0;i

{

pDC->MoveTo(PointArray.GetAt(i));

CRect ellipseRect;

ellipseRect.top = PointArray.GetAt(i).y - 5;

ellipseRect.bottom = PointArray.GetAt(i).y + 5;

ellipseRect.left = PointArray.GetAt(i).x - 5;

ellipseRect.right = PointArray.GetAt(i).x + 5;

pDC->Ellipse(ellipseRect);

}

}

if(pDoc->bCutRect)

{

//判断是否裁减,若是,则根据裁减区域进行裁减

pDoc->m_grahics.CutRect(rect);

pDoc->bCutRect=false;

}

pDoc->m_grahics.DrawPloyon(pDC);

//画出多边形

if(pDoc->bFillPloyon)

{

//判断是否填充,根据需要进行相应的操作

pDoc->m_grahics.FillPloyon(pDC);

pDoc->bFillPloyon=false;

}

}

7、在指定的pDC设备中,画多边形

bool CGraphics::DrawPloyon(CDC* pDC)

{

if(PointCount < 3)

return false;

//若多边形小于三个点则返回

pDC->MoveTo(Point[0]);

for(int i=1;i

{

pDC->LineTo(Point[i]);

}

pDC->LineTo(Point[0]);

//在pDC中画出多边形

return true;

}

8、填充多边形函数,重量级的函数

//在指定的pDC设备中,填充多边形

bool CGraphics::FillPloyon(CDC* pDC)

{

if(PointCount < 3)

return false;

//若多边形小于三个点则返回

int minX = Point[0].x , minY = Point[0].y;

int maxX = Point[0].x , maxY = Point[0].y;

for(int i=1;i

{

if(minX > Point[i].x)

minX = Point[i].x;

if(minY > Point[i].y)

minY = Point[i].y;

if(maxX < Point[i].x)

maxX = Point[i].x;

if(maxY < Point[i].y)

maxY = Point[i].y;

}

//获取多边形中所有坐标点的最大值和最小值,作为扫描线循环的范围

CUIntArray myArray;

int x,y;

for(y=minY;y

{

//扫描线从minY开始到maxY

for(i=0;i

{

//对每条边进行循环

CPoint PointCross;

int beforeI=BeforeIndex(i),afterI=AfterIndex(i);

//判断是否跟线段相交

if(InterCross(Point[beforeI],Point[i],CPoint(minX,y),CPoint(maxX,y),PointCross))

{

//若是存在交点,则进行相应的判断,即判断x的坐标取两次、一次还是不取

if(PointCross==Point[i])

{

if((Point[beforeI].y > PointCross.y) && (Point[afterI].y > PointCross.y))

{

myArray.Add(PointCross.x);

myArray.Add(PointCross.x);

//边顶点的y值大于交点的y值,x坐标取两次

}

else

if((Point[beforeI].y - PointCross.y) * (Point[afterI].y - PointCross.y) < 0)

myArray.Add(PointCross.x); //边顶点的y值在交点的y值之间,即一个顶点的y值大于交点的y值,而另一个小于,相应的x坐标取一次

else

if(PointCross.y==Point[afterI].y)

myArray.Add(PointCross.x);

}

else

if(PointCross==Point[beforeI])

{

continue;

}

else

myArray.Add(PointCross.x);//当交点不在线段的顶点时,x坐标只取一次

}

}

int *scanLineX,num=myArray.GetSize();

scanLineX = new int[num];

for(i=0;i

scanLineX[i]=myArray.GetAt(i);//获取扫描线x值,以构成填充区间myArray.RemoveAll();

SortArray(scanLineX,num);//对scanLine(扫描线x坐标进行排序)

for(i=0;i

{

if(i+1>=num)

break;

for(x=scanLineX[i];x

pDC->SetPixelV(CPoint(x,y),RGB(255,0,0));//将填充区间相应点的颜色设置成红色

}

Sleep(1);//CPU暂停1ms,以体现出多边形是以扫描线的方式,一条一条的填充的delete scanLineX;

}

return true;

}

9、裁剪多边形的函数,重量级的函数

bool CGraphics::CutRect(CRect rect)

{

CPoint rectPoint[4];

rectPoint[0].x = rect.left;

rectPoint[0].y = rect.top;

rectPoint[1].x = rect.right;

rectPoint[1].y = rect.top;

rectPoint[3].x = rect.left;

rectPoint[3].y = rect.bottom;

rectPoint[2].x = rect.right;

rectPoint[2].y = rect.bottom;

//获取裁减矩形的四个点的坐标,第一个点为左上,第二个点为右上,第三个点为右下,第四个点为左下

int i;

CArray myArray;//裁减后,保存的多边形的依次各点的坐标

for(int rectNum=0;rectNum<4;rectNum++)

{

//对裁减矩形的四条边进行循环

for(i=0;i

{

//对每条边进行循环

CPoint PointCross;

int beforeI=BeforeIndex(i),afterI=AfterIndex(i);

int afterrectNum = ((rectNum == 3)?0:rectNum+1);

//判断是否跟线段相交

if(InterCross(Point[beforeI],Point[i],rectPoint[rectNum],rectPoint[afterrectNum],P ointCross))

{

if(PointCross==Point[i])

{

myArray.Add(Point[i]);//交点在线段上,直接添加点坐标在保存多边形的数组中

}

else

if(PointCross==Point[beforeI])

{

if(IsInSquareRgn(rect,Point[i],rectNum))

myArray.Add(Point[i]);//判断是否可视,若是,则添加点坐标

}

else

{

myArray.Add(PointCross);//跟线段相交,但交点不在顶点上,添加交点坐标

if(IsInSquareRgn(rect,Point[i],rectNum))

myArray.Add(Point[i]);//判断是否可视,若是,则添加点坐标

}

}

else

if(IsInSquareRgn(rect,Point[i],rectNum))

myArray.Add(Point[i]);//线段不相交,但需判断是否可视,若是,则添加点坐标

}

PointCount=myArray.GetSize();

if(Point)

delete Point;

Point = new CPoint[PointCount];

for(i=0;i

Point[i]=myArray.GetAt(i);//重新赋予点坐标的值

myArray.RemoveAll();

}

return true;

}

10、判断判断两条线段是否相交的函数

bool CGraphics::InterCross(CPoint objectP1,CPoint objectP2,CPoint scanP1,CPoint scanP2,CPoint& coordinate)

{

//objectP1、objectP2是一条线段的顶点坐标,而scanP1、scanP2是另一条线段的顶点坐标if(objectP1 == objectP2)

return false;//若objectP1、objectP2相等,则构不成线段,退出

if(scanP1 == scanP2)

return false;//若scanP1、scanP2等,则构不成线段,退出

if( ( objectP1.y - objectP2.y ) * ( scanP1.x - scanP2.x )

== ( scanP1.y - scanP2.y ) * ( objectP1.x - objectP2.x))

{

//对斜率相等的情况下的处理

if((objectP1.y-objectP2.y)*(scanP1.x-objectP1.x)==(objectP1.x-objectP2.x)*(scanP1. y-objectP1.y))

{

//判断两条线段是不是同一条线段

coordinate=objectP2;

return true;

}

else

return false;

}

if(objectP1.x == objectP2.x)

{

//当第一条线段斜率不存在是的,处理办法

double x,y;

x = objectP1.x;

y = (scanP1.y-scanP2.y)*1.0/(scanP1.x-scanP2.x)*(objectP1.x-scanP1.x)+scanP1.y;

y = (float)((int)(y+0.5));

if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))

{

//判断交点是不是在该两条线段上

coordinate.x = objectP1.x;

coordinate.y = (int)(y+0.5);

return true;

}

return false;

}

else

{

if(scanP1.x == scanP2.x)

{

//当第二条线段斜率不存在是的,处理办法

double x,y;

x = scanP1.x;

y = (objectP1.y-objectP2.y)*1.0/(objectP1.x-objectP2.x)*(scanP1.x-objectP1.x)+objectP1.y;

y = (float)((int)(y+0.5));

if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))

{

//判断交点是不是在该两条线段上

coordinate.x = scanP1.x;

coordinate.y = (int)(y+0.5);

return true;

}

return false;

}

else

{

//两条线段斜率都存在时的处理办法

double k1,k2;

k1 = ( objectP1.y - objectP2.y ) * 1.0 / ( objectP1.x - objectP2.x);

k2 = ( scanP1.y - scanP2.y ) * 1.0 / ( scanP1.x - scanP2.x );

//k1,k2为计算的两线段的斜率

double x,y;

x = (scanP1.y-objectP1.y-k2*scanP1.x+k1*objectP1.x)/(k1-k2);

y = (k1*k2*scanP1.x-k1*k2*objectP1.x+k2*objectP1.y-k1*scanP1.y)/(k2-k1);

x=(float)((int)(x+0.5));

y = (float)((int)(y+0.5));

if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))

{

//判断交点是不是在该两条线段上

coordinate.x = (int)(x+0.5);

coordinate.y = (int)(y+0.5);

return true;

}

return false;

}

}

return true;

}

11、冒泡排序函数

bool CGraphics::SortArray(int* iArray,int iLength)

{

//冒泡排序

int i,j,iTemp;

bool bFlag;

for(i=0;i

{

bFlag=true;

for(j=0;j

{

if(iArray[j] > iArray[j+1])

{

iTemp=iArray[j];

iArray[j]=iArray[j+1];

iArray[j+1]=iTemp;

bFlag=false;

}

}

if(bFlag)

break;

}

return true;

}

12、对多边形裁减时,判断线段端点是否在可视一侧,判断就是直接判断点坐标的关系

bool CGraphics::IsInSquareRgn(CRect rect,CPoint Point,int flag)

{

switch(flag) {

case 0:

if(Point.y > rect.top)

return true;

else

return false;

break;

case 1:

if(Point.x < rect.right)

return true;

else

return false;

break;

case 2:

if(Point.y < rect.bottom)

return true;

else

return false;

break;

case 3:

if(Point.x > rect.left)

return true;

else

return false;

break;

default:

break;

}

return true;

}

四、完成的成果截图:

初始化过后:

自定义多边形点坐标和自定义裁剪区域:

填充:

计算机图形学总结

第一章绪论 计算机图形学的基本概念 计算机图形学:是研究怎样用数字计算机生成、处理和显示图形的一门学科。 图形:计算机图形学的研究对象。 构成图形的要素:几何要素——几何属性(点、线、面、体) 非几何要素——视觉属性(明暗、灰度、色彩、纹理、透明性、线型、线宽) 表示图形的方法:点阵表示;参数表示 研究内容 计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法,构成了计算机图形学的主要研究内容。 图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 计算机图形学的应用 图形用户界面;计算机辅助设计与制造(CAD/CAM);4 科学计算的可视化:CT; 真实感图形实时绘制与自然景物仿真;地理信息系统(GIS);Virtual Reality(虚拟现实、灵境);事务和商务数据的图形显示;地形地貌和自然资源的图形显示 过程控制及系统环境模拟;电子出版及办公自动化;计算机动画及广

告 计算机艺术;科学计算的可视化;工业模拟;计算机辅助教学 当前研究热点: 1.真实感图形实时绘制 2.野外自然景物的模拟3 与计算机网络技术的紧密结合 4 计算机动画 5 用户接口 6 计算机艺术 7 并行图形处理 所熟悉的图形软件包 图形软件的标准 GKS (Graphics Kernel System) (第一个官方标准,1977) PHIGS(Programmer’s Herarchical Iuteractive Graphics system) 一些非官方图形软件,广泛应用于工业界,成为事实上的标准 DirectX (MS) Xlib(X-Window系统) OpenGL(SGI) Adobe公司Postscript CAGD(Computer Aided Geometric Design) 图形系统的功能1.计算功能2.存储功能3.对话功能4.输入功能5.输出功能 图形输入设备 1 键盘和鼠标 2 跟踪球和空间球 3 光笔 4 数字化仪 5 触摸板 6 扫描仪

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

裁剪算法详解 在使用计算机处理图形信息时,计算机部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之,哪些落在显示区之外,以便只显示落在显示区的那部分图形。这个选择过程称为裁剪。最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗。但那样太费时,一般不可取。这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。所以一般采用先裁剪再扫描转换的方法。 (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. 什么是图像的分辨率?

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学课程设计报告

一、设计内容与要求 1.1、设计题目 算法实现时钟运动 1.2、总体目标和要求 (1)目标:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。 (2)总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。(3)开发环境:Viusal C++ 6.0 1.3、设计要求 内容: (1)掌握动画基本原理; (2)实现平面几何变换; 功能要求: (1)显示时钟三个时针,实现三根时针间的相互关系;

(2)通过右键菜单切换时钟背景与时针颜色; 1.4设计方案 通过使用OpenGL提供的标准库函数,综合图形学Bresenham画线和画圆的算法,OpenGL颜色模型中颜色表示模式等实现指针式时钟运动,并通过点击右键菜单实习时钟背景与时针颜色的转换。根据Bresenham画线和画圆的算法,画出时钟的指针和表盘。再根据OpenGL颜色模型定义当前颜色。设置当时钟运行时交换的菜单,运行程序时可变换时钟背景与时针的颜色。最后再设置一个恢复菜单恢复开始时表盘与指针的颜色。

二、总体设计 2.1、过程流程图

2.2、椭圆的中点生成算法 1、椭圆对称性质原理: (1)圆是满足x轴对称的,这样只需要计算原来的1/2点的位置;(2)圆是满足y轴对称的,这样只需要计算原来的1/2点的位置; 通过上面分析可以得到实际上我们计算椭圆生成时候,只需要计算1/4个椭圆就可以实现对于所有点的生成了。 2、中点椭圆算法内容: (1)输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。设置初始点(x0,y0)的位置为(0,r2); (2)计算区域1中央决策参数的初始值 p = ry*ry - rx*rx*ry + 1/4*(rx*rx); (3)在区域1中的每个Xn为止,从n = 0 开始,直到|K|(斜率)小于-1时后结束; <1>如果p < 0 ,绘制下一个点(x+1,y),并且计算 p = p + r2*r2*(3+2*x); <2>如果P >=0 ,绘制下一个点(x+1,y-1),并且计算 p = p + r2*r2*(3+2*point.x) - 2*r1*r1*(y-1) (4)设置新的参数初始值; p = ry*ry(X0+1/2)*(X0+1/2) + rx*rx*(Y0-1) - rx*rx*ry*ry; (5)在区域2中的每个Yn为止,从n = 0开始,直到y = 0时结束。 <1>如果P>0的情况下,下一个目标点为(x,y-1),并且计算 p = p - 2rx*rx*(Yn+1) + rx*rx;

计算机图形学裁剪

《计算机图形学》实验报告 学院:理学院专业:信息与计算科学班级:姓名学号指导教师实验时间 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

计算机图形学复习课总结

绪论 1点阵法和参数法的概念。图形、图像的概念。 点阵法是用具有颜色信息的点阵来表示图形的一种方法,它强调图形由哪些点组成,并具有什么灰度或色彩。 参数法是以计算机中所记录图形的形状参数与属性参数来表示图形的一种方法。 通常把参数法描述的图形叫做图形(Graphics) 把点阵法描述的图形叫做图象(Image) 2 计算机图形学的概念? 计算机图形学是研究怎样用计算机表示、生成、处理和显示图形的一门学科。 3图形包括哪两方面的要素,试举例说明。 图形包括两方面的要素,其中有几何要素和非几何要素 1. 几何要素:点,线,面,体等; 2. 非几何要素:明暗,灰度,色彩等 4一个交互性的图形系统具有哪些功能? 5个功能:输入功能、存储功能、计算功能、输出功能和交互功能 5图形输出设备包括什么?常用的图形绘制设备有哪两种? 图形输出设备包括图形显示设备和图形绘制设备,常用的图形绘制设备有打印机和绘图仪。 6与计算机图形学相关的学科有哪些?各自研究的内容是什么?

计算机视觉:研究用计算机来模拟生物外显或宏观视觉功能的科学和技术图像处理:对图象进行各种加工以改善图象的视觉效果 C语言程序基础(课件中p17, p55-59,常用画图函数) 1已知画“王”的C语言程序(如下),要求改编一个画“田”字的程序,该字的字高和字宽均为50,字的左上角点坐标为(60, 80)。 #include "graphics.h" #include "conio.h" main() { int gdriver=DETECT,gmode; int x,y; initgraph(&gdriver,&gmode,“”); /*初始化图形系统*/ cleardevice(); /*清除图形屏幕*/ moveto(100,40); /*绝对移动光标*/ linerel(40,0); /*从当前位置按增量方式画线*/ x=getx(); y=gety(); moveto(x,y+20); linerel(-40,0); moverel(0,20); /* 以增量方式移动当前光标*/ linerel(40,0); moverel(-20,0); linerel(0,-40); getch(); closegraph(); /*关闭图形系统,返回文本模式*/ } 2画一个填充颜色的圆(画一个填充颜色的矩形,已知矩形的左下角(0,20),右上角坐标为(100,120)),圆心坐标(60,60),半径100,要求背景色为1号色(blue),圆的边界色为红色,填充色为Green,(函数:circle floodfill) #include "graphics.h"

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学课程总结教材

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

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

计算机图形学课程设计报告

计算机图形学 课程设计报告 设计课题: 专业班级: 学号: 学生姓名: 指导教师: 设计时间:2018.12.06

中南林业科技大学涉外学院理工系计算机图形学课程设计任务书

指导教师:廖宁教研室主任: 2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。 课程设计任务书装订于设计计算说明书(或论文)封面之后,目录页之前。 目录 一.设计目的……………………………………………………………二.设计要求…………………………………………………………… 1.构建基础类…………………………………………………… 2.构建直线类…………………………………………………… 3.构建变换类…………………………………………………… 4.构建填充类…………………………………………………… 5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计 五.源程序 六.程序运行效果图 七.总结

设计目的 ?培养对图形建模、变换、投影、消隐、光照原理的理解和应用。 ?培养图形类的编程能力。 ?培养计算机图形学应用软件开发的能力。 设计要求 深入研究计算机图形学的生成原理,设计算法实现具体的类。 1.构建基础类 实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。 2.构建直线类 实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现

CACLine类绘制任意斜率的反走样颜色渐变直线。 3.构建变换类 实现CTransForm完成二维和三维图形变换。 4.构建填充类 实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进行深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。 5.构建光照类 实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。 开发环境 Viusal C++ 6.0的MFC框架。 详细设计 1.利用函数Ellipse画出人物的脸,并用给脸填充颜色。再利 用Ara画出人物的嘴巴。CRect确定人物的眼睛,给眼睛填 充颜色。利用画笔画出人物的鼻子。 2.添加ddaline()成员函数,编写自定义的成员函数ddaline ()程序,编写OnDraw()函数,画出人物的脚和脚趾。 3.添加星星star()成员函数,编写自定义的成员函数star() 程序,确定五角星的位置、大小和颜色。

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

计算机科学与技术学院 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所示。

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科15升-1班 学号 1516353004 姓名 指导教师王玉琨 2016 年 06 月 07 日

目录 设计内容与要求 (03) 总体目标和要求 (03) 内容与要求 (03) 总体设计 (03) 2.1 球的消隐处理基本原理 (03) 2.2 具体设计实现 (04) 详细设计 (04) 3.1调试后正确的程序清单 (04) 功能实现 (08) 4.1程序运行结果 (09) 4.2 功能实现及分析 (09) 总结 (09) 参考文献 (10)

球体背面剔除消隐算法 第 1章设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统, 并能从某些方面作出评价和改进意见。 通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C++ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容:(1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

计算机图形学总结论文

计算机图形学总结 首先,感谢老师一个学期以来的教导,您的授课真的让我受益匪浅。您不仅教会了我们很多新颖的知识,还让我们对一些事情有了新的正确认识。 其次,通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图形学有了一个大体的认识。上课的时候,您的PPT做的栩栩如生,创意新颖的FLASH就吸引了我的眼球,再加上您那详细生动的讲解,就让我对这门课产生了浓厚的兴趣,随着一节一节课的教学,您的讲课更加深深地吸引了我,并且随着对这门课越来越深入的了解更促使我产生了学好这门的欲望。您教会了我们怎们做基本知识,还教了我们不少的算法。听您的课可以说是听得津津有味。以下就是我对计算机图形学这门课的认识。 计算机图形学Computer Graphics简称CG是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法!计算机图形学主要研究两个问题:一个是如何在计算机中构造一个客观世界---几何(模型)的描述,创建和处理,一‘几何’一词统一表述之,二是如何将计算机中的虚拟世界用最形象的方式静态或动态的展示出来,几何的视觉再现,一‘绘制’一词统一表述之。由此可以说: 计算机图形学=几何+绘制 本课程让我了解了和掌握必要的图形学概念、方法和工具。智能CAD计算机美术与设计计算机动画艺术科学计算可视化。 一、图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看图形主要分为两类一类是基于线条信息表示的如工程图、等高线地图、曲面的线框图等另一类是明暗图也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此必须建立图形所描述的场景的几何表示再用某种光照模型计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上图形学也把可以表示几何场景

计算机图形学实验报告 课程设计 大作业

安徽建筑工业学院 计算机图形学实验报告 院(系)名称: 专业: 班级: 姓名: 学号: 指导老师:

实验一实现任意直线的中点画线算法 【实验目的】 掌握直线的中点画线算法; 【实验环境】 VC++6.0 【实验内容】 利用任意的一个实验环境,编制源程序,实现直线的中点画线法。 【实验原理】 假定直线斜率k在0~1之间,当前象素点为(x p,y p),则下一个象素点有两种可选择点P1(x p+1,y p)或P2(x p+1,y p+1)。若P1与P2的中点(x p+1,y p+0.5)称为M,Q为理想直线与x=x p+1垂线的交点。当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。 图2.1.2 中点画线法每步迭代涉及的象素和中点示意图 下面讨论中点画线法的实现。过点(x0,y0)、(x1, y1)的直线段L的方程式为F(x, y)=ax+by+c=0,其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0,欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。为此,我们构造判别式: d=F(M)=F(x p+1, y p+0.5)=a(x p+1)+b(y p+0.5)+c

当d<0时,M在L(Q点)下方,取P2为下一个象素; 当d>0时,M在L(Q点)上方,取P1为下一个象素; 当d=0时,选P1或P2均可,约定取P1为下一个象素; 注意到d是x p, y p的线性函数,可采用增量计算,提高运算效率。 若当前象素处于d 0情况,则取正右方象素P1(x p+1, y p),要判下一个象素位置,应计 算d1=F(x p+2, y p+0.5)=a(x p+2)+b(y p+0.5)=d+a,增量为a。 若d<0时,则取右上方象素P2(x p+1, y p+1)。要判断再下一象素,则要计算d2= F(x p+2, y p+1.5)=a(x p+2)+b(y p+1.5)+c=d+a+b ,增量为a+b。画线从(x0, y0)开始,d的初值d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b,因F(x0, y0)=0,所以d0=a+0.5b。 由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。因此,我们可以用2d代替d来摆脱小数,写出仅包含整数运算的算法程序。 【实验程序】 void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, b, d1, d2, d, x, y; a=y0-y1; b=x1-x0;d=2*a+b; d1=2*a;d2=2* (a+b); x=x0;y=y0; drawpixel(x, y, color); while (x

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

图形裁剪算法 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)求解窗口与直线的交点。

计算机图形学课程设计报告

. 计算机图形学 课程设计报告 设计课题: 专业班级: 学号: 学生姓名: 指导教师: 设计时间:2018.12.06

中南林业科技大学涉外学院理工系计算机图形学课程设计任务书

指导教师:廖宁教研室主任: 2018年12月06 日注:本表下发学生一份,指导教师一份,栏目不够时请另附页。 课程设计任务书装订于设计计算说明书(或论文)封面之后,目录页之前。 目录 一.设计目的……………………………………………………………二.设计要求…………………………………………………………… 1.构建基础类…………………………………………………… 2.构建直线类…………………………………………………… 3.构建变换类…………………………………………………… 4.构建填充类……………………………………………………

5.构建光照类……………………………………………………三.开发环境…………………………………………………………四.详细设计 五.源程序 六.程序运行效果图 七.总结 设计目的 ?培养对图形建模、变换、投影、消隐、光照原理的理解和应用。 ?培养图形类的编程能力。 ?培养计算机图形学应用软件开发的能力。 设计要求

深入研究计算机图形学的生成原理,设计算法实现具体的类。 1.构建基础类 实现CP2类绘制二维点;实现CP3类绘制三维点;实现CRGB 类处理RGB颜色;实现CVector类处理矢量。 2.构建直线类 实现CLine类绘制任意斜率的直线、实现CALine类绘制任意斜率的反走样直线、实现CCLine类绘制任意斜率的颜色渐变直线、实现CACLine类绘制任意斜率的反走样颜色渐变直线。 3.构建变换类 实现CTransForm完成二维和三维图形变换。 4.构建填充类 实现CFill类使用有效边表算法填充多边形、实现CZBuffer类进行深度缓冲消隐,并使用Gouraud和Phong明暗处理填充图形面片。 5.构建光照类 实现CLight类设置点光源、实现CMaterial类设置物体材质、实现CLighting类对物体实施光照。 开发环境 Viusal C++ 6.0的MFC框架。 详细设计

梁友栋-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)

计算机图形学课程设计

《计算机图形学》实验报告 题目: 3D真实感场景 绘制 姓名: 郭继杰 学号: 2014214168 班级: 地信141 学院: 理学院 指导老师: 解山娟 日期: 2017年1月1日 一、实验目的 结合一学期所学计算机图形学知识,基于专业背景,使用OpenGL 绘制简单的3D真实感图形场景。 二、实验要求 应用光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中, 其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型 以及环境光、漫反射、镜面反射等光照模型设置。 三、实验小组及任务分工 小组成员任务分工 金城纹理贴图,颜色模型,雾化模型 郭继杰运动模型,光照模型

沈黎达材料收集,代码整合 四、实验内容 1、实验前期工作 前期工作经过小组成员充分讨论,资料收集,最终确定小组实验模板为以下两幅场景。目标就是实现一艘简单3D帆船模型以及一辆3D小车模型 2、程序编译环境:Visual Studio 2012 3、光照模型建立过程 光照模型建立流程图: 3、1设置光照模型相应指数

3、2打开光源 光照模型设计过程有两点注意的就是: 1、glShadeModel函数用于控制opengl中绘制指定两点间其她点颜色的过渡模式,参数一般为GL_SMOOTH、GL_FLAT,如果两点的颜色相同,使用两个参数效果相同,如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只就是以指定的某一点的单一色绘制其她所有点。 glShadeModel(GL_FLAT) 着色模式glShadeModel(GL_SMOOTH)着色模式(可以瞧出GL_SMOOTH模式下颜色更加光滑) 2、需要使用光照模型时必须启用,glEnable(GL_LIGHTING)(启用灯源)、glEnable(GL_LIGHT0)(启用光源),否则所有灯光效果都会无效。效果对比如下图所示。

相关主题