计算机图形学实验报告1Word格式文档下载.docx

上传人:b****6 文档编号:17261275 上传时间:2022-11-29 格式:DOCX 页数:17 大小:75.18KB
下载 相关 举报
计算机图形学实验报告1Word格式文档下载.docx_第1页
第1页 / 共17页
计算机图形学实验报告1Word格式文档下载.docx_第2页
第2页 / 共17页
计算机图形学实验报告1Word格式文档下载.docx_第3页
第3页 / 共17页
计算机图形学实验报告1Word格式文档下载.docx_第4页
第4页 / 共17页
计算机图形学实验报告1Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

计算机图形学实验报告1Word格式文档下载.docx

《计算机图形学实验报告1Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告1Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

计算机图形学实验报告1Word格式文档下载.docx

}

voidsuofang(doubles)

{

doublea1,b1,a2,b2;

a1=(double)x1*s;

b1=(double)y1*s;

a2=(double)x2*s;

b2=(double)y2*s;

voidxuanzhuan(doubleb)

a1=x1*cos(b)-y1*sin(b);

b1=y1*cos(b)+x1*sin(b);

a2=x2*cos(b)-y2*sin(b);

b2=y2*cos(b)+x2*sin(b);

voidcuoqie(doubleb,doubled)

doublea1,b1,a2,b2,a3,b3,a4,b4;

a1=x1+b*y1;

a3=x3+b*y3;

b1=d*x1+y1;

b3=d*x3+y3;

a2=x2+b*y2;

a4=x4+b*x4;

b2=d*x2+y2;

b4=d*x4+y4;

line(a1,b1,a3,b3);

line(a3,b3,a2,b2);

line(a2,b2,a4,b4);

line(a4,b4,a1,b1);

voidduichenpoint()

a1=-x1;

b1=-y1;

a2=-x2;

b2=-y2;

voidduichenx()

doublea1,b1,a2,b2;

a1=x1;

a2=x2;

rectangle(a1,b1,a2,b2);

voidduicheny()

a1=-x1;

b1=y1;

b2=y2;

voidduichenxy()

a1=y1;

b1=x1;

a2=y1;

b2=x2;

voidduichenyx()

a1=-y1;

b1=-x1;

a2=-y2;

b2=-x2;

main()

{intgdriver,gmode;

intselect=100;

doublec,d,e;

gdriver=DETECT;

gmode=0;

initgraph(&

gdriver,&

gmode,"

d:

\\tc20h\\bgi"

);

x1=50;

y1=50;

x2=100;

y2=100;

x3=x2;

y3=y1;

x4=x1;

y4=y2;

printf("

pleaseinputarectangle'

stwopoint:

(x1,y1,x2,y2)"

scanf("

%lf%lf%lf%lf"

&

x1,&

y1,&

x2,&

y2);

rectangle(x1,y1,x2,y2);

getch();

1----pingyi\n"

2----suofang"

3----xuanzhuan"

4----cuoqie"

5----guanyuyuandianduichen\n"

6----guanyuxduichen\n"

7----guanyuyduichen\n"

8----guanyuy=xduichen\n"

9----guanyuy=-xduichen\n"

wouldyouwanttoselectwhat:

(0isexitsystem!

)\n"

while(select!

=0)

{

%d"

select);

if(select==1)

what'

sdistancetopingyi?

"

x:

"

%lf"

d);

y:

c);

pingyi(d,c);

}

elseif(select==2)

ssizeofrectangleyouwant?

e);

suofang(e);

elseif(select==3)

xuanzhaun'

ssize?

xuanzhuan(e);

elseif(select==4)

cuoqie'

%lf%lf"

c,&

cuoqie(c,d);

elseif(select==5)

duichenpoint();

elseif(select==6)

duichenx();

elseif(select==7)

duicheny();

elseif(select==8)

duichenxy();

elseif(select==9)

duichenyx();

else

errorpleaseagain!

orinput0toexit!

\n"

closegraph();

