计算机图形学实验报告1Word格式文档下载.docx
《计算机图形学实验报告1Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告1Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
![计算机图形学实验报告1Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/29/bbfc535a-2fc6-41ac-82c8-45939fbe16e9/bbfc535a-2fc6-41ac-82c8-45939fbe16e91.gif)
}
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
7
ROW
4
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);