该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "stdio.h"
#include "dos.h"
#include "math.h"
#define VGA256 0x13
#define TEXT 0x03
#define PI 3.14159
#define MAXWIDTH 320
#define MAXHEIGHT 200
/*************Set_Video_Mode************/
void setvideomode(int mode)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=(unsigned char)mode;
int86(0x10,&inregs,&outregs);
}
/******printdot 打印点******/
printdot(int x,int y,unsigned char color)
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
if(x
viewstart[y*MAXWIDTH+x]=color;
}
/******getdot 读取点******/
unsigned char getdot(int x,int y)
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
return (unsigned char)viewstart[y*MAXWIDTH+x];
}
/******clearscreen 清屏******/
clearscreen(unsigned char color)
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
unsigned int i,j;
for(i=0;i
for(j=0;j
viewstart[MAXWIDTH*j+i]=color;
}
/******clearzone 清除区域******/
clearzone(int x1,int y1,int x2,int y2,unsigned char color)
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
int i,j,t;
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
viewstart[j*MAXWIDTH+i]=color;
}
/*******printline 打印直线*******/
printline(int x1,int y1,int x2,int y2,unsigned char color)
{
int i,j,dx,dy,x,y,a=0;
int incx,incy;
x=x1;y=y1;
dx=x2-x1;
if(dx>0)
incx=1;
else
{ dx=-dx; incx=-1; }
dy=y2-y1;
if(dy>0)
incy=1;
else
{ dy=-dy; incy=-1; }
printdot(x1,y1,color); /*在线的第一个位置上画点*/
printdot(x2,y2,color); /*在线的最后
一个位置上画点*/
if(dx>dy) /*趋近于横线*/
{
for(i=0;i
{
printdot(x,y,color);
x=x+incx;
a=a+dy;
if(a>dx)
{
a=a-dx;
y=y+incy;
}
}
}
else /*趋近于竖线*/
{
for(i=0;i
{
printdot(x,y,color);
y=y+incy;
a=a+dx;
if(a>dy)
{
a=a-dy;
x=x+incx;
}
}
}
}
/*********Printrectangle 打印矩形************/
printrectangle(int x1,int y1,int x2,int y2,int color)
{
printline(x1,y1,x1,y2,color);
printline(x1,y1,x2,y1,color);
printline(x2,y2,x1,y2,color);
printline(x2,y2,x2,y1,color);
}
/******* printCircle 打印圆******/
printcircle(int x,int y,int r,unsigned char color,int n)
{
/*r为半径
n为圆分成多少分*/
int i;
float incr;
int x1,x2,y1,y2;
x1=x2=x+r; /*初始点*/
y1=y2=y;
incr=PI/n*2;
for(i=1;i<=n;i++)
{
x2=x+cos(
i*incr)*r;
y2=y+sin(i*incr)*r;
printline(x1,y1,x2,y2,color);
x1=x2;
y1=y2;
}
printline(x1,y1,x+r,y,color);
}
/******printellipse打印椭圆************/
printellipse(int x,int y,int R,int r,unsigned char color,int n)
{
/*r为半径
n为随圆分成多少分*/
int i;
float incr;
int x1,x2,y1,y2;
x1=x2=x+R; /*初始点*/
y1=y2=y;
incr=PI/n*2;
for(i=1;i<=n;i++)
{
x2=x+cos(i*incr)*R;
y2=y+sin(i*incr)*r;
printline(x1,y1,x2,y2,color);
x1=x2;
y1=y2;
}
printline(x1,y1,x+R,y,color);
}
/***************fillzone 填充区域***************/
fillzone(int x,int y,unsigned char color,unsigned char ordercolor)
{
if(x=0&&y>=0) /*范围检测*/
{ printdot(x,y,color);
delay(1000);
if((getdot(x-1,y)!=ordercolor)&&(getdot(x-1,y)!=color)) fillzone(x-1,y,color,ordercolor);
if((getdot(x+1,y)!=ordercolor)&&(getdot(x+1,y)!=color)) fillzone(x+1,y,color,ordercolor);/*将这一行删除,就不会出界,但只有一半*/
if((getdot(x,y-1)!=ordercolor)&&(getdot(x,y-1)!=color)) fillzone(x,y-1,color,ordercolor);
if((getdot(x,y+1)!=ordercolor)&&(getdot(x,y+1)!=color)) fillzone(x,y+1,color,ordercolor);
}
}
/***********saveimage 保存区域**************/
saveimage(int x,int y,int width,int height,char *buffer) /*这个函数也似乎有问题*/
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
int i,j;
unsigned int p=0;
for(i=0;i
for(j=0;j
{ buffer[p]=(unsigned char)viewstart[(y+i)*MAXWIDTH+j+x]; p++;}
}
/***********printimage 打印区域**************/
printimage(int x,int y,int width,int height,char *buffer)/*这个函数也似乎有问题*/
{
unsigned char far *viewstart=(unsigned char far *)0xA0000000L;
int i,j;
unsigned int p=0;
for(i=0;i
for(j=0;j
{ viewstart[(y+i)*MAXWIDTH+j+x]=(unsigned char)buffer[p]; p++;}
}
/**********Main***********/
main()
{
int i,j;
setvideomode(VGA256);
printellipse(100,100,100,50,45,22);
printcircle(100,100,100,10,22);
printrectangle(10,10,200,80,2);
getch();
fillzone(100,55,5,2); /*有问题*/
getch();
setvideomode(TEXT);
}