当前位置:文档之家› 计算机图形学实验报告实验五

计算机图形学实验报告实验五

计算机图形学实验报告实验五
计算机图形学实验报告实验五

贵州大学实验报告

学院:计算机科学与信息专业:计科班级:计科101

姓名徐艳学号1008060042 实验五实验时间2011-5-6 指导教师吴云成绩实验项目名称常用曲线和曲面的生成算法

实验目的1、通过实验,进一步理解和掌握生成Hermit、Bezier和B样条曲线及Bezier曲面的生成算法

2、掌握Hermit、Bezier、B样条曲线及Bezier曲面的基本生成过程

3、通过编程,会在一种语言环境下编程实现三次Hermit、Bezier、B样条曲线及Bezier曲面的绘制

实验要求1、编程实现Hermit曲线的绘制;

2、编程实现B样条曲线的绘制。

3、编程实现Bezier曲线的绘制。

4、编程实现Bezier曲面的绘制。

5、写出实验报告

实验原理三次Hermite曲线算法:

1、根据型值点的坐标值绘制多边形;

2、给Hermite矩阵M h赋值M h ={{2,-2,1,1},{-3,3,-2,-1},{0,0,1,0},{1,0,0,0}};

3、先计算边界条件矩阵

T

i

i

i

i

R

R

P

P)

,

,

,

(

1

1+

+

,然后计算

T

i

i

i

i

h

R

R

P

P

M)

,

,

,

(

1

1+

+

?;

4、计算?

=],

,

,

[

)(1

2

3t

t

t

t

t

P T

i

i

i

i

h

R

R

P

P

M)

,

,

,

(

1

1+

+

?;

5、根据(x,y)的坐标值绘制三次参数样条曲线。当循环到第8 个型值点,程序结束,

否则,执行步骤3.

程序主要代码:

void CQuxianmianView::Hermite(CDC *pDC)

{

int a[4][4]={{2,-2,1,1},{-3,3,-2,-1},{0,0,1,0},{1,0,0,0}};

int b[4][2];

for(int i=0;i<8;i++)

{

b[0][0]=p1[i][0];b[0][1]=p1[i][1];//起点坐标

b[1][0]=p1[i+1][0];b[1][1]=p1[i+1][1];//终点坐标

b[2][0]=p2[i][0];b[2][1]=p1[i][1];//起点的导数

b[3][0]=p2[i+1][0];b[3][1]=p1[i+1][1];//终点的导数

MultiMatrix(a,b);

CPen MyPen,*pOldPen;

MyPen.CreatePen(PS_SOLID,1,RGB(225,125,0));

pDC->MoveTo(p1[i][0],p1[i][1]);

for(double t=0.0;t<=1;t+=1.0/400)

{

int

x=ROUND(pow(t,3)*result[0][0]+pow(t,2)*result[1][0])+t*result[2][0]+result[3][0];

int

y=ROUND(pow(t,3)*result[0][1]+pow(t,2)*result[1][1])+t*result[2][1]+result[3][1];

pDC->LineTo(x,y);

}

pDC->SelectObject(&pOldPen);

MyPen.DeleteObject();

}

}

void CQuxianmianView::MultiMatrix(int a[][4], int b[][2])

{

int i,j,k;

for(i=0;i<4;i++)

for(j=0;j<2;j++)

result[i][j]=0;

for(i=0;i<2;i++)

for(j=0;j<4;j++)

for(k=0;k<4;k++)

result[j][i]+=a[j][k]*b[k][i];

}

三次Bezier曲线算法:

1、设置CPoint数组Pt保存控制顶点的坐标,在鼠标左键函数中为控制顶点坐标赋值;

2、使用选择合适的颜色点绘制屏幕控制点;

3、屏幕控制点绘制完后,自动调用Bezier函数,生成三次Bezier样条曲线;

4、分别计算n的阶乘,i的阶乘和(n-i)的阶乘;

5、对于屏幕像素点(x,y),分别计算

i

n

i

i

n

t

t

t

C

x

P

x

x-

-

?

?

+

=)

