计算机图形学实验答案_第1页
计算机图形学实验答案_第2页
计算机图形学实验答案_第3页
计算机图形学实验答案_第4页
计算机图形学实验答案_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学实验答案实验一、中点画直线算法#include<stdio.h>#include<graphics.h>voidMidpointLine1(intx0,inty0,intx1,inty1,intcolor){inta,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; putpixel(x,y,color); while(x<x1){ if(d<0) {x++;y++;d+=d2;} else {x++;d+=d1;} putpixel(x,y,color);}}voidMidpointLine2(intx0,inty0,intx1,inty1,intcolor){inta,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; putpixel(x,y,color); while(x<x1){ if(d<0) {x++;d+=d1;} putpixel(-x+320,y+240,color); putpixel(x+320,-y+240,color); putpixel(-x+320,-y+240,color); putpixel(y+320,x+240,color); putpixel(-y+320,x+240,color); putpixel(y+320,-x+240,color); putpixel(-y+320,-x+240,color);}}intmain(){ intr0,color; intgdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"C:\\tc\\BGI"); scanf("%d,%d",&r0,&color); Midpoint_circle(r0,color); getch(); closegraph(); return0;}三、区域填充算法#include<stdio.h>#include<graphics.h>intedge_MarkFill(intn,int*p,intcolor){ intinsideFlag=0,c1=0,c2=0; intmax,min; intx,y,i,j; max=min=p[1]; for(i=1,max=min=p[1];i<n*2;i+=2) {if(max<p[i])max=p[i]; if(min>p[i])min=p[i];} for(y=min+1;y<max;++y) { for(x=0;x<640;++x) {c1=c2; c2=getpixel(x,y); if(c1==color&&c2!=color) insideFlag=!insideFlag; if(insideFlag) putpixel(x,y,color);} }}intmain(){ intgdriver=DETECT,gmode,color=RED; intpoints[]={120,50,120,200,250,200,350,50,120,50}; initgraph(&gdriver,&gmode,"C:\\TC\\BGI"); setbkcolor(BLACK); setcolor(color); drawpoly(5,points); edge_MarkFill(5,points,color); getch(); closegraph(); return0;}图形裁剪算法#include<graphics.h>#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8voidencode(floatx,floaty,int*code,floatXL,floatXR,floatYB,floatYT){ intc=0; if(x<XL) c=c|LEFT; elseif(x>XR) c=c|RIGHT; if(y<YB) c=c|BOTTOM; elseif(y>YT) c=c|TOP; *code=c; return;}voidSwapPoint(x1,y1,x2,y2)float*x1,*y1,*x2,*y2;{ floatt; t=*x1;*x1=*x2;*x2=t; t=*y1;*y1=*y2;*y2=t;}voidSwapCode(code1,code2)int*code1,*code2;{ intt; t=*code1; *code1=*code2; *code2=t;}C_S_Line_Clip(x1,y1,x2,y2,XL,XR,YB,YT)floatx1,y1,x2,y2,XL,XR,YB,YT;{ intcode1,code2,code; intx,y; encode(x1,y1,&code1,XL,XR,YB,YT); encode(x2,y2,&code2,XL,XR,YB,YT); while(code1!=0||code2!=0) { if(code1&code2!=0) return; if(code1==0) { SwapPoint(&x1,&y1,&x1,&y2);SwapCode(&code1,&code2);} code=code1; if(LEFT&code!=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} elseif(RIGHT&code!=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} elseif(BOTTOM&code!=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} elseif(TOP&code!=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);} x1=x; y1=y; encode(x,y,code,XL,XR,YB,YT); } line(x1,x2,y1,y2); return;}intmain(){ intx1=12,x2=560,y1=202,y2=25; intXL=35,XR=358,YB=62,YT=310; intgdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"C:\\TC\\BGI"); C_S_Line_Clip(x1,y1,x2,y2,XL,XR,YB,YT); getch(); closegraph(); return0;}五、bezier曲线生成算法:deCasteljau算法#include<stdio.h>#include<graphics.h>#defineN4floatCasteljau(intk,floatcontrols[10],floatt){ intr,i; floatt1,controlsa[10]; t1=1.0-t; for(i=0;i<=k;i++)controlsa[i]=controls[i]; for(r=1;r<=k;r++) for(i=0;i<=k-r;i++)controlsa[i]=t1*controlsa[i]+t*controlsa[i+1]; returncontrolsa[0];}voiddraw_bezier_curve(intk,floatcontrolx[],floatcontroly[],intx0,inty0){inti,x,y;floatu,delta;floatcontrolp;delta=1.0/(float)(N);for(i=0,u=0;u<=1.0;i++,u=u+delta){controlp=Casteljau(k,controlx[i],u); if(i==0) moveto(x0+controlp,y0-controlp);lineto(x0+controlp,y0-controlp);}}voiddraw_polygon(floatcontrolx[],floatcontroly[],intoriginx,intoriginy){inti;for(i=0;i<N;i++) {if(i==0) moveto(originx+controlx[0],originy-controly[0]);lineto(originx+controlx[i],originy-controly[i]);}}intmain(){ floatcontrolsx[5],controlsy[5]; intgdriver=DETECT,gmode; intoriginx,originy; printf("inputx0,y0,x1,y1,x2,y2,x3,y3,x4,y4:"); scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&controlsx[0],&controlsy[0],&controlsx[1],&controlsy[1],&controlsx[2],&controlsy[2],&controlsx[3],&controlsy[3],&controlsx[4],&controlsy[4]); initgraph(&gdriver,&gmode,"C:\\TC\\BGI"); originx=getmaxx()/2; originy=getmaxy()/2; setcolor(BLUE); draw_polygon(controlsx,controlsy,originx,originy); setcolor(RED); draw_bezier_curve(N,controlsx,controlsy,originx,originy); getch();closegraph();}6、二维几何图形变换:用户输入三角形的三个顶点以及屏幕上任意一个顶点P的坐标,使得该三角形相对于P瞬时针旋t弧度。#include<stdio.h>#include<graphics.h>#include<math.h>floatjzjs(floata[3][3],floatb[3][3],floats[3][3]){ inti,j,k; doublesum; for(i=0;i<3;++i) { for(j=0;j<3;++j) { sum=0; for(k=0;k<3;++k) { sum+=a[i][k]*b[k][j]; s[i][j]=sum; }}} return0;}intmain(){ intdrive=DETECT,mode; floatt; inti,j; floatx0,y0,x1,y1,x2,y2,x3,y3; floatT1[3][3]={1,0,0,0,1,0,0,0,1},T2[3][3]={0,0,0,0,0,0,0,0,1},T3[3][3]={1,0,0,0,1,0,0,0,1},p[3][3]={0,0,1,0,0,1,0,0,1}; floatr[3][3],s[3][3],w[3][3]; initgraph(&drive,&mode,"C:\\TC\\BGI"); setcolor(RED); printf("pleaseinputthecoordinateofP(x0,y0)andtheradian(t):\n"); scanf("%f,%f,%f",&x0,&y0,&t); printf("pleaseinputthethreepointsoftriangle(x1,y1,x2,y2,x3,y3):\n");scanf("%f,%f,%f,%f,%f,%f",&x1,&y1,&x2,&y2,&x3,&y3); line(x1,y1,x2,y2); line(x2,y2,x3,y3); line(x3,y3,x1,y1); T1[2][0]=-x0; T1[2][1]=-y0; T2[0][0]=cos(t); T2[0][1]=sin(t); T2[1][0]=-sin(t); T2[1][1]=cos(t); T3[2][0]=x0; T3[2][1]=y0; p[0][0]=x1;p[0][1]=y1; p[1][0]=x2; p[1][1]=y2; p[2][0]=x3; p[2][1]=y3;jzjs(T1,T2,r); jzjs(r,T3,s); jzjs(p,s,w); getch();setcolor(GREEN);line(w[0][0],w[0][1],w[1][0],w[1][1]); line(w[1][0],w[1][1],w[2][0],w[2][1]); line(w[2][0],w[2][1],w[0][0],w[0][1]); getch();closegraph(); return0;}7、仿照多边形区域填充算法,写出圆域的填充算法。方法一:套用边界标志算法:

