实验三7图形裁剪算法的具体实现.docx

上传人:b****4 文档编号:12210650 上传时间:2023-04-17 格式:DOCX 页数:19 大小:32.04KB
下载 相关 举报
实验三7图形裁剪算法的具体实现.docx_第1页
第1页 / 共19页
实验三7图形裁剪算法的具体实现.docx_第2页
第2页 / 共19页
实验三7图形裁剪算法的具体实现.docx_第3页
第3页 / 共19页
实验三7图形裁剪算法的具体实现.docx_第4页
第4页 / 共19页
实验三7图形裁剪算法的具体实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

实验三7图形裁剪算法的具体实现.docx

《实验三7图形裁剪算法的具体实现.docx》由会员分享,可在线阅读,更多相关《实验三7图形裁剪算法的具体实现.docx(19页珍藏版)》请在冰豆网上搜索。

实验三7图形裁剪算法的具体实现.docx

实验三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]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;

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]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();

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1