1(

.和

i n i i n t t t C y P y y --??+=)1(.;

6、 建立二重循环,外循环为t=0~1,步长为800,内循环为0~n ;

7、 使用指定的颜色调用SetPixle 函数绘制(Pt.x,Pt.y )点,完成Bezier 曲线的绘制。

主要代码如下:

void CWenlixinBezierLineView::OnMENUBezierCurve() { // TODO: Add your command handler code here RedrawWindow(); AfxGetMainWnd()->SetWindowText("案例18:Bezier 曲线");//显示标题 MessageBox("单击左键绘制控制多边形,单击右键绘制曲线","提示",MB_OK); pt=new CPoint[N_MAX_POINT]; Flag=true;CtrlPoint=0; }

void CWenlixinBezierLineView::DrawBezier()//绘制Bezier 曲线 { CClientDC dc(this); double x,y; int rate=800,n; n=CtrlPoint-1; for(double t=0;t<=1;t+=1.0/rate) { x=0;y=0; for(int i=0;i<=n;i++) { x+=pt[i].x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i); y+=pt[i].y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i); } dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255));//曲线颜色 } }

double CWenlixinBezierLineView::Cnk(const int &n, const int &i)//Bernstein 第一项 { return double(Factorial(n)/(Factorial(i)*Factorial(n-i))); }

int CWenlixinBezierLineView::Factorial(int m)//阶乘函数 { int f=1; for(int i=1;i<=m;i++) f*=i; return f;

}

void CWenlixinBezierLineView::DrawCharPolygon()//绘制控制多边形

{

CClientDC dc(this);

CPen MyPen,*pOldPen;

MyPen.CreatePen(PS_SOLID,3,RGB(0,0,0));//控制多边形

pOldPen=dc.SelectObject(&MyPen);

for(int i=0;i

{

if(i==0)

{

dc.MoveTo(pt[i]);

dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);

}

else

{

dc.LineTo(pt[i]);

dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);

}

}

dc.SelectObject(pOldPen);

MyPen.DeleteObject();

}

void CWenlixinBezierLineView::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

if(Flag)

{

pt[CtrlPoint].x=point.x;

pt[CtrlPoint].y=point.y;

if(CtrlPoint

CtrlPoint++;

else

Flag=false;

DrawCharPolygon();

}

CView::OnLButtonDown(nFlags, point);

}

void CWenlixinBezierLineView::OnRButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default

Flag=false;

DrawBezier();

CView::OnRButtonDown(nFlags, point);

}

三次B样条曲线算法:

1、根据顶点坐标绘制控制多边形。

2、计算B样条基函数。

3、进行i=1~6段的循环

4、选取适当步长0.1,进行t=0~1的循环。

5、计算P i,3,绘制曲线上的每一点(x,y)。

6、当t<=1时,返回步骤4.

7、当i<=6时,返回步骤3.

主要程序代码:

void CBView::OnDraw(CDC* pDC)

{

CBDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

CRect Rect;

GetClientRect(&Rect);

CBitmap *pBitmap,Bitmap;

Bitmap.LoadBitmap(IDB_BITMAP1);

CDC Mdc;

Mdc.CreateCompatibleDC(GetDC());

pBitmap=Mdc.SelectObject(&Bitmap);

Mdc.BitBlt(0,0,Rect.Width(),Rect.Height(),&m_Pic,0,0,SRCCOPY);

CPen MyPen1,*pOldPen1;

MyPen1.CreatePen(PS_SOLID,3,RGB(0,0,0));

pOldPen1=Mdc.SelectObject(&MyPen1);

Mdc.MoveTo(p[0][0],p[0][1]);

Mdc.Ellipse(p[0][0]-2,p[0][1]-2,p[0][0]+2,p[0][1]+2);

for(int i=1;i<9;i++)

{

Mdc.LineTo(p[i][0],p[i][1]);

Mdc.Ellipse(p[i][0]-2,p[i][1]-2,p[i][0]+2,p[i][1]+2);

}

if(m_i!=-1)

{

CString str;

str.Format("x=%d y=%d 拖动鼠标移动到此点",p[m_i][0],p[m_i][1]);

Mdc.TextOut(p[m_i][0]+5,p[m_i][1]+5,str);

}

B3_curves('p',p,&Mdc);

CDC *dc=GetDC();

dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&Mdc,0,0,SRCCOPY);