#include<graphics.h>

edgeMarkFill(intx0,inty0,intr,intcolor)

{intinsideFlag=0,c1=0,c2=0;

intmax,min;

inti,j,x,y;

max=y0+r;min=y0-r;

for(y=min+1;y<max;y++)

for(x=x0-r-1;x<=x0+r;x++)

{c1=c2; c2=getpixel(x,y);

if(c1==color&&c2!=color)

insideFlag=!insideFlag;

if(insideFlag)putpixel(x,y,color); }}

main()

{ intgd=DETECT,gm,color=RED;

intx,y,r;

scanf("%d%d%d",&x,&y,&r);

initgraph(&gd,&gm,"d:\\turboc2");

setbkcolor(BLUE);

setcolor(color);

circle(x,y,r);

edgeMarkFill(x,y,r,color);

getch(); closegraph();}

方法二:扫描圆弧时直接填充

#include<graphics.h>

circleFill(intx0,inty0,intr,intcolor){ intx,y,x1; floatd;

x=0; y=r; d=1.25-r;

while(x<y){

for(x1=x0-x;x1<=x0+x;x1++)

putpixel(x1,y+y0,color);

for(x1=x0-y;x1<=x0+y;x1++)

putpixel(x1,x+y0,color);

for(x1=x0-x;x1<=x0+x;x1++)

putpixel(x1,-y+y0,color);

for(x1=x0-y;x1<=x0+y;x1++)

putpixel(x1,-x+y0,color);

if(d<0){d+=2*x+3;x++;}

else{d+=2*(x-y)+5;x++;y--;}}}

main()

{ intgd=DETECT,gm,color=RED;

intx,y,r;

scanf("%d%d%d",&x,&y,&r);

initgraph(&gd,&gm,"d:\\turboc2");

circleFill(x,y,r,color);

getch(); closegraph();}

8、编写一个程序实现绘制三个像素宽的斜率在0~1之间的点划线。voidMidpointLine(intx0,inty0,intx1,inty1,intcolor){

inta,b,d1,d2,d,x,y;

intpattern[32]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

0,0,0,0,0,0,1,1,0,0,0,0,0,0},i=0;

a=y0-y1;b=x1-x0;d=2*a+b;

d1=2*a;d2=2*(a+b);

x=x0;y=y0;

while(x<=x1){if(pattern[i%32]){

putpixel(x,y+1,color);

putpixel(x,y,color);

putpixel(x,y-1,color);}

if(d<0){x++;y++;d+=d2;}

else {x++;d+=d1;}

i++;}}

intmain(){intx0,y0,x1,y1;

floatk;

intgdriver=DETECT,gmode;

scanf("%d%d%d%d",&x0,&y0,&x1,&y1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论