c语言图形库画点,自己写的一个图形库,有点问题.来请教大家了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值