Mdc.SelectObject(pBitmap);

Mdc.SelectObject(pOldPen1);

MyPen1.DeleteObject();

AfxGetMainWnd()->SetWindowText("B样条曲线算法的实现--06计科一岑建忙--060806110021#");

}

…………………………..

//绘制三次B样条曲线函数

void CBView::B3_curves(char pflag,long xq[][2],CDC *pDC)

{

int i,rate=10;

long lx,ly;

double F03,F13,F23,F33;

lx=ROUND((xq[0][0]+4.0*xq[1][0]+xq[2][0])/6.0);

ly=ROUND((xq[0][1]+4.0*xq[1][1]+xq[2][1])/6.0);

pDC->MoveTo(lx,ly);

CPen MyPen2(PS_SOLID,3,RGB(255,0,0));

CPen *pOldPen2=pDC->SelectObject(&MyPen2);

for(i=1;i<7;i++)

{

for(double t=0;t<=1;t+=1.0/rate)

{

F03=(-t*t*t+3*t*t-3*t+1)/6;

F13=(3*t*t*t-6*t*t+4)/6;

F23=(-3*t*t*t+3*t*t+3*t+1)/6;

F33=t*t*t/6;

lx=ROUND(xq[i-1][0]*F03+xq[i][0]*F13+xq[i+1][0]*F23+xq[i+2][0]*F33);

ly=ROUND(xq[i-1][1]*F03+xq[i][1]*F13+xq[i+1][1]*F23+xq[i+2][1]*F33);

pDC->LineTo(lx,ly);

}

}

pDC->SelectObject(pOldPen2);

MyPen2.DeleteObject();

}

Bezier曲面算法:

1、读入控制网格三维顶点坐标。

2、为矩阵M be ={{-1,3,-3,1},{3,-6,3,0},{-3,3,0,0},{1,0,0,0}}赋值,计算

M T be ={{-1,3,-3,1},{3,-6,3,0},{-3,3,0,0},{1,0,0,0}}。

3、计算M= M b e·P·M T be.

4、将三维坐标转换为二维坐标。

5、选用适当步长,进行u=0~1和v=0~1的二重循环,计算P(u,v)=U·M·V T的分量

坐标x和y的值,其中,U=[u3,u2,u,1], V=[v3,v2,v,1],以指定的颜色调用SetPixel函数绘制曲面上的每一个点(x,y)。

6、绘制控制多边形网格。

主要程序代码:

…………………………………….

void CBezierQuMianView::OnDraw(CDC* pDC)

{

CBezierQuMianDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

GetMaxX();GetMaxY();

CPen MyPen3d,MyPen2d,MyPen,*OldPen;

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

OldPen=pDC->SelectObject(&MyPen3d);

pDC->MoveTo(MaxX/2,MaxY/2);

pDC->LineTo(MaxX-25,MaxY/2);

pDC->TextOut(MaxX-50,MaxY/2-20,"y");

pDC->MoveTo(MaxX/2,MaxY/2);

pDC->LineTo(MaxX/2,0);

pDC->TextOut(MaxX/2-20,10,"z");

pDC->MoveTo(MaxX/2,MaxY/2);

pDC->LineTo(MaxX/2-MaxY/2,MaxY);

pDC->TextOut(MaxX/2-MaxY/2+50,MaxY-30,"x");

pDC->TextOut(MaxX/2-20,MaxY/2-10,"0");

pDC->SelectObject(OldPen);

MyPen3d.DeleteObject();

}

…………………………………….

void CBezierQuMianView::GetMaxX()

{

CRect Rect;

GetClientRect(&Rect);

MaxX=Rect.right;

}

