实验一DDA画线算法Word文档格式.docx

上传人:b****6 文档编号:8652097 上传时间:2023-05-12 格式:DOCX 页数:25 大小:123.57KB
下载 相关 举报
实验一DDA画线算法Word文档格式.docx_第1页
第1页 / 共25页
实验一DDA画线算法Word文档格式.docx_第2页
第2页 / 共25页
实验一DDA画线算法Word文档格式.docx_第3页
第3页 / 共25页
实验一DDA画线算法Word文档格式.docx_第4页
第4页 / 共25页
实验一DDA画线算法Word文档格式.docx_第5页
第5页 / 共25页
实验一DDA画线算法Word文档格式.docx_第6页
第6页 / 共25页
实验一DDA画线算法Word文档格式.docx_第7页
第7页 / 共25页
实验一DDA画线算法Word文档格式.docx_第8页
第8页 / 共25页
实验一DDA画线算法Word文档格式.docx_第9页
第9页 / 共25页
实验一DDA画线算法Word文档格式.docx_第10页
第10页 / 共25页
实验一DDA画线算法Word文档格式.docx_第11页
第11页 / 共25页
实验一DDA画线算法Word文档格式.docx_第12页
第12页 / 共25页
实验一DDA画线算法Word文档格式.docx_第13页
第13页 / 共25页
实验一DDA画线算法Word文档格式.docx_第14页
第14页 / 共25页
实验一DDA画线算法Word文档格式.docx_第15页
第15页 / 共25页
实验一DDA画线算法Word文档格式.docx_第16页
第16页 / 共25页
实验一DDA画线算法Word文档格式.docx_第17页
第17页 / 共25页
实验一DDA画线算法Word文档格式.docx_第18页
第18页 / 共25页
实验一DDA画线算法Word文档格式.docx_第19页
第19页 / 共25页
实验一DDA画线算法Word文档格式.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验一DDA画线算法Word文档格式.docx

《实验一DDA画线算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验一DDA画线算法Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。

实验一DDA画线算法Word文档格式.docx

