计算机图形学基础教程实验报告Word文档格式.docx
《计算机图形学基础教程实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学基础教程实验报告Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
程序如下
bresenham画线法:
#include<
graphics.h>
conio.h>
intbresenham(intx0,inty0,intx1,inty1,intcolor)
{
intx,y,dx,dy,e,i;
dx=x1-x0;
dy=y1-y0;
e=-dx;
y=y0;
for(x=x0;
x<
=x1;
x++)
{
putpixel(x,y,color);
e+=2*dy;
if(e>
=0)
{y++;
e-=2*dx;
}
}
return0;
}
intmain()
initgraph(640,480);
bresenham(0,0,500,200,255);
while(!
kbhit())
closegraph();
Bresenham画圆法:
intcirclepoints(intx,inty,intcolor)
putpixel(255+x,255+y,color);
putpixel(255+y,255+x,color);
putpixel(255-x,255+y,color);
putpixel(255+y,255-x,color);
putpixel(255-x,255-y,color);
putpixel(255-y,255-x,color);
putpixel(255+x,255-y,color);
putpixel(255-y,255+x,color);
intbresenhamcircle(intr,intcolor)
intx,y,d;
x=0;
y=r;
d=3-2*r;
while(x<
=y)
circlepoints(x,y,color);
if(d<
0)
d+=4*x+6;
else
d=d+4*(x-y)+10;
y--;
x++;
bresenhamcircle(100,255);
五、实验结果记录与分析
实验结果如下:
6、疑难问题报告
2013年10月29日9、10节实验地点:
多边形的填充算法和曲线的绘制
1、实验目的
通过本次实验,熟练掌握种子填充算法和多边形扫描线填充算法以及bezier曲线或者B样条曲线的基本绘制算法,能够独立在vc环境下实现任意多边形的填充和一般曲线的绘制,进一步熟悉opengl的语法结构和强大的绘图功能,增强多媒体底层程序绘图能力。
1.选择种子填充算法或者多边形的扫描线算法完成多边形的填充。
2.选择bezier曲线或者B样条曲线算法完成曲线的绘制。
程序如下:
多边形扫描线填充算法:
//sweep.h
#ifndefSWEEP_H
#defineSWEEP_H
structEdge{
intnxty;
intcurx;
intdx,dy;
Edge*nxt;
};
voidsweep(intp[][2],intn,void(*setPixel)(int,int));
#endif
//sweepline.cpp
#include<
stdlib.h>
stdio.h>
glut.h>
#include"
sweep.h"
voidmyInit();
voidsetPixel(intx,inty);
voidmyDisplay();
intmain(intargc,char**argv){
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(640,480);
glutInitWindowPosition(100,150);
glutCreateWindow("
SweepLine"
);
glutDisplayFunc(&
myDisplay);
myInit();
glutMainLoop();
voidsetPixel(intx,inty){
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
voidmyInit(){
glClearColor(1.0,1.0,1.0,0.0);
glColor3f(0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,640.0,0.0,480.0);
voidmyDisplay(){
inti,j;
glClear(GL_COLOR_BUFFER_BIT);
intp[5][2];
p[0][0]=100;
p[0][1]=300;
p[1][0]=200;
p[1][1]=50;
p[2][0]=300;
p[2][1]=100;
p[3][0]=400;
p[3][1]=0;
p[4][0]=350;
p[4][1]=470;
sweep(p,5,setPixel);
glFlush();
}
//sweep.cpp
algorithm>
usingnamespacestd;
constintMAXN=1024;
intcp[MAXN][2],n;
inlineboolcmp(inti,intj){
returncp[i][1]<
cp[j][1]||(cp[i][1]==cp[j][1]&
&
cp[i][0]<
cp[j][0]);
Edge*e[MAXN],*h,*ph,*data;
voidinsert(intly,intpx,intind){
inty1,y2,y,nxt,pre,flag=0;
nxt=(ind+1)%n;
pre=(ind-1+n)%n;
y=cp[ind][1];
y1=cp[nxt][1];
y2=cp[pre][1];
if(y1>
y2)s,y2);
if(y1<
y&
y<
y2){
//需缩短一个单位
flag=1;
h=e[ly];
ph=NULL;
while(h){
if(h->
dy>
cp[ind][1]||(h->
dy==cp[ind][1]&
h->
dx>
cp[ind][0]))break;
ph=h;
h=h->
nxt;
}
data=newEdge;
data->
curx=px;
nxty=cp[ind][1];
dx=cp[ind][0]-px;
dy=cp[ind][1]-ly;
nxt=NULL;
if(flag)data->
nxty--;
if(ph){
nxt=ph->
ph->
nxt=data;
}else{
nxt=e[ly];
e[ly]=data;
intex[MAXN][MAXN],ne[MAXN];
inlineintabs(inta){
returna>
0?
a:
-a;
voidmakepoint(intline,Edge*h){
intdx=h->
dx,dy=h->
dy,cnt=0;
intx,y,flag=1;
if((h->
dx)*(h->
dy)<
0)flag=0;
for(y=line,x=h->
curx;
y<
=h->
nxty;
y++){
ex[y][ne[y]++]=x;
cnt+=2*abs(dx);
while(cnt>
=2*abs(dy)){
cnt-=2*abs(dy);
if(flag)x++;
elsex--;
voidsweep(intp[][2],intnn,void(*setPixel)(int,int)){
//对所有点按y坐标递增排序,y坐标相等的按x坐标递增排序
n=nn;
inti,j,k,ind,nxt,pre;
int*num=newint[n];
//点索引;
for(i=0;
i<
n;
i++)num[i]=i;
memcpy(cp,p,sizeof(cp));
sort(num,num+n,cmp);
//建立有序边表
memset(e,0,sizeof(e));
i++){
ind=num[i];
if(p[nxt][1]>
p[ind][1])insert(p