void CBezierQuMianView::GetMaxY()

{

CRect Rect;

GetClientRect(&Rect);

MaxY=Rect.bottom;

}

void CBezierQuMianView::ReadPoint()

{

P3d[0][0].x=200;P3d[0][0].y=20; P3d[0][0].z=0;

P3d[0][1].x=150;P3d[0][1].y=0; P3d[0][1].z=100;

P3d[0][2].x=50; P3d[0][2].y=-130;P3d[0][2].z=100;

P3d[0][3].x=0; P3d[0][3].y=-250;P3d[0][3].z=50;

P3d[1][0].x=150;P3d[1][0].y=100; P3d[1][0].z=100;

P3d[1][1].x=100;P3d[1][1].y=30; P3d[1][1].z=100;

P3d[1][2].x=50; P3d[1][2].y=-40; P3d[1][2].z=100;

P3d[1][3].x=0; P3d[1][3].y=-110; P3d[1][3].z=100;

P3d[2][0].x=140;P3d[2][0].y=280; P3d[2][0].z=90;

P3d[2][1].x=80; P3d[2][1].y=110; P3d[2][1].z=120;

P3d[2][2].x=30; P3d[2][2].y=30; P3d[2][2].z=130;

P3d[2][3].x=-50;P3d[2][3].y=-100; P3d[2][3].z=150;

P3d[3][0].x=150;P3d[3][0].y=350; P3d[3][0].z=30;

P3d[3][1].x=50; P3d[3][1].y=200; P3d[3][1].z=150;

P3d[3][2].x=0; P3d[3][2].y=50; P3d[3][2].z=200;

P3d[3][3].x=-70;P3d[3][3].y=0; P3d[3][3].z=100; }

void CBezierQuMianView::Transform3DTo2D()

{

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

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

P2d[i][j].x=P3d[i][j].y-P3d[i][j].x/sqrt(2);

P2d[i][j].y=-P3d[i][j].z+P3d[i][j].x/sqrt(2);

}

}

void CBezierQuMianView::DrawCtrP1()

{

CPoint p[4];

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

{

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

{

p[j]=CPoint(ROUND(MaxX/2+P2d[i][j].x),ROUND(MaxY/2+P2d[i][j].y));

}

Line(p);

}

}

void CBezierQuMianView::DrawCtrP2()

{

CPoint p[4];

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

{

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

{

p[i]=CPoint(ROUND(MaxX/2+P2d[i][j].x),ROUND(MaxY/2+P2d[i][j].y));

}

Line(p);

}

}

void CBezierQuMianView::Line(CPoint p[])