{intdriver=DETECT;

intgmode;

intx1,y1,x2,y2,color;

printf("

pleaseinputx1,y1,y1,y2,color\n"

);

scanf("

%d,%d,%d,%d,%d"

&

x1,&

y1,&

x2,&

y2,&

color);

initgraph(&

driver,&

gmode,"

"

DDALine(x1,y1,x2,y2,color);

getch();

closegraph();

实验二Bresenham画线算法

掌握中点画线算法的思想和基本方法

用Bresenham画线算法画直线,并完善算法功能,使之适应更广

1.算法思路

假定直线段的斜率0≤m≤1,且x2>

x1,

若差为正,即

,下一个象素应取

若为负,即

引入新的判别量pi

其中

,又因为

,所以有

应取

,此时

pi<

0,应取

此时

初始值的确定:

2.C程序代码

voidBresenhamLine(intx1,inty1,intx2,inty2,intcolor)

intx,y,dx,dy,p;

p=2*dy-dx;

for(x=1;

x<

=x2;

x++)

{

putpixel(x,y,color);

if(p>

=0)

{y++;

p+=2*(dy-dx);

}

else

{p+=2*dy;

{intdriver=DETECT;

intgmode;

intx1,y1,x2,y2,color;

printf("

pleaseinputx1,y1,x2,y2,color"

scanf("

initgraph(&

BresenhamLine(x1,y1,x2,y2,color);

getch();

closegraph();

实验三中点画圆算法

掌握中点画圆算法的基本思想

编写中点画圆的基本函数并尽量完善

中点画圆算法画圆

构造函数

对于圆上的点,有F(x,y)=0;

对于圆外的点,有F(x,y)>

0;

对于圆内的点,有F(x,y)<

0。

设M的坐标为:

M(xi+1,yi-0.5),构造判别式:

当d<

0时,下一点取P1;

当d>

=0时,下一点取P2。

0时,下一点取P1,再下一个点的判别式:

=0时,下一点取P2,再下一个点的判别式:

判别式的初值:

2.源程序:

voidMidpointCircle(intx0,inty0,intR)

intx,y;

doubled;

x=0;

y=R;

d=1.25-R;

while(x<

y)

{if(d<

0)

{d+=x+x+3;

x++;

{d+=(x-y)+(x-y)+5;

y--;

putpixel(x0+x,y0+y,RED);

putpixel(x0+y,y0+x,RED);

putpixel(x0+y,y0-x,RED);

putpixel(x0+x,y0-y,RED);

putpixel(x0-x,y0-y,RED);

putpixel(x0-y,y0-x,RED);

putpixel(x0-y,y0+x,RED);

putpixel(x0-x,y0+y,RED);

main()

{intdriver=DETECT,mode;

mode,"

MidpointCircle(200,200,100);

1.

 

实验四Bresenham画圆算法

掌握Bresenham画圆算法的基本思想

编写Bresenham算法画圆的基本函数并尽量完善

Bresenham画圆算法画圆,并改造函数,使之能画整圆。

先求(0,R)到

之间的四分之一圆弧,然后由对称性求得整个圆。

,圆周上y的变化小于1,若第i步是

,那么第i+1步只能是H(Xi+1,Yi)和D(Xi+1,Yi+1)点中的一个,H和D点离圆心距离的平方差

令判别量

当Pi<

0时,下一点应选H点,

当Pi>

=0时,下一点应选D点。

2.源程序:

voidBresenhamCirle(intR)

intx,y,p;

p=3-2*R;

for(;

=y;

{putpixel(x+200,y+100,3);

putpixel(x+200,-y+100,3);

putpixel(y+200,x+100,3);

putpixel(-y+200,x+100,3);

putpixel(-x+200,y+100,3);

putpixel(-x+200,-y+100,3);

putpixel(-y+200,-x+100,3);

p+=4*(x-y)+10;

p+=4*x+6;

{intdriver=DETECT,gmode;

BresenhamCirle(150);

实验五正方形旋转

掌握图形的旋转变换数学原理

掌握一般图形旋转的基本算法

画一个正方形,并实现45度旋转,进一步可以使之动起来.

1算法思路

旋转变换:

式中,

是图形以坐标原点为旋转中心的旋转角度。

本程序实现相对于任意一点(x0,y0)作变换,可以先平移到原点,相对于原点作变换后,再平移回去。

相对于任意一点(x0,y0)的旋转变换矩阵如下:

T(-x0,-y0)R(

).T(x0,y0)

=

1.=

inti,j,s,k;

floatcx;

float

a[4][3]={{400,200,1},{300,200,1},{300,300,1},{400,300,1}};

floatpingyi[3][3]={{1,0,0},{0,1,0},{-125,-125,1}};

floatrpingyi[3][3]={{1,0,0},{0,1,0},{125,125,1}};

floatzhuan[3][3]={{0,0,0},{0,0,0},{0,0,1}};

floataxb[4][3];

floatzaxb[4][3];

floatrp[4][3];

intgdriver=DETECT,gmade;

gdriver,&

gmade,"

line(a[0][0],a[0][1],a[1][0],a[1][1]);

line(a[1][0],a[1][1],a[2][0],a[2][1]);

line(a[2][0],a[2][1],a[3][0],a[3][1]);

line(a[3][0],a[3][1],a[0][0],a[0][1]);

for(i=0;

4;

for(j=0;

j<

3;

j++)

s=0;

for(k=0;

k<

k++)

s=s+a[i][k]*pingyi[k][j];

axb[i][j]=s;

line(axb[0][0],axb[0][1],axb[1][0],axb[1][1]);

line(axb[1][0],axb[1][1],axb[2][0],axb[2][1]);

line(axb[2][0],axb[2][1],axb[3][0],axb[3][1]);

line(axb[3][0],axb[3][1],axb[0][0],axb[0][1]);

cx=(sqrt

(2))/2.0;

zhuan[0][0]=cx;

zhuan[0][1]=cx;

zhuan[1][0]=-cx;

zhuan[1][1]=cx;

s=s+axb[i][k]*zhuan[k][j];

zaxb[i][j]=s;

line(zaxb[0][0],zaxb[0][1],zaxb[1][0],zaxb[1][1]);

line(zaxb[1][0],zaxb[1][1],zaxb[2][0],zaxb[2][1]);

line(zaxb[2][0],zaxb[2][1],zaxb[3][0],zaxb[3][1]);

line(zaxb[3][0],zaxb[3][1],zaxb[0][0],zaxb[0][1]);

s=s+zaxb[i][j]*rpingyi[k][j];

rp[i][j]=s;

line(rp[0][0],rp[0][1],rp[1][0],rp[1][1]);

line(rp[1][0],rp[1][1],rp[2][0],rp[2][1]);

line(rp[2][0],rp[2][1],rp[3][0],rp[3][1]);

line(rp[3][0],rp[3][1],rp[0][0],rp[0][1]);

实验六直线段裁剪算法

4

掌握直线段裁剪算法的一般思想方法.

画几条线段,利用裁剪算法实现特定的裁剪,并验证算法的正确性

P52

第一步:

编码。

设直线段的两个端点为P1(x1,y1)和P2(x2,y2),根据编码规则,可以求出P1和P2所在的代码c1和c2;

第二步:

判别。

根据c1和c2的具体值,可以有三种情况:

1)c1=c2=0,这表明两端点全在窗口内,则整个直线也在窗口内,应该保留;

2)c1&

&

c2!

=0,表明两端点必定同处于某一边界的同一外侧,则整个直线全在窗口外,应该舍弃;

如不属于上面两种请况,表明直线有一部分在窗口内,又可以分为以下三种情况:

(1)一个端点在内,一个端点在外;

(2)两个端点均在外,但直线段中部跨越窗口;

(3)两端点都在外,且直线段也在外。

第三步:

求交。

对不能确定取舍的直线段,求其与窗口边界及其延长线的交点,从而将直线段分割。

求交点时,可以有针对性地与某一确定边界求交。

在交点处把线段分为两段。

把其中一段完全在窗口外,舍弃之。

第四步:

对剩下的线段重复以上各步,可以验证,至多重复到第三遍的判断为止,这时剩下的直线段或者全在窗口内,或者全在窗口外,从而完成了对直线段的裁剪。

#definex1150

#definexr180

#defineyt180

#defineyb150

voidCohen_Sutherland(doublex0,doubley0,doublex2,doubley2)

intc,c1,c2;

doublex,y;

c1=makecode(x0,y0);

c2=makecode(x2,y2);

while(c1!

==1)

if(c1&

c2==1)

return;

c=c1;

if(c==0)

c=c2;

if(c&

1==1)

y=y0+(y2-y0)*(x1-x0)/(x2-x0);

2)

x=xr;

4)

y=yb;

8)

y=yt;

if(c==c1)

x0=x;

y0=y;

c1=makecode(x,y);

x2=x;

y2=y;

c2=makecode(x,y);

line(x0,y0,x2,y2);

}

intmakecode(doublex,doubley)

intc=0;

if(x<

x1)

c=1;

if(x>

xr)

c=2;

if(y<

yb)

c=c+4;

if(y>

yt)

c=c+8;

}

returnc;

intdriver=DETCET;

intmode;

Cohen_Sutherland(75,75,200,200);

实验七两条线段求交算法

掌握线段求交的一般思想方法.

实现线段求交算法

求两条线段的交点,并是函数适应性更广

1)计算行列式:

若行列式=0,则两线段重合或平行,无交点,算法结束;

2)计算交点参数:

,则无交点,算法结束

3)计算交点

intxa,ya,xb,yb,xc,yc,xd,yd,x,y,color;

doublet1,t2,deater;

intdriver=DETECT;

%d"

xa);

ya);

xb);

yb);

xc);

yc);

