if(d1<=0){
d1+=b*b*(2*x+3);
x++;
}
else{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;y--;
}
putpixel(x+100,y+100,color);putpixel(-x+100,-y+100,color);
putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);
}
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>0){
if(d2<=0){
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;y--;
}
else{
d2+=a*a*(-2*y+3);
y--;
}
putpixel(x+100,y+100,color);putpixel(-x+100,-y+100,color);
putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);
}
}
main()
{
intgdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:
\\tc20\\bgi");
MidBresenhamEllipse(8,6,2);
getch();
closegraph();
}
实验截图:
实验3图形填充
实验目的
4、通过实验,进一步理解和掌握图形填充常用算法;
5、掌握以上算法进行填充图形的基本过程;
6、通过编程,会在TC环境下完成图形填充。
实验环境
计算机、TurboC或其他C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
任意画一个多边形,并用边填充算法进行填充。
(多边形的顶点坐标存放在数组中,坐标值由键盘输入)
实验步骤
1、算法、原理清晰,有详细的设计步骤;
2、依据算法、步骤或程序流程图,用C语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、打印源程序或把源程序以文件的形式提交;
7、按格式书写实验报告。
实验代码:
#include
#include
#include
#include
#defineMP100
#include
#definefalse0
voidedge_mark(intarr[][2],intvalue,intpolydeflen)
{
intby,x,y,ax,ay;
inti,j;
floatk;
by=arr[polydeflen-1][1];
for(i=0;i{
if(i==polydeflen-1)
{
ax=arr[0][0];
ay=arr[0][1];
}
else
{
ax=arr[i+1][0];
ay=arr[i+1][1];
}
x=arr[i][0];
y=arr[i][1];
if((y-ay)!
=0)
k=(ax-x)/(float)(y-ay);
if((y-by)*(ay-y)>=0)
putpixel(x,y,value);
getch();
if(ayfor(j=y-1;j>ay;j--)
putpixel(x+(int)((y-j)*k),j,value);
elsefor(j=y+1;jputpixel(x-(int)((j-y)*k),j,value);
by=y;
}
}
voidedge_mark_fill(intar[][2],intvalue,intpolydeflen)
{
inti,x,y,inside;
intmin,max;
inside=false;
min=ar[0][1];max=ar[0][1];
edge_mark(ar,value,polydeflen);
for(i=1;i{
if(ar[i][1]>max)
max=ar[i][1];
if(ar[i][1]min=ar[i][1];
}
for(y=min;y<=max;y++)
{
for(x=0;x<=640;x++)
{
if(getpixel(x,y)==value)
inside=!
(inside);
if(inside!
=false)
putpixel(x,y,value);
elseputpixel(x,y,0);
}
if(getch()==17)
exit
(1);
}
}
voidmain()
{
chart[100];
intpolydef[MP][2];
inti,j,gdriver,gmode,polydeflen,value;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:
\\tc20\\bgi");
printf("pleaseinputthenumberofedges:
\n");
scanf("%d",&polydeflen);
printf("pleaseinputthecolor:
\n");
scanf("%d",&value);
printf("pleaseinputthe(x,y):
\n");
for(i=0;ifor(j=0;j<2;j++)
scanf("%d",&polydef[i][j]);
printf("pleasepressthespacekey!
");
edge_mark_fill(polydef,value,polydeflen);
for(i=0;i{
sprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]);
outtextxy(polydef[i][0],polydef[i][1],t);
}
getch();
closegraph();
}
实验截图:
实验4二维图形几何变换
实验目的
1、通过实验,进一步理解和掌握二维图形几何变换算法;
2、掌握以上算法进行二维图形几何变换基本过程;
3、通过编程,会在TC环境下完成二维图形几何变换过程。
实验环境
计算机、TurboC或其他C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
任意画一个平面图形,
(1)按比例缩小或放大.缩放比例由用户定义,缩放的参考点由用户确定;
(2)旋转.由键盘输入旋转角度和旋转中心。
实验步骤
1、算法、原理清晰,有详细的设计步骤;
2、依据算法、步骤或程序流程图,用C语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、打印源程序或把源程序以文件的形式提交;
7、按格式书写实验报告。
实验代码:
#include"stdio.h"
#include"conio.h"
#include"graphics.h"
#include"math.h"
structpoint
{
intx;
inty;
}triangle[3];
voidini()
{triangle[0].x=30;
triangle[0].y=30;
triangle[1].x=30;
triangle[1].y=120;
triangle[2].x=120;
triangle[2].y=70;
setcolor(RED);
line(triangle[0].x,triangle[0].y,triangle[1].x,triangle[1].y);
line(triangle[0].x,triangle[0].y,triangle[2].x,triangle[2].y);
line(triangle[1].x,triangle[1].y,triangle[2].x,triangle[2].y);
}
voidzoom(floatsx,floatsy)
{
intxx[3];
intyy[3];
inti;
for(i=0;i<3;i++)
{
xx[i]=(triangle[i].x-triangle[0].x)*sx+triangle[0].x;
yy[i]=(triangle[i].y-triangle[0].y)*sy+triangle[0].y;
}
for(i=0;i<3;i++)
{
line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]);
}
getch();
setcolor(5);
for(i=0;i<3;i++)
{
line(xx[i]+120,yy[i],xx[(i+1)%3]+120,yy[(i+1)%3]);
}
}
voidturn(intx,inty,inta)
{
inti;
intxx[3];
intyy[3];
for(i=0;i<3;i++){
xx[i]=(triangle[i].x-x)*cos(a)-(triangle[i].y-y)*sin(a)+x;
yy[i]=(triangle[i].x-x)*sin(a)+(triangle[i].y-y)*cos(a)+y;
}
for(i=0;i<3;i++)
{
line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]);
}
getch();
setcolor(5);
for(i=0;i<3;i++)
{
line(xx[i],yy[i],xx[(i+1)%3],yy[(i+1)%3]);
}
}
voidmain()
{
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"c:
\\tc20\\bgi");
ini();
getch();
setcolor(0);
turn(120,70,-1);
ini();
getch();
setcolor(0);
zoom(0.5,0.5);
ini();
getch();
setcolor(0);
zoom(3,3);
ini();
getch();
closegraph();
}
实验截图:
实验5二维图形裁剪
实验目的
1、通过实验,进一步理解和掌握二维图形裁剪常用算法;
2、掌握以上算法进行二维图形裁剪的基本过程;
3、通过编程,会在TC环境下完成二维图形裁剪过程。
实验环境
计算机、TurboC或其他C语言程序设计环境
实验学时
2学时,必做实验。
实验内容
生成若干条直线段,由用户确定一个矩形裁剪窗口的位置和大小,保留窗口里的图形,抹去其余部分(使用Cohen-Sutherland算法)。
(完成作业的同学可以用line、setviewport函数再做该题)。
实验步骤
1、算法、原理清晰,有详细的设计步骤;
2、依据算法、步骤或程序流程图,用C语言编写源程序;
3、编辑源程序并进行调试;
4、进行运行测试,并结合情况进行调整;
5、对运行结果进行保存与分析;
6、打印源程序或把源程序以文件的形式提交;
7、按格式书写实验报告。
实验代码:
#include"graphics.h"
#include"stdio.h"
#include"math.h"
#defineLEFT1
#defineRIGHT2
#defineBOTTOM4
#defineTOP8
intx1=60,y1=60,x2=200,y2=200,x3=200,y3=300,xl=30,xr=100,yb=100,yt=20;
intencode(intx,inty,int*code)
{
intc;
c=0;
if(xc=LEFT;
elseif(x>xr)
c=RIGHT;
if(y>yb)
c=BOTTOM;
elseif(yc=TOP;
if(x==xl||x==xr||y==yt||y==yb)
c=0;
*code=c;
}
C_S_LINECLIP(x1,y1,x2,y2,x3,y3,xl,xr,yb,yt)
{
intx,y,code1,code2,code3,code;
encode(x1,y1,&code1);
encode(x2,y2,&code2);
encode(x3,y3,&code3);
while(code1!
=0||code2!
=0)
{
if(code1&code2!
=0)
return;
code=code1;
if(code1==0)
code=code2;
if((LEFT&code)!
=0)
{
x=x1;
y=y1+(long)(y2-y1)*(xl-x1)/(x2-x1);
}
elseif((RIGHT&code)!
=0)
{
x=xr;
y=y1+(long)(y2-y1)*(xr-x1/x2-x1);
}
elseif((BOTTOM&code)!
=0)
{
y=yb;
x=x1+(long)(x2-x1)*(yb-y1)/(y2-y1);
}
elseif((TOP&code)!
=0)
{
y=yt;
x=x1+(long)(x2-x1)*(yt-y1)/(y2-y1);
}
if(code==code1)
{x1=x;
y1=y;
encode(x,y,&code1);
}
else
{x2=x;
y2=y;
encode(x,y,&code2);
}
}
while(code1!
=0||code3!
=0)
{
if(code1&code3!
=0)
return;
code=code1;
if(code1==0)
code=code3;
if((LEFT&code)!
=0)
{
x=x1;
y=y1+(long)(y3-y1)*(xl-x1)/(x3-x1);
}
elseif((RIGHT&code)!
=0)
{
x=xr;
y=y1+(long)(y3-y1)*(xr-x1/x3-x1);
}
elseif((BOTTOM&code)!
=0)
{
y=yb;
x=x1+(long)(x3-x1)*(yb-y1)/(y3-y1);
}
elseif((TOP&code)!
=0)
{
y=yt;
x=x1+(long)(x3-x1)*(yt-y1)/(y3-y1);
}
if(code==code1)
{x1=x;
y1=y;
encode(x,y,&code1);
}
else
{x3=x;
y3=y;
encode(x,y,&code3);
}
}
while(code3!
=0||code2!
=0)
{
if(code3&code2!
=0)
return;
code=code3;
if(code3==0)
code=code2;
if((LEFT&code)!
=0)
{
x=x3