{

CClientDC dc(this);

CPen MyPen,*pOldPen;

MyPen.CreatePen(PS_SOLID,2,RGB(0,255,0));

pOldPen=dc.SelectObject(&MyPen);

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

if(i==0)

{

dc.MoveTo(p[0]);

dc.Ellipse(p[0].x-2,p[0].y-2,p[0].x+2,p[0].y+2);

else

{

dc.LineTo(p[i]);

dc.Ellipse(p[i].x-2,p[i].y-2,p[i].x+2,p[i].y+2);

}

dc.SelectObject(pOldPen);

MyPen.DeleteObject();

}

void CBezierQuMianView::DrawBezier()

{

CClientDC dc(this);

double x,y,u,v,u1,u2,u3,u4,v1,v2,v3,v4;

double M[4][4];

M[0][0]=-1;M[0][1]=3;M[0][2]=-3;M[0][3]=1;

M[1][0]=3;M[1][1]=-6;M[1][2]=3;M[1][3]=0;

M[2][0]=-3;M[2][1]=3;M[2][2]=0;M[2][3]=0;

M[3][0]=1;M[3][1]=0;M[3][2]=0;M[3][3]=0;

Calculate1(M,P3d);

MatrixRotate(M);

Calculate2(P3d,MT);

Transform3DTo2D();

for(u=0;u<=1;u+=0.001)

for(v=0;v<=1;v+=0.001)

{

u1=u*u*u;u2=u*u;u3=u;u4=1;

v1=v*v*v;v2=v*v;v3=v;v4=1;

x=(u1*P2d[0][0].x+u2*P2d[1][0].x+u3*P2d[2][0].x+u4*P2d[3][0].x)*v1

+(u1*P2d[0][1].x+u2*P2d[1][1].x+u3*P2d[2][1].x+u4*P2d[3][1].x)*v2

+(u1*P2d[0][2].x+u2*P2d[1][2].x+u3*P2d[2][2].x+u4*P2d[3][2].x)*v3

+(u1*P2d[0][3].x+u2*P2d[1][3].x+u3*P2d[2][3].x+u4*P2d[3][3].x)*v4;

y=(u1*P2d[0][0].y+u2*P2d[1][0].y+u3*P2d[2][0].y+u4*P2d[3][0].y)*v1

+(u1*P2d[0][1].y+u2*P2d[1][1].y+u3*P2d[2][1].y+u4*P2d[3][1].y)*v2

+(u1*P2d[0][2].y+u2*P2d[1][2].y+u3*P2d[2][2].y+u4*P2d[3][2].y)*v3

+(u1*P2d[0][3].y+u2*P2d[1][3].y+u3*P2d[2][3].y+u4*P2d[3][3].y)*v4;

dc.SetPixel(ROUND(MaxX/2+x),ROUND(MaxY/2+y),RGB(255,0,0));

}

}

void CBezierQuMianView::Calculate1(double M0[][4],P3D p0[][4])

{

KeepOriginalMatrix(p0,T);

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

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

{

P3d[i][j].x=M0[i][0]*T[0][j].x+M0[i][1]*T[1][j].x

+M0[i][2]*T[2][j].x+M0[i][3]*T[3][j].x;

P3d[i][j].y=M0[i][0]*T[0][j].y+M0[i][1]*T[1][j].y

+M0[i][2]*T[2][j].y+M0[i][3]*T[3][j].y;

P3d[i][j].z=M0[i][0]*T[0][j].z+M0[i][1]*T[1][j].z

+M0[i][2]*T[2][j].z+M0[i][3]*T[3][j].z;

}

}

void CBezierQuMianView::Calculate2(P3D p0[][4],double M1[][4])

{

KeepOriginalMatrix(p0,T);

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

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

{

P3d[i][j].x=T[i][0].x*M1[0][j]+T[i][1].x*M1[1][j]

+T[i][2].x*M1[2][j]+T[i][3].x*M1[3][j];

P3d[i][j].y=T[i][0].y*M1[0][j]+T[i][1].y*M1[1][j]

+T[i][2].y*M1[2][j]+T[i][3].y*M1[3][j];

P3d[i][j].z=T[i][0].z*M1[0][j]+T[i][1].z*M1[1][j]

+T[i][2].z*M1[2][j]+T[i][3].z*M1[3][j];

}

}

void CBezierQuMianView::KeepOriginalMatrix(P3D Orig[][4], P3D Dest[][4]) {

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

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

{

Dest[i][j].x=Orig[i][j].x;

Dest[i][j].y=Orig[i][j].y;

Dest[i][j].z=Orig[i][j].z;

}

}

void CBezierQuMianView::MatrixRotate(double M0[][4])

{

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

{

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

{

MT[j][i]=M0[i][j];

}

}

}

void CBezierQuMianView::SignCtrPoint()

{

CClientDC dc(this);

CString str;

dc.SetBkMode(TRANSPARENT);

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

{

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

{

str.Format("p%d,%d",i,j);

dc.TextOut(ROUND(MaxX/2+P2d[i][j].x+20),ROUND(MaxY/2+P2d[i][j].y)+5,str);

}

}

}

void CBezierQuMianView::OnBezierQM()

{

// TODO: Add your command handler code here

RedrawWindow();

GetMaxX();GetMaxY();

ReadPoint();

Transform3DTo2D();

AfxGetMainWnd()->SetWindowText("双三次Bezier曲面--06计科一岑建忙--060806110021#");

DrawBezier();

}

void CBezierQuMianView::OnWgkz()

{

// TODO: Add your command handler code here

GetMaxX();GetMaxY();

ReadPoint();

Transform3DTo2D();

DrawCtrP1();

DrawCtrP2();

SignCtrPoint();

}

验环境操作系统:Windows XP SP2

编程环境:Microsoft Visual C++ 6.0

验步骤1、建立新工程Hermite,编程实现Hermit曲线的绘制;

2、建立新工程B,编程实现B样条曲线的绘制。

3、建立新工程Bezier,编程实现Bezier曲线的绘制。

4、建立新工程BezierQuMian,编程实现Bezier曲面的绘制。

实验内容1、编程实现Hermit曲线的绘制;

2、编程实现B样条曲线的绘制。

3、编程实现Bezier曲线的绘制。

4、编程实现Bezier曲面的绘制。

三次Hermite曲线:

三次Bezier曲线:B样条曲线:

双三次Bezier曲面:

实验总结(1)做Bezier曲线实验时,Flag标志变量用于控制点的绘制,超过10个点后则不能绘制。

(2)做Bezier曲面实验时,在OnDraw函数内三维绘制坐标系,软件运行即出现坐标系。

(3)绘制Bezier曲面时,没有考虑曲面片的连接问题。

(4)绘制B样条曲线时,若改变一个顶点,将影响相邻4段曲线的形状。若4个顶点共线,

则曲线内嵌入一段直线。

(5)为使曲线在某一顶点处形成尖角,可在该处使3个顶点重合。

见签名:年月日注:可根据教学需要对以上栏目进行增减。表格内容可根据内容扩充。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); 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++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学实验

