实验三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
encode(x,y,code)
floatx,y;
int*code;
{
intc=0;
if(xelseif(x>XR)c=c|RIGHT;if(yelseif(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]dx){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;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]);max=s[0];min=p->dx;if(s[0]dx){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;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]dx){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;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]dx){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;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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();}
elseif(x>XR)c=c|RIGHT;
if(yelseif(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]dx){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;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]);max=s[0];min=p->dx;if(s[0]dx){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;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]dx){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;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]dx){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;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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();}
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]dx){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;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]);max=s[0];min=p->dx;if(s[0]dx){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;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]dx){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;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]dx){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;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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]dy){max=p->dy;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();}
{*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]dx)
max=p->dx;
min=s[0];
if((j[0]>=min)&&(j[0]<=max))
q->dx=j[0];q->dy=j[1];
if(hh==NULL)
hh=q;
else
r->next=q;
if(p->dx>=x)
{q=(structnode*)malloc(LEN);
q->dx=p->dx;q->dy=p->dy;
if(hh==NULL)hh=q;
p=h;
j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]);
if(s[0]dx){max=p->dx;min=s[0];}
return(hh);
structnode*builxx(h,x)
{ints[2],j[2];
hh=NULL;
s[0]=p->dx;
s[1]=p->dy;
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]dx){max=p->dx;
q->dx=j[0];
q->dy=j[1];
if(p->dx<=x)
q->dx=p->dx;
q->dy=p->dy;
structnode*buily(h,y)
inty;
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]dy){max=p->dy;
min=s[1];
if((j[1]>=min)&&(j[1]<=max))
if(p->dy>=y)
structnode*builyy(h,y)
if(p->dy<=y)
voidInitialize(void)
setbkcolor(BLACK);
main()
{intmax,min;
structnode*head,*r,*q;
ints[2];
Initialize();
head=creat();
q=head;
while(q->next!
{putpixel(q->dx,q->dy,14);
q=q->next;
putpixel(q->dx,q->dy,14);
q=builx(head,120);
head=q;
{putpixel(q->dx,q->dy,15);
putpixel(q->dx,q->dy,15);
q=buily(head,70);
{putpixel(q->dx,q->dy,2);
putpixel(q->dx,q->dy,2);
q=builxx(head,230);
{putpixel(q->dx,q->dy,1);
putpixel(q->dx,q->dy,1);
q=builyy(head,200);
s[0]=q->dx;
s[1]=q->dy;
setcolor(6);
while(q!
{line(s[0],s[1],q->dx,q->dy);
line(s[0],s[1],q->dx,q->dy);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1