计算机图形学试验
实验实验 1 1 直线的绘制直线的绘制 实验目的 1、 2、 3、 实验环境 计算机、Turbo C 或其他 C 语言程序设计环境 实验学时 2 学时,必做实验。 实验内容 用 DDA 算法或 Besenham 算法实现斜率 k 在 0 和 1 之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用 C 语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include 通过实验,进一步理解和掌握 DDA 和 Bresenham 算法; 掌握以上算法生成直线段的基本过程; 通过编程,会在 TC 环境下完成用 DDA 或中点算法实现直线段的绘制。 void DDALine(int x0,int y0,int x1,int y1,int color) { } main(){ 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;kyb) c=BOTTOM; } else if(yyt) c=TOP; if(x==xl||x==xr||y==yt||y==yb) c=0; *code=c; C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt) { int x,y,code1,code2,code3,code; encode(x1,y1, encode(x2,y2, encode(x3,y3, while(code1!=0||code2!=0) { if(code1 code=code1; if(code1==0) code=code2; if((LEFT y=y1+(long)(y2-y1)*(xl-x1)/(x2-x1); } else if((RIGHT y=y1+(long)(y2-y1)*(xr-x1/x2-x1); } else if((BOTTOM x=x1+(long)(x2-x1)*(yb-y1)/(y2-y1); } else if((TOP x=x1+(long)(x2-x1)*(yt-y1)/(y2-y1); } if(code==code1) {x1=x; y1=y; encode(x,y, } else {x2=x; y2=y; encode(x,y, } } while(code1!=0||code3!=0) { if(code1 code=code1; if(code1==0) code=code3; if((LEFT y=y1+(long)(y3-y1)*(xl-x1)/(x3-x1); } else if((RIGHT y=y1+(long)(y3-y1)*(xr-x1/x3-x1); } else if((BOTTOM x=x1+(long)(x3-x1)*(yb-y1)/(y3-y1); } else if((TOP x=x1+(long)(x3-x1)*(yt-y1)/(y3-y1); } if(code==code1) {x1=x; y1=y; encode(x,y, } else {x3=x; y3=y; encode(x,y, } } while(code3!=0||code2!=0) { if(code3 code=code3; if(code3==0) code=code2; if((LEFT y=y3+(long)(y2-y3)*(xl-x3)/(x2-x3); } else if((RIGHT y=y1+(long)(y2-y3)*(xr-x3/x2-x3); } else if((BOTTOM x=x1+(long)(x2-x1)*(yb-y3)/(y2-y3); } else if((TOP x=x1+(long)(x2-x1)*(yt-y3)/(y2-y3); } if(code==code3) {x1=x; y1=y; encode(x,y, } else {x2=x; y2=y; encode(x,y, } } setcolor(RED); line(x1,y1,x2,y2); line(x1,y1,x3,y3); line(x2,y2,x3,y3); return; } void main() { int graphdriver=DETECT,graphmode; initgraph( rectangle(xl,yt,xr,yb); line(x1,y1,x2,y2); line(x1,y1,x3,y3); line(x2,y2,x3,y3); C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt); getch(); closegraph(); } 实验截图: 实验实验 6 6曲线生成算法的实现曲线生成算法的实现 实验目的 了解曲线生成的原理,掌握几种常见的曲线生成算法,利用 TurboC 实现 Bezier 曲线的生 成算法。 实验环境 计算机、Turbo C 或其他 C 语言程序设计环境 实验学时 2 学时,必做实验。 实验内容 (1) 了解曲线生成的原理; (2) 掌握曲线生成算法(Bezier 曲线、B 样条曲线); (3) 利用 TurboC 实现 Bezier 曲线的生成算法,在屏幕上任意绘制一条三次 Bezier 曲线。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用 C 语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、打印源程序或把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码: #include “graphics.h“ #include “malloc.h“ #include “math.h“ #define MULTIPLE 7 #define ROW 4 struct node{ float x,y; }; void draw_polygon(struct node a[],int originx,int originy) { int n; for (n=0;nROW;n++){ if (n==0) moveto(originx+a[0].x,originy-a[0].y); lineto(originx+a[n].x,originy-a[n].y); } } struct node decasteljau(struct node p[],int n,float u) { int i,r; struct node point,q[20]; for(i=0;in;i++)