logo资料库

计算机图形学-电子版实验报告.doc

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
一、实验目的:
四、实验内容及结果:
(1)直线段的生成:分别根据DDA画线法、中点画线法、Bresenham画线法的基本原理,编写绘制直
void DDALine (int x1, int y1, int x2, int y2, int
{
int x;
double k, y=y1;
k = 1.0*(y2-y1)/(x2-x1);
for(x=x1;x<=x2;x++)
{
pDC->SetPixel(x, (int)(y+0.5), color);
y=y+k;
}
}
void MPLine(int x1, int y1, int x2, int y2, int co
{
int x,y,a,b,d,d1,d2;
a = y1-y2;
b = x2-x1;
y=y1;
d = 2*a+b;
//d1=x*a;
d1=2*a;
d2=2*(a+b);
pDC->SetPixel(x,y,color);
for(x=x1;x<=x2;x++)
{
if(d<0)
{y++;d+=d2;}
else
d+=d1;
pDC->SetPixel(x,y,color);
}
}
void BHLine(int x1, int y1, int x2, int y2, int co
{
int x,y,dx,dy,dk;
dx=x2-x1;
dy=y2-y1;
dk=2*dy-dx;y=y1;// 初始值
for(x=x1;x<=x2;x++)
{
pDC->SetPixel(x,y,color);
dk = dk+2*dy;
if(dk>=0)
{
y++;dk=dk-2*dx;
}
}
}
//////////////////////////////////////////////////
// TODO: add draw code for native data here
int i, j, x1=100, y1=100, x2=600, y2=200, color1=
int color2=RGB(255,182,193);// 浅粉色
int color3=RGB(65,105,225);// 宝蓝
DDALine(x1,y1,x2,y2,color1,pDC);
MPLine(x1,y1,x2,y2+150,color2,pDC);
BHLine(x1,y1,x2,y2+300,color3,pDC);
(2)圆的生成:根据中点画圆算法的基本原理,编写绘制圆的应用程序,并运行演示。
void WholeCircle(int xc,int yc,int x,int y,int col
{
pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc-x
pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x
pDC->SetPixel(xc+y,yc+x,color);pDC->SetPixel(xc-y
pDC->SetPixel(xc+y,yc-x,color);pDC->SetPixel(xc-y
}
void MidpointCircle(int xc,int yc,int r,int color,
{
int x=0,y=r,d=1-r;
WholeCircle(xc,yc,x,y,color,pDC);
while(x<=y)
{
if(d<0)
{
d+=2*x+3;
x++;
}
else
{
d+=2*(x-y)+5;
x++;
y--;
}
WholeCircle(xc,yc,x,y,color,pDC);
}
}
//////////////////////////////////////////////////
int xc=300,yc=200,r=150,color=RGB(138,43,226);//
MidpointCircle(xc,yc,r,color,pDC);
(3)椭圆的生成:根据中点画椭圆算法的基本原理,编写绘制椭圆的应用程序,并运行演示。
void WholeEllipse(int xc,int yc,int x,int y,int c
{
pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc-x
pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x
}
void MPEllipse(int xc,int yc,int a,int b,int color
{
int aa=a*a,bb=b*b;
int x=0,y=b;
int d=(int)(bb+aa*(-b+0.25)+0.5);
WholeEllipse(xc,yc,x,y,color,pDC);
while(bb*x
{
if(d<0){d+=bb*(2*x+3);}
else{d+=bb*(2*x+3)+aa*(-2*y+2);y--;}
x++;
WholeEllipse(xc,yc,x,y,color,pDC);
}
d = (int)(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb
while(y>0)
{
if(d>0){d+=aa*(-2*y+3); }
else{d+=bb*(2*x+2)+aa*(-2*y+3);x++;}
y--;
WholeEllipse(xc,yc,x,y,color,pDC);
}
}
//////////////////////////////////////////////////
int x0=500,y0=320,x1,x2,y1,a=120,b=50,color=RGB(0,
MPEllipse(x0-170,y0,a,b,color,pDC);
MPEllipse(x0+170,y0,a,b,color,pDC);
MPEllipse(x0,y0-170,b,a,color,pDC);
MPEllipse(x0,y0+170,b,a,color,pDC);
a=20;b=20;
MPEllipse(x0,y0,a,b,color,pDC);
一、实验目的:
四、实验内容及结果:
//////////////////////////////////////////////////
一、实验目的:
四、实验内容及结果:
一、实验目的:
四、实验内容及结果:
实验一:直线、圆、椭圆的生成 实验名称:直线、圆、椭圆的生成 实验室: 学生姓名: 指导教师: 一、实验目的: 实验台号: 专业班级: 实验日期: 掌握基本图形的生成算法,包括直线段、圆、椭圆的扫描转换。 二、实验仪器及实验环境: 计算机、Win7、VC++6.0 三、实验原理: 直线段、圆、椭圆生成算法的基本原理。 四、实验内容及结果: (1)直线段的生成:分别根据 DDA 画线法、中点画线法、Bresenham 画线法的基 本原理,编写绘制直线段的应用程序,并运行演示。 void DDALine (int x1, int y1, int x2, int y2, int color, CDC *pDC) // k<1 { int x; double k, y=y1; k = 1.0*(y2-y1)/(x2-x1); for(x=x1;x<=x2;x++) { pDC->SetPixel(x, (int)(y+0.5), color); y=y+k; } } 1
void MPLine(int x1, int y1, int x2, int y2, int color, CDC *pDC) { int x,y,a,b,d,d1,d2; a = y1-y2; b = x2-x1; y=y1; d = 2*a+b; //d1=x*a; d1=2*a; d2=2*(a+b); pDC->SetPixel(x,y,color); for(x=x1;x<=x2;x++) { if(d<0) {y++;d+=d2;} else d+=d1; pDC->SetPixel(x,y,color); } } void BHLine(int x1, int y1, int x2, int y2, int color, CDC *pDC) { int x,y,dx,dy,dk; dx=x2-x1; dy=y2-y1; dk=2*dy-dx;y=y1; for(x=x1;x<=x2;x++) { // 初始值 2
pDC->SetPixel(x,y,color); dk = dk+2*dy; if(dk>=0) { y++;dk=dk-2*dx; } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TODO: add draw code for native data here // 浅粉色 int i, j, x1=100, y1=100, x2=600, y2=200, color1=RGB(127,255,170); // 绿 int color2=RGB(255,182,193); int color3=RGB(65,105,225); // 宝蓝 DDALine(x1,y1,x2,y2,color1,pDC); MPLine(x1,y1,x2,y2+150,color2,pDC); BHLine(x1,y1,x2,y2+300,color3,pDC); 3
(2)圆的生成:根据中点画圆算法的基本原理,编写绘制圆的应用程序,并运行 演示。 void WholeCircle(int xc,int yc,int x,int y,int color,CDC* pDC) { pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x,yc-y,color); pDC->SetPixel(xc+y,yc+x,color);pDC->SetPixel(xc-y,yc+x,color); pDC->SetPixel(xc+y,yc-x,color);pDC->SetPixel(xc-y,yc-x,color); } void MidpointCircle(int xc,int yc,int r,int color,CDC* pDC) { int x=0,y=r,d=1-r; WholeCircle(xc,yc,x,y,color,pDC); while(x<=y) { if(d<0) { d+=2*x+3; x++; } else { d+=2*(x-y)+5; x++; y--; } WholeCircle(xc,yc,x,y,color,pDC); } 4
} /////////////////////////////////////////////////////////////////////////////////////////////////////////////// int xc=300,yc=200,r=150,color=RGB(138,43,226); // 紫色 MidpointCircle(xc,yc,r,color,pDC); (3)椭圆的生成:根据中点画椭圆算法的基本原理,编写绘制椭圆的应用程序, 并运行演示。 void WholeEllipse(int xc,int yc,int x,int y,int color,CDC* pDC) { pDC->SetPixel(xc+x,yc+y,color);pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc+x,yc-y,color);pDC->SetPixel(xc-x,yc-y,color); } void MPEllipse(int xc,int yc,int a,int b,int color,CDC *pDC) { 5
int aa=a*a,bb=b*b; int x=0,y=b; int d=(int)(bb+aa*(-b+0.25)+0.5); WholeEllipse(xc,yc,x,y,color,pDC); while(bb*x0) { if(d>0) {d+=aa*(-2*y+3); } else {d+=bb*(2*x+2)+aa*(-2*y+3);x++;} y--; WholeEllipse(xc,yc,x,y,color,pDC); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int x0=500,y0=320,x1,x2,y1,a=120,b=50,color=RGB(0,0,255); MPEllipse(x0-170,y0,a,b,color,pDC); MPEllipse(x0+170,y0,a,b,color,pDC); MPEllipse(x0,y0-170,b,a,color,pDC); MPEllipse(x0,y0+170,b,a,color,pDC); a=20;b=20; MPEllipse(x0,y0,a,b,color,pDC); 6
五、指导教师意见及成绩: 签名: 年 月 日 7
实验二:区域填充与图形裁剪 实验名称:区域填充与图形裁剪 实验室: 学生姓名: 指导教师: 一、实验目的: 实验台号: 专业班级: 实验日期: 掌握区域填充以及直线段和多边形裁剪的基本算法。 二、实验仪器及实验环境: 计算机、Win7、VC++6.0 三、实验原理: 区域填充和图形裁剪算法的基本原理。 四、实验内容及结果: (1)区域填充:根据种子填充算法的基本原理,编写图形填充的应用程序,并运 行演示填充效果。 void boundaryfill4(int seedx, int seedy, int fcolor, int bcolor, CDC *pDC) { int current = pDC->GetPixel(seedx,seedy); if((current!=bcolor)&&(current!=fcolor)) { // 非边界 非涂完区域 pDC->SetPixel(seedx,seedy,fcolor); boundaryfill4(seedx,seedy+1,fcolor,bcolor,pDC); boundaryfill4(seedx,seedy-1,fcolor,bcolor,pDC); boundaryfill4(seedx+1,seedy,fcolor,bcolor,pDC); boundaryfill4(seedx-1,seedy,fcolor,bcolor,pDC); } 8
分享到:
收藏