system("

pause"

7、程序结果及其分析

通过在这次的实验刚开始,由于第一次接触编译的环境觉得无从下手,但也逐渐学到了很多东西按照图形变换的基本原理,我简单实现了图形的几种变换通过这次实验,我对二维图形的基本几何变换(平移、旋转、缩放、错切、反射、投影)和复合变换的理解更加深入了,在对图形进行复合变换时,将几个基本几何变换矩阵按一定顺序相乘便能得到一个复合矩阵,这个复合矩阵能够决定变换后图形的最终位置、形状和大小的信息。

在产生复合矩阵时,因为矩阵乘法并不满足交换律,所以如果基本几何变换矩阵相乘的顺序不同,可能会得到不同的复合矩阵,也就生成了不同的最终变换图形。

实验三二维基本图形生成的算法实现

二维基本图形生成的算法实现

1.掌握直线的两种生成算法;

2.掌握二维图形显示原理。

1.对各种生成算法进行效率及效果的分析和比较;

2.实现直线的生成;

3.学有余力的同学可在对现有算法理解的基础上,能自行设计二维图形的生成算法并编程实现。

1.数值微分法(DigitalDifferentialAnalyzer,DDA)生成直线

(1)算法思想:

基于直线的微分方程来生成直线。

已知过端点P0(x0,y0),P1(x1,y1)的直线段L:

y=kx+b

直线斜率为

(2)数学描述

①k≤1时,在x的增量方向上走步,走步的方向决定于x的符号。

xi+1=xi+x,计算yi+1=kxi+1+b

=kxi+b+kx

=yi+kx

当x=1;

yi+1=yi+k

即:

当x每递增1,y递增k(即直线斜率);

在这种情况下,x每增加1,y最多增加1。

②当k1时,在y的增量方向上走步,走步的方向决定于y的符号。

yi+1=yi+1

计算xi=yi/k-b/k

xi+1=yi+1/k-b/k

=(yi+1)/k-b/k

=yi/k-b/k+1/k

=xi+1/k

2.Bresenham算法生成直线

(1)算法思想

比较从理想直线到位于直线上方的像素的距离d2和相邻的位于直线下方的像素的距离d1,然后根据距离误差项的符号确定与理想直线最近的象素。

(1)判别函数

设直线起点P0(x0,y0),终点P1(x1,y1),令e0=2y-x作为判别函数,根据e0的正负,可以确定走向:

①e0<0,Y方向不走步

②e0>=0,Y方向走一步

(2)递推公式

对于第i+1步(i=0,l,2,……,n)

如果ei≥0,则Y方向走一步:

Xi+l=Xi+1Yi+1=Yi+1

ei+1=ei+2y-2x

如果ei<0,则Y方向不走步:

Xi+l=Xi+1Yi+1=Yi

ei+1=ei+2y

1.选择一种直线生成算法(Bresenham算法生成直线);

2.用C语言编写程序,依情况进行判断;

3.用putpixel()函数逐个画点;

4.上机调试程序,显示最终结果。

doublex,y;

doublea[50];

b[50];

voidrun(doublek,intd)

inti;

if(abs(k)<

=1)

for(i=2;

i<

=10;

i++)

a[i]=a[i-1]+d;

b[i]=b[i-1]+k*d;

putpixel(a[i],b[i],1);

a[i]=a[i-1]+1/k;

b[i]=b[i-1]+1;

putpixel(a[i],b[i],1

);

intgdriver,gmode;

gdriver=DETECT;

gmode=0;

initgraph(&

x=50;

y=50;

putpixel(x,y,1);

getch();

a[1]=x;

b[1]=y;

run(2,2);

run(0.5,50);

七、程序结果及其分析

实验四二维填充图的生成算法

一、实验名称

二维填充图的生成算法

二、实验目的

1、掌握区域填充的扫描线算法思想。

1、编程实现任一多边形的填充。

1、算法思想

用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。

每根扫描线与多边形各边产生一系列交点,将这些交点按横坐标从小到大排序,将交点两两配对,并填充每一区段。

多边形被扫描完毕后,填充也就完成。

2、算法步骤:

(1)为每一条扫描线建立新边表NET;

(2)将扫描线纵坐标y的初值置为NET中非空元素的最小序号;

(3)置活性边表AET为空;

(4)执行下列步骤直至NET和AET都为空;

A、如果NET中的第y类非空,则将其中的所有边取出并插入AET中,在插入过程中进行排序;

B、对AET中的边两两配对,将每对边中x坐标按规则取整,获得有效的填充区段,再填充;

C、将当前扫描线纵坐标y值递增1,即y=1;

D、将AET中满足y=ymax边删去;

E、对AET中剩下的每一条边的x递增deltax,即x=x+deltax

3、思考:

(1)如何解决填充扩大化问题?

(2)如何解决交点计数问题?

1.利用扫描线填充算法实现,多边形以n,x_array,y_array形式给出,其中x_array,y_array中存放着多边形的n个顶点的x,y坐标;

2.用C语言编写程序实现算法;

六、实验要求

#include<

stdio.h>

stdlib.h>

conio.h>

voiddraw(intx1,inty1,intx2,inty2,intdelta)

{intnx1,ny1,nx2,ny2;

nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2;

while((ny1>

=y1)&

&

(nx2<

=x2))

{line(nx1,ny1,nx2,ny2);

ny1-=delta;

nx2+=delta;

if(nx2>

x2)

{ny2-=nx2-x2;

nx2=x2;

while(ny1>

y1)

{line(nx1,ny1,nx2,ny2);

ny1-=delta;

ny2-=delta;

nx1+=y1-ny1;

ny1=y1;

while(nx1<

nx1+=delta;

else

{nx1+=y1-ny1;

while(nx2<

nx1+=delta;

ny2-=nx2-x2;

while(ny2>

intmain(void)

{intx1,y1,y2,x2,delta;

intdriver=DETECT,mode;

printf("

Pleaseinputlefttop(x1,y1)andrightbottom(x2,y2)ofrectangleanddelta:

%d%d%d%d%d"

y2,&

delta);

initgraph(&

driver,&

mode,"

/*这里*/rectangle(x1,y1,x2,y2);

draw(x1,y1,x2,y2,delta);

gotoxy(1,1);

Pressanykeytoexit!

closegraph();

return0;

实验五曲线的生成算法实现

曲线的生成算法实现

1.掌握B样条曲线、Bezier曲线的定义;

2.能编程实现N次B样条曲线、Bezier曲线的绘制与显示。

1.编程实现二次Bezier曲线的绘制;

2.学有余力的同学可以编程实现二次B样条曲线的绘制。

1.贝塞尔曲线

贝塞尔曲线的参数向量表达式

通常,n+1个顶点定义一个n次多项式。

其中

称为伯恩斯坦(Bernstain)基函数。

2.B样条的数学表达式

给定m+n+1个顶点,

可以定义m+1段n次的参数曲线段为:

式中

称为n次B样条基函数。

2.上机调试程序,显示最终绘图结果。

#include 

graphics.h"

malloc.h"

math.h"

#define 

MULTIPLE 

ROW 

struct 

node{ 

float 

x,y;

};

void 

draw_polygon(struct 

node 

a[],int 

originx,int 

originy) 

int 

n;

for 

(n=0;

n<

ROW;

n++){ 

if 

(n==0) 

moveto(originx+a[0].x,originy-a[0].y);

lineto(originx+a[n].x,originy-a[n].y);

decasteljau(struct 

p[],int 

n,float 

u) 

i,r;

point,q[20];

for(i=0;

i++) 

q[i]=p[i];

for(r=1;

r<

r++) 

n-r;

i++){ 

q[i].x=(1.0-u)*q[i].x+u*q[i+1].x;

q[i].y=(1.0-u)*q[i].y+u*q[i+1].y;

return 

q[0];

draw_bezier_curve(struct 

n,int 

x0,int 

y0) 

i,x,y;

u,delta;

point;

delta=1.0/(float)(MULTIPLE*ROW);

for(i=0,u=0;

u<

=1.0;

i++,u=u+delta){ 

point=decasteljau(p,n,u);

if(i==0)moveto(x0+point.x,y0-point.y);

lineto(x0+point.x,y0-point.y);

main() 

gdriver=DETECT,gmode;

number,n,originx,originy;

a[]={{120,0},{45,0},{0,45},{0,120}};

originx=getmaxx()/2;

originy=getmaxy()/2;

setcolor(BLUE);

draw_polygon(a,originx,originy);

setcolor(RED);

draw_bezier_curve(a,ROW,originx,originy);

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

当前位置:首页 > 高中教育 > 初中教育

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

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