实验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

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

计算机图形学实验一_画直线

大学实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

如果 d<0,则M在理想直线下方,选右上方P1点; 如果 d=0,则M在理想直线上,选P1/ P2点。 由于d是xi和yi的线性函数,可采用增量计算提高运算效率。 1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为: d new=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a= d old-dy 2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为 d new=F(xi+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c 而 d old=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c d new=d old+a+b= d old-dy+dx 在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值: d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2 F(x0,y0)=0,(x0,y0)在直线上。 为了消除d的分数,重新定义 F(x,y)=2(ax+by+c) 则每一步需要计算的d new 是简单的整数加法 dy=y1-y0,dx=x1-x0 d0=-2dy+dx d new=d old-2*dy,当 d old>=0 d new=d old-2(dy-dx),当d old<0 Bresenham画线算法 算法原理: 与DDA算法 相似,Bresenham 画线算法也要在 每列象素中找到 与理想直线最逼 近的象素点。 根据直线的 斜率来确定变量 在x或y方向递 增一个单位。另 一个方向y或x

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

计算机图形学实验报告-实验5Phong光照模型

计算机图形学实验报告 班级计算机工硕班 学号 2011220456 姓名王泽晶

实验五: Phong光照模型 实验目的 通过本次试验,学生可以掌握简单光照明模型的计算,以及真实感绘制中三维场景搭建的初步知识。 实验内容: 对给定的光源、相机状态,对球进行Phong光照明模型绘制。 搭建三维场景: a)在三维空间中摆放1个球,半径为R,默认为50 ,摆放位置为(0,0,0) b)球的材质默认值为Ka = (0.1,0.1,0.1), Kd = (0,0,0.8), Ks = 0.2, n = 10 c)视点方向初始为(0,0,1),光源方向初始为(1,1,1) d)视口设置为x0 = -100, y0 = -75, w = 200, h = 150 使用phong模型绘制场景 试验步骤: 添加成员函数,编写成员数代码为 override public function computeIntersection( viewStart:Vec3, viewDir:Vec3):Boolean { // See https://www.doczj.com/doc/b89301805.html,/geometry/sphereline/ var viewEnd:Vec3 = viewStart.add(viewDir); var A:Number = Math.pow(viewEnd.getVec(0) - viewStart.getVec(0), 2) +Math.pow(viewEnd.getVec(1) - viewStart.getVec(1), 2) + Math.pow(viewEnd.getVec(2) - viewStart.getVec(2), 2); var B:Number =((viewEnd.getVec(0) - viewStart.getVec(0)) * (viewStart.getVec(0) - _position.getVec(0)) + (viewEnd.getVec(1) - viewStart.getVec(1)) * (viewStart.getVec(1) - _position.getVec(1)) + (viewEnd.getVec(2) - viewStart.getVec(2)) * (viewStart.getVec(2) - _position.getVec(2))) * 2.0;

计算机图形学实验指导书

计算机图形学实验指导书 授课教师:臧辉 适用专业:计算机学院计算机科学技术 使用班级: 12软件工程 授课时间:2015春季 授课学时:40/30/10学时 使用教材:计算机图形学教程 王汝传编著 人民邮电出版社,2009年版 湖北理工学院计算机学院

实验教学进度表

实验一直线段的生成算法 一、实验目的及要求 1、掌握Bresenham算法的原理; 2、熟悉Bresenham算法的具体c语言实现; 3、掌握dda算法的原理; 4、熟悉dda算法的具体c语言实现。 二、实验学时 4学时 三、实验任务 1、Bresenham算法的c语言实现 2、DDA算法的c语言实现 四、实验重点、难点 对Bresenham算法的原理以及c语言程序的具体实现 (一)Bresenham算法的实现 #include #include #include #include void Bresenham_line(int x0,int y0,int x1,int y1,int color) { 具体代码根据书上算法2.1.6改写 } Void main() { int gdriver = DETECT, gmode, errorcode; char msg[80]; initgraph(&gdriver, &gmode, "");//初始化图形和局部变量Bresenham_line(100,100,300,300,5); Getch(); Closegraph(); } (二)DDA算法的实现 #include #include #include #include void DDAline(int x0,int y0,int x1,int y1,int color) { 根据书上算法2.1-2改写 } void main() { int gdriver = DETECT, gmode;

计算机图形学实验报告

计算机图形学(computer graphics)的基本含义是使用计算机通过算法和程序在显示设备上构造图形。图形是人们通过计算机设计和构造出来的,不是通过摄像机、扫描仪等设备输入的图像。这里的图形可以是现实中存在的图形,也可以是完全虚拟构造的图形。以矢量图的形式呈现,更强调场景的几何表示,记录图形的形状参数与属性参数。例如,工程图纸(drawing),其最基本的图形单元是点、线、圆/弧等,其信息包含图元的几何信息与属性信息(颜色、线型、线宽等显式属性和层次等隐式属性)。 图像处理(image processing)则是研究图像的分析处理过程,图像处理研究的是图像增加、模式识别、景物分析等,研究对象一般为二维图像。图像以点阵图形式呈现,并记录每个点的灰度或色彩。例如,照片、扫描图片和由计算机产生的真实感和非真实感图·形等,最基本的图像单元(pels,picture elements)是点—像素(pixel),其信息实际上是点与它的属性信息(颜色、灰度、亮度等)。 计算机视觉(computer vision)包括获取、处理、分析和理解图像或者更一般意义的真实世界的高维数据方法,它的目的是产生决策形式的数字或者符号信息。

计算机图形学和计算机视觉是同一过程的两个方向。计算机图形学将抽象的语义信息转化成图形,计算机视觉则从图形中提取抽象的语义信息,图像处理研究的则是一个图像或一组图像之间的相互转化和关系,与语义信息无关。下表从输入和输出的角度对三者的区别进行辨析: 表2 图像处理&计算机视觉&计算机图形学对比 计算机图形学,输入的是对虚拟场景的描述,通常为多边形数组,而每个多边形由三个顶点组成,每个顶点包括三维坐标、贴图坐标、RGB 颜色等。输出的是图像,即二维像素数组。 计算机视觉,输入的是图像或图像序列,通常来自相机、摄像头或视频文件。输出的是对于图像序列对应的真实世界的理解,比如检测人脸、识别车牌。图像处理,输入的是图像,输出的也是图像。

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

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

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