xd);

yd);

line(xa,ya,xb,yb);

line(xc,yc,xd,yd);

deater=-(xb-xa)*(yd-yc)+(xd-xc)*(yb-ya);

if(deater==0)

zhixianpingxing"

}else

t1=((xc-xa)*(yc-yd)-(xc-xd)*(yc-ya))/deater;

t2=((xb-xa)*(yc-ya)-(xc-xa)*(yb-ya))/deater;

if(0<

t1&

t1<

1&

0<

t2&

t2<

1)

x=xa+t1*(xb-xa);

y=ya+t1*(yb-ya);

putpixel(x,y,4);

%d,%d"

x,y);

liangxianbuhuixiangjiao"

实验八点对简单多边形的包含

掌握包含判断一般思想方法.

实现点对简单多边形(五边形,自己定义顶点坐标)

编程实现点对五边形的包含检查算法。

1.算法思路

首先通过给出点的坐标画出五边形,然后:

1)[准备]

m=-1;

i=0;

2)[排除必不相交的情形]若下列条件有一个成立,则到4。

并且

;

并且;

3)[计算交点]

,分两种情况:

若y=

,则点P在多边形的边界上,算法结束;

若y<

则m=(-1).m;

4)[结束判断]i=i+1,若i<

n,则返回到2,否则算法结束,此时若m=-1则点P在多边形外部,m=1则在内部。

最后,从要判断的点,向下画直线,便于观察点在多边形内部,外部还是在边界上,并且同时输出英文句子,若再边界上则输出pointpisontheedgeofgraph若再内部则输出pointpisontheedgeofgraph,否则输出Pointpisinthegraph。

1.C程序代码

main()

intxx[10],yy[10],m,i,x0,y0,n,y;

n=4;

x0=600;

y0=400;

pleaseputthepoints\n"

n;

%d%d"

xx[i],&

yy[i]);

m=-1;

if(x0>

xx[i]&

x0>

=xx[i+1]||x0<

xx[i+1]||y0>

=yy[i]&

y0>

=yy[i+1])

y=yy[i]+(x0-xx[i])*(yy[i+1]-yy[i])/(xx[i+1]-xx[i]);

if(y==y0)

itisinthebound\n"

y0)

m=-1*m;

if(m==-1)

pisoutoftheduobianxing\n"

if(m==1)

pisintheduobianxing\n"

实验九Bezier曲线

掌握Bezier曲线的一般性质

实现Bezier曲线的描绘

实现Bezier曲线的画线算法

首先给定四个初始点,由公式可以得到计算n次Bezier曲线上控制点在t时的值P(t),可以归结为两个n-1次Bezier曲线在t时的线性组合。

t每增加一个步长,由递推计算关系可以得到一个对应的P(t)值,依次画出点(t,P(t)),则可以得到曲线

2.源程序:

voidbezier(intdegree,intnpoints,doublecoeff1[],doublecoeff2[])

doublet,delt;

inti;

delt=1.0/(double)npoints;

t=0.0;

=npoints;

decas(degree,coeff1,coeff2,t);

t+=delt;

decas(intdegree,doublecoeff1[],doublecoeff2[],doublet)

intr,i;

double*coeffa,coeffa10,coeffa20;

doublecoeffa1[5],coeffa2[5];

=degree;

coeffa1[i]=coeff1[i];

coeffa2[i]

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2