实验三7图形裁剪算法的具体实现.docx
- 文档编号:2333723
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:19
- 大小:32.04KB
实验三7图形裁剪算法的具体实现.docx
《实验三7图形裁剪算法的具体实现.docx》由会员分享,可在线阅读,更多相关《实验三7图形裁剪算法的具体实现.docx(19页珍藏版)》请在冰点文库上搜索。
实验三7图形裁剪算法的具体实现
计算机图形学课程实验报告
信息与计算科学
(三)
上机实验3:
裁剪算法
班级:
姓名:
学号:
上机实验(3)的题目和要求
一、实验目的
掌握图形裁剪算法的基本思想,并能上机编程实现相应的算法。
二、实验要求(Direction)
1.每个学生单独完成。
2.开发语言规定为C语言。
3.请在自己的实验报告上写明姓名、学号、班级。
4.每次交的实验报告内容包括:
试验目的和意义、题目、程序制作步骤、主程序(包括源代码注释)。
三、实验题目
实验题1:
上机编一程序实现直线的中点裁剪算法。
具体要求如下说明:
1该程序能实现窗口屏幕上任意一条直线的裁剪;
2直线段要求可以随机输入;
#defineLEFT1
#defineRIGHT2
#defineBOTTOM4
#defineTOP8
#defineXL150
#defineXR350
#defineYB200
#defineYT300
#include
#include
#include
encode(x,y,code)
floatx,y;
int*code;
{
intc=0;
if(x elseif(x>XR)c=c|RIGHT; if(y elseif(y>YT)c=c|TOP; *code=c; return*code; } voidM_lieCLip(floatx1,floaty1,floatx2,floaty2,float*x,float*y) { intcode1,code2,code; floatt=1,xx,yy; encode(x1,y1,&code1); encode(x2,y2,&code2); if(code1==0){*x=x1;*y=y1;return;} while(code1&code2==0) { L1: xx=(x1+x2)/2; yy=(y1+y2)/2; encode(x,y,&code); if(abs((x2-xx)*(x2-xx)+(y2-yy)*(y2-yy)) {*x=xx;*y=yy;return;} if(code&code1! =0){x2=xx;y2=yy;} else{x1=xx;y1=yy;} } } voidmain() { floatx1,y1,x2,y2,xx,yy,xxx,yyy,t; intgdriver=DETECT,gmode; initgraph(&gdriver,&gmode,""); setcolor(4); line(XL,YT,XR,YT);line(XL,YB,XR,YB); line(XL,YT,XL,YB);line(XR,YT,XR,YB); printf("pleaseinputx1,x2,y1,y2: "); scanf("%d%d%d%d",&x1,&x2,&y1,&y2); setcolor(7); line(x1,y1,x2,y2); xx=0;yy=0;xxx=0;yyy=0; M_lieCLip(x1,y1,x2,y2,&xx,&yy); M_lieCLip(x2,y2,xx,yy,&xxx,&yyy); setcolor(11); line(xx,yy,xxx,yyy); getch(); closegraph(); } 运行结果图: 裁剪之前裁剪之后 实验题2: 实现Sutherland-Hodgeman多边形裁剪算法。 对矩形窗口中一多边形进行裁剪。 运行结果图: /*Sutherland-Hodgman算法*/ #defineLENsizeof(structnode) #include"math.h" #include"stdio.h" #include"graphics.h" structnode { intdx,dy; structnode*next; }; structnode*h,*q,*r; structnode*creat() { intp[8][2]={100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190}; inti; setcolor(10); for(i=0;i<7;i++)line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]); line(p[0][0],p[0][1],p[7][0],p[7][1]); rectangle(120,200,230,70); h=NULL; for(i=0;i<8;i++) { q=(structnode*)malloc(LEN); q->dx=p[i][0]; q->dy=p[i][1]; if(h==NULL) h=q; elser->next=q; r=q; } r->next=NULL; return(h); } intx; structnode*builx(h,x) structnode*h; { ints[2],j[2]; structnode*hh,*p,*q; intmax,min; p=h;hh=NULL; s[0]=p->dx;s[1]=p->dy; p=p->next; while(p! =NULL) { j[0]=x; j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]); max=s[0];min=p->dx; if(s[0] { max=p->dx; min=s[0]; } if((j[0]>=min)&&(j[0]<=max)) { q=(structnode*)malloc(LEN); q->dx=j[0];q->dy=j[1]; if(hh==NULL) hh=q; else r->next=q; r=q; } if(p->dx>=x) {q=(structnode*)malloc(LEN); q->dx=p->dx;q->dy=p->dy; if(hh==NULL)hh=q; elser->next=q; r=q; } s[0]=p->dx;s[1]=p->dy; p=p->next; } p=h; j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]); max=s[0];min=p->dx; if(s[0] if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0];q->dy=j[1]; if(hh==NULL)hh=q; elser->next=q; r=q; } if(p->dx>=x) {q=(structnode*)malloc(LEN); q->dx=p->dx;q->dy=p->dy; if(hh==NULL)hh=q; elser->next=q; r=q; } r->next=NULL; return(hh); } structnode*builxx(h,x) structnode*h; intx; {ints[2],j[2]; structnode*hh,*p,*q; intmax,min; p=h; hh=NULL; s[0]=p->dx; s[1]=p->dy; p=p->next; while(p! =NULL) { j[0]=x; j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]+0.1); max=s[0]; min=p->dx; if(s[0] min=s[0]; } if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dx<=x) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } s[0]=p->dx; s[1]=p->dy; p=p->next; } p=h; j[0]=x; j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]+0.1); max=s[0]; min=p->dx; if(s[0] min=s[0]; } if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dx<=x) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } r->next=NULL; return(hh); } structnode*buily(h,y) structnode*h; inty; {ints[2],j[2]; structnode*hh,*p,*q; intmax,min; p=h; hh=NULL; s[0]=p->dx; s[1]=p->dy; p=p->next; while(p! =NULL) { j[1]=y; j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1); max=s[1]; min=p->dy; if(s[1] min=s[1]; } if((j[1]>=min)&&(j[1]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dy>=y) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } s[0]=p->dx; s[1]=p->dy; p=p->next; } p=h; j[1]=y; j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1); max=s[1]; min=p->dy; if(s[1] min=s[1]; } if((j[1]>=min)&&(j[1]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dy>=y) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } r->next=NULL; return(hh); } structnode*builyy(h,y) structnode*h; inty; {ints[2],j[2]; structnode*hh,*p,*q; intmax,min; p=h; hh=NULL; s[0]=p->dx; s[1]=p->dy; p=p->next; while(p! =NULL) { j[1]=y; j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1); max=s[1]; min=p->dy; if(s[1] min=s[1]; } if((j[1]>=min)&&(j[1]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dy<=y) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } s[0]=p->dx; s[1]=p->dy; p=p->next; } p=h; j[1]=y; j[0]=s[0]+(p->dx-s[0])*(y-s[1])/(p->dy-s[1]+0.1); max=s[1]; min=p->dy; if(s[1] min=s[1]; } if((j[1]>=min)&&(j[1]<=max)) {q=(structnode*)malloc(LEN); q->dx=j[0]; q->dy=j[1]; if(hh==NULL) hh=q; elser->next=q; r=q; } if(p->dy<=y) {q=(structnode*)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if(hh==NULL) hh=q; elser->next=q; r=q; } r->next=NULL; return(hh); } voidInitialize(void) { intgdriver=DETECT,gmode; initgraph(&gdriver,&gmode,""); setbkcolor(BLACK); } main() {intmax,min; structnode*head,*r,*q; inti; ints[2]; Initialize(); head=creat(); q=head; while(q->next! =NULL) {putpixel(q->dx,q->dy,14); q=q->next; } putpixel(q->dx,q->dy,14); q=builx(head,120); head=q; while(q->next! =NULL) {putpixel(q->dx,q->dy,15); q=q->next; } putpixel(q->dx,q->dy,15); q=buily(head,70); head=q; while(q->next! =NULL) {putpixel(q->dx,q->dy,2); q=q->next; } putpixel(q->dx,q->dy,2); q=builxx(head,230); head=q; while(q->next! =NULL) {putpixel(q->dx,q->dy,1); q=q->next; } putpixel(q->dx,q->dy,1); q=builyy(head,200); head=q; s[0]=q->dx; s[1]=q->dy; q=q->next; setcolor(6); while(q! =NULL) {line(s[0],s[1],q->dx,q->dy); s[0]=q->dx; s[1]=q->dy; q=q->next; } q=head; line(s[0],s[1],q->dx,q->dy); getch(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 图形 裁剪 算法 具体 实现