高手必读

wwwman 2000-07-16 07:11:00
高手,能给我推荐一下讲c语言的
图形部分库函数的书吗?
呜呜,太感动了!!
...全文
303 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameboy999 2000-11-25
  • 打赏
  • 举报
回复
可你的注释是c++风格的呀?!^_^
fleg 2000-11-25
  • 打赏
  • 举报
回复
lyzcom给我发一份!好吗?linqianchuan@263.net
元明 2000-07-20
  • 打赏
  • 举报
回复
很好!!lyzcom能否给我发一份!

magicwizard
magicwizard@km169.net
lyzcom 2000-07-17
  • 打赏
  • 举报
回复
另外,再去这个地址去找一本讲C语言图形的书就行了,把上面的函数当作C的自带图形函数用,可是通用的,因为函数格式和功能名字等都一样。
lyzcom 2000-07-17
  • 打赏
  • 举报
回复
/*************************************************************************
C语言内置的图形函数太差劲,我给这个函数库给你用吧。

这个函数库你可以直接全部复制下去用,不必再做任何修改.
它是特点可能就是速度快,在没有线性内存管理的情况下,在要考虑换页的情况下,这个
函数库的函数的速度算是比较可以的了.
如果你不知道怎么样使用,可是看看最后我给你写的TEST.CPP文件,你把它复制开,另外
保存为一个文件,比如test.cpp,然后用Borland C++进行编译,不定模式,可以是SMALL,
也可以是LARGE,等.

如果还是不知道怎么用,可以来问我,我的EM是:lyzcom@163.net
*************************************************************************/
#define VGA_VGABASE

#ifdef VGA_VGABASE
#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VGA640x480 0x101
#define VGA800x600 0x103
#define VGA1024x768 0x105
#define HI640x480 0x110
#define HI800x600 0x113
#define HI1024x768 0x113
#define RGB(R,G,B) ((R*30+G*59+B*11)/100)
#define G_SEGMENT 0a000h
#define setcolor(c) CUR_COLOR=c
#define TRUE 1
#define FALSE 0

#endif

static double SIN45=0.707106781186548;
unsigned gmode;
int CUR_PAGE=0,PAGEN;
int CUR_COLOR=15;
int SCANLENG,CUR_X,CUR_Y;
int SCREEN_WIDTH,SCREEN_HEIGHT;
int SVGAmodeNo;
unsigned Max_x=640,Max_y=480,Hi_Max_x=1280,vram=0,page;

struct type_1{
unsigned int offset;
int pageno;
};

union type_2 {
unsigned long addr;
type_1 O_P;
} dp;

union type_3 {
unsigned char far *ptr;
type_1 O_P;
} dptr={(unsigned char far *)0xa0000000}; //直接写屏指针

struct s1{
char *vesa;
char ver2,ver1;
char *oem;
char cap[4];
unsigned int *mode;
} VesaInfo; //VESA 信息

struct s2{
int attr;
char wina,winb;
int gran;
int size;
int aseg,bseg;
void far *funcptr;
int lineb;

int xr,yr;
char xcs,ycs;
char planes;
char bpp;
char banks;
char model;
char banksize;
} ModeInfo; //模式


void Select_Page(int); //换页
void getModeInfo(int); //读VESA模式信息
void getVesaInfo(); //读VESA信息
void line(int,int,int,int); //画线
void lineto(int,int); //以当前点为起点画线
void moveto(int,int); //移动当前点
void bar(int,int,int,int); //画矩形
void display_off(); //关闭屏幕
void display_on(); //打开屏幕
void cleardevice(); //清屏
void closegraph(void); //关闭图形方式,进入80*25的文本方式
void putpixel(int,int,int); //写点
unsigned getpixel(int,int); //读点
void put_byte(int x,int y,unsigned char byte,int color); //写一个字节
void scanline(int,int,int); //画扫描线,这个函数单独使用基本上没有意义
void rectangle(int,int,int,int);//画空心矩形
void rectangle1(int,int,int,int);//也是画空心矩形,不过在同时画很多个的时候可能速度要快那么一点点
void circle(int,int,int); //画圆
void ellipse(int,int,int,int,int);//画椭圆
int scanlinesize(int x1,int x2); //计算线宽(单独使用无意义)
void getscanline(int x1,int y,int n,void huge *buf); //同上(单独使用无意义)
void putscanline(int x1,int y,int n,void huge *buf); //同上(单独使用无意义)
long imagesize(int x1,int y1,int m,int n); //(单独使用无意义)
void putimage(int x1,int y1,int m,int n,void huge *buf); //恢复屏幕
void savedac(int dacno,int num,unsigned char huge *addr); //记录DAC表
void restoredac(int dacno,int num,unsigned char huge *addr); //愎恢DAC表
void covert_pal(unsigned char (*dac)[3],unsigned char *covert); //色度转换

void getModeInfo(int modeNo)
{
_ES=FP_SEG(&ModeInfo);
_DI=FP_OFF(&ModeInfo);
_CX=modeNo;
_AX=0x4f01;
geninterrupt(0x10);
}

void getVesaInfo()
{
_ES=FP_SEG(&VesaInfo);
_DI=FP_OFF(&VesaInfo);
_AX=0x4f00;
geninterrupt(0x10);
if(_AX!=0x004f)
{
printf("\nYour display card don't support VESA BIOS\n");
exit(0);
}
}

int initgraph(int mode)
{
union REGS inregs;
CUR_COLOR=15;
int OK=1;
SVGAmodeNo=mode;
gmode=mode;
if(SVGAmodeNo>=0x100)
{
getVesaInfo();
getModeInfo(SVGAmodeNo);
SCANLENG=ModeInfo.lineb;
SCREEN_WIDTH=ModeInfo.xr;
SCREEN_HEIGHT=ModeInfo.yr;
PAGEN=(long)ModeInfo.lineb*(long)ModeInfo.yr/64000l+1;
inregs.x.bx=SVGAmodeNo;
inregs.x.ax=0x4f02;
int86(0x10,&inregs,&inregs);
if(inregs.x.ax!=0x004f)
OK=0;
}
else if(SVGAmodeNo>=0)
{
SCANLENG=320;
SCREEN_WIDTH=320;
SCREEN_HEIGHT=200;
PAGEN=1;
inregs.x.ax=SVGAmodeNo;
int86(0x10,&inregs,&inregs);
}
if(PAGEN>0)
Select_Page(0);
return(OK);
}

void display_off(void)
{
asm {
mov bl,36h
mov ax,1201h
int 10h
}
}

void display_on(void)
{
asm {
mov bl,36h
mov ax,1200h
int 10h
}
}

void Select_Page(int page)
{
asm {
mov bx,0
mov dx,page
mov ax,4f05h
int 10h
}
CUR_PAGE=page;
}

void putpixel(int x,int y,int fcolor)
{
type_2 p;
unsigned char far *ptr;
p.addr=y;
p.addr=p.addr*Max_x+x;
if (page!=p.O_P.pageno)
{
page=p.O_P.pageno;
asm {
mov dx,page
mov bx,0
mov ax,0x4f05
int 0x10
}
}
ptr=(unsigned char far *)(0xa0000000+p.O_P.offset);
*ptr=fcolor;
}

unsigned getpixel(int x,int y)
{
type_2 p;
unsigned char far *ptr;
p.addr=y;
p.addr=p.addr*Max_x+x;
if (page!=p.O_P.pageno)
{
page=p.O_P.pageno;
asm {
mov dx,page
mov bx,0
mov ax,0x4f05
int 0x10
}
}
ptr=(unsigned char far *)(0xa0000000+p.O_P.offset);
return(*ptr);
}

void cleardevice()
{
union REGS r;
r.x.bx=gmode;
r.x.ax=0x4f02;
int86(0x10,&r,&r);
}

void closegraph(void)
{
union REGS inregs;
inregs.x.ax=0x0003;
int86(0x10,&inregs,&inregs);
}

void put_byte(int x,int y,unsigned char byte,int color)
{
register i;
for(i=0;i<8;i++)
if(byte<<i&0x80) putpixel(x+i,y,color);
}

void scanline(int x1,int x2,int y)
{
int scanleng=SCANLENG;
int cur_page=CUR_PAGE;
unsigned char color=CUR_COLOR;
asm {
mov ax,x2
sub ax,x1
jnc jemp1
not ax
inc ax
mov bx,x2
mov x1,bx
}
jemp1:
asm {
push ax
mov ax,y
mul scanleng
add ax,x1
jnc jemp2
inc dx
}
jemp2:
asm {
mov di,ax
cmp dx,cur_page
je jemp3
mov cur_page,dx
}
Select_Page(cur_page);
jemp3:
asm {
mov ax,0a000h
mov es,ax
mov ax,di
pop cx
add ax,cx
jc jemp4
inc cx
mov al,color
cld
rep stosb
jmp end
}
jemp4:
asm {
push ax
sub cx,ax
mov al,color
cld
rep stosb
inc cur_page
}
Select_Page(cur_page);
asm {
mov ax,0a000h
mov es,ax
pop cx
inc cx
mov di,0h
mov al,color
cld
rep stosb
}
end:
}

void line(int x1,int y1,int x2,int y2)
{
register int t,distance;
int xerr=0,yerr=0,delta_x,delta_y;
int incx,incy;
delta_x=x2-x1;
delta_y=y2-y1;
if (delta_x>0) incx=1;
else
if (delta_x==0) incx=0;
else
incx=-1;
if (delta_y>0) incy=1;
else
if(delta_y==0) incy=0;
else
incy=-1;
delta_x=abs(delta_x);
delta_y=abs(delta_y);
if (delta_x>delta_y) distance=delta_x;
else distance=delta_y;
dp.addr=y1;
dp.addr=dp.addr*Max_x+x1; y2=incy*Max_x;
for (t=0;t<=distance+1;t++)
{
if (dp.O_P.pageno!=page)
{
page=dp.O_P.pageno;
asm {
mov dx,page
mov bx,0
mov ax,0x4f05
int 0x10
}
}
dptr.O_P.offset=dp.O_P.offset;
*dptr.ptr=CUR_COLOR;
xerr+=delta_x; yerr+=delta_y;
if (xerr>distance) {xerr-=distance; x1+=incx; dp.addr+=incx;}
if (yerr>distance) {yerr-=distance; y1+=incy; dp.addr+=y2;}
}
}

void lineto(int x,int y)
{
line(CUR_X,CUR_Y,x,y);
}

void moveto(int x,int y)
{
CUR_X=x;CUR_Y=y;
}

void rectangle(int x1,int y1,int x2,int y2)
{
line(x1,y1,x2,y1);
line(x2,y1,x2,y2);
line(x1,y2,x2,y2);
line(x1,y1,x1,y2);
}

void rectangle1(int x1,int y1,int x2,int y2)
{
unsigned w=x2-x1+1,h=y2-y1+1;
int sx1=x1,sx2=x2,sy1=y1,sy2=y2;
register i;
for(i=0;i<w;i+=2)
{
putpixel(sx1,sy1,CUR_COLOR);
putpixel(sx1,sy2,CUR_COLOR);
sx1+=2;
}
sx1=x1;
for(i=0;i<h;i+=2)
{
putpixel(sx1,sy1,CUR_COLOR);
putpixel(sx2,sy1,CUR_COLOR);
sy1+=2;
}
sy1=y1;
}
//画圆函数
void circle(int x0,int y0,int r)
{
int i;
long tn;
int x,y;
int xmax;

y=r; x=0;
xmax=(double)r*SIN45;
tn=(1-r*2);
while(x<=xmax) {
if(tn>=0)
{
tn += ( 6 + ((x-y)<<2) );
y--;
}
else
tn += ( (x<<2) + 2 );
putpixel(x0+y,y0+x,CUR_COLOR); /* 7 */
putpixel(x0+x,y0+y,CUR_COLOR); /* 6 */
putpixel(x0-x,y0+y,CUR_COLOR); /* 5 */
putpixel(x0-y,y0+x,CUR_COLOR); /* 4 */
putpixel(x0-y,y0-x,CUR_COLOR); /* 3 */
putpixel(x0-x,y0-y,CUR_COLOR); /* 2 */
putpixel(x0+x,y0-y,CUR_COLOR); /* 1 */
putpixel(x0+y,y0-x,CUR_COLOR); /* 0 */
x++;
}
putpixel(x0+y,y0+x,CUR_COLOR); /* 7 */
putpixel(x0+x,y0+y,CUR_COLOR); /* 6 */
putpixel(x0-x,y0+y,CUR_COLOR); /* 5 */
putpixel(x0-y,y0+x,CUR_COLOR); /* 4 */
putpixel(x0-y,y0-x,CUR_COLOR); /* 3 */
putpixel(x0-x,y0-y,CUR_COLOR); /* 2 */
putpixel(x0+x,y0-y,CUR_COLOR); /* 1 */
putpixel(x0+y,y0-x,CUR_COLOR); /* 0 */
}

void ellipse(int x0,int y0,long r1,long r2)
{
long r,r12,r22;
int x,y,xmax;
long tn;

x=0;y=r2;
r12=r1*r1;r22=r2*r2;
xmax=(double)r12/sqrt(r12+r22);
tn=r12-2*r2*r12;
while(x<=xmax) {
if(tn<0||y==0)
tn+=(4*x+2)*r22;
else
{
tn+=(4*x+2)*r22+(1-y)*4*r12;
y--;
}
putpixel(x0+x,y0+y,CUR_COLOR);
putpixel(x0-x,y0+y,CUR_COLOR);
putpixel(x0+x,y0-y,CUR_COLOR);
putpixel(x0-x,y0-y,CUR_COLOR);
x++;
}
putpixel(x0+x,y0+y,CUR_COLOR);
putpixel(x0-x,y0+y,CUR_COLOR);
putpixel(x0+x,y0-y,CUR_COLOR);
putpixel(x0-x,y0-y,CUR_COLOR);

r=r1;r1=r2;r2=r;
x=0;y=r2;
r12=r1*r1;r22=r2*r2;
xmax=r12/sqrt(r12+r22);
tn=r12-2*r2*r12;
while(x<=xmax) {
if(tn<0||y==0)
tn+=(4*x+2)*r22;
else
{
tn+=(4*x+2)*r22+(1-y)*4*r12;
y--;
}
putpixel(x0+y,y0+x,CUR_COLOR);
putpixel(x0+y,y0-x,CUR_COLOR);
putpixel(x0-y,y0+x,CUR_COLOR);
putpixel(x0-y,y0-x,CUR_COLOR);
x++;
}
putpixel(x0+y,y0+x,CUR_COLOR);
putpixel(x0+y,y0-x,CUR_COLOR);
putpixel(x0-y,y0+x,CUR_COLOR);
putpixel(x0-y,y0-x,CUR_COLOR);
}

void bar(int x1,int y1,int x2,int y2)
{
int s,i;
if(x1>x2) { s=x2; x2=x1; x1=s; }
if(y1>y2) { s=y2; y2=y1; y1=s; }
for(i=y1;i<=y2;i++)
scanline(x1,x2,i);
}

int scanlinesize(int x1,int x2)
{
int k;
if(x1>x2)
{ k=x1; x1=x2; x2=k; }
k=x2-x1+1;
if( (k&0x0001) )
k++;
return(k);
}

void getscanline(int x1,int y,int n,void huge *buf)
{
int scanleng=SCANLENG;
int cur_page=CUR_PAGE;
int k1,k2;
asm {
mov ax,y
mul scanleng
add ax,x1
jnc jemp1
inc dx
}
jemp1:
asm {
mov si,ax
cmp dx,cur_page
je jemp2
mov cur_page,dx
}
Select_Page(cur_page);
jemp2:
asm {
mov ax,si
mov cx,n
dec cx
add ax,cx
jc jemp3
push ds
inc cx
les di,buf
mov ax,0a000h
mov ds,ax
cld
rep movsb
pop ds
jmp end
}
jemp3:
asm {
push ds
mov k1,ax
sub cx,ax
les di,buf
mov ax,0a000h
mov ds,ax
cld
rep movsb
mov k2,di
pop ds
inc cur_page
}
Select_Page(cur_page);
asm {
push ds
mov cx,k1
inc cx
les di,buf
mov di,k2
mov ax,0a000h
mov ds,ax
mov si,0h
cld
rep movsb
pop ds
}
end:;
}

void putscanline(int x1,int y,int n,void huge *buf)
{
int scanleng=SCANLENG;
int cur_page=CUR_PAGE;
int k1,k2;
asm {
mov ax,y
mul scanleng
add ax,x1
jnc jemp1
inc dx
}
jemp1:
asm {
mov di,ax
cmp dx,cur_page
je jemp2
mov cur_page,dx
}
Select_Page(cur_page);
jemp2:
asm {
mov ax,di
mov cx,n
dec cx
add ax,cx
jc jemp3
push ds
inc cx
mov ax,0a000h
mov es,ax
lds si,buf
cld
rep movsb
pop ds
jmp end
}
jemp3:
asm {
push ds
mov k1,ax
sub cx,ax
mov ax,0a000h
mov es,ax
lds si,buf
cld
rep movsb
mov k2,si
pop ds
inc cur_page
}
Select_Page(cur_page);
asm {
push ds
mov cx,k1
inc cx
mov ax,0a000h
mov es,ax
mov di,0h
lds si,buf
mov si,k2
cld
rep movsb
pop ds
}
end:;
}

long imagesize(int x1,int y1,int m,int n)
{
long size;
int k,y2=y1+n,x2=x1+m;
if(y1>y2)
{ k=y1; y1=y2; y2=k; }
size=(long)scanlinesize(x1,x2)*((long)y2-(long)y1+1L);
return(size);
}

void getimage(int x1,int y1,int m,int n,void huge *buf)
{
char huge *cp;
int xn,ssize,i,x2=x1+m,y2=y1+n;

cp=(char huge *)buf;
ssize=scanlinesize(x1,x2);
xn=x2-x1+1;
for(i=y1;i<=y2;i++)
{
getscanline(x1,i,xn,cp);
cp += ssize;
}
}

void putimage(int x1,int y1,int xn,int yn,void huge *buf)
{
int ssize,i;//xn=x1+m,yn=y1+n;
char huge *cp;

cp=(char huge *)buf;
ssize=scanlinesize(x1,x1+xn);
if(x1+xn>639) xn=xn-(x1+xn-639);
xn=xn+1;
yn=yn+1;
for(i=0;i<yn;i++)
{
putscanline(x1,y1+i,xn,cp);
cp += ssize;
}
}

void savedac(int dacno,int num,unsigned char huge *addr)
{
unsigned vseg,voff;
vseg=FP_SEG(addr);
voff=FP_OFF(addr);
asm {
push es
mov ax,0x1017
mov bx,dacno
mov cx,num
mov es,vseg
mov dx,voff
int 0x10
pop es
}
}

void restoredac(int dacno,int num,unsigned char huge *addr)
{
unsigned vseg,voff;
vseg=FP_SEG(addr);
voff=FP_OFF(addr);
asm {
push es
mov ax,0x1012
mov bx,dacno
mov cx,num
mov es,vseg
mov dx,voff
int 0x10
pop es
}
}

void covert_pal(unsigned char (*dac)[3],unsigned char *covert)
{
int i,j,k,n,num,s,search,con[16][2],t=0;
long com[16],sum;
for (i=0;i<16;i++) com[i]=0xffffff;
for (i=0;i<255+16;i++)
for (j=i+1;(j>15) && (j<256+16);j++)
{
sum=0;
for (k=0;k<3;k++)
{
int tmp=dac[i][k]; tmp-=dac[j][k]; tmp*=tmp; sum+=tmp;
}
n=0;
for (k=1;k<16;k++) if (com[n]<com[k]) n=k;
if ((sum<com[n]))
{
for (k=0;k<16;k++) if (con[k][1]==j) break;
if(k==16)
{
com[n]=sum; con[n][0]=i; con[n][1]=j;
}
else
{
if (sum<com[k] && com[k]==0xffffff)
com[k]=sum; con[k][0]=i;
}
}
}
s=16; num=0;
for (i=0;i<256;i++)
{
n=0; search=i+16; t=1;
do
{
if (con[n][1]==search) {search=con[n][0]; n=0; t=0;}
else n++;
}
while (n<16);
if (t)
{
for (k=0;k<3;k++) dac[s][k]=dac[search][k];
for (k=0;k<16;k++)
{
if (con[k][1]==search) con[k][1]=s;
if (con[k][0]==search) con[k][0]=s;
}
search=s++;
}
covert[num++]=search;
}
}


//下面这些代码另外保存一个文件!上面的代码最好保存为svga.h,那么你就不要做
//任何修改
#include <bios.h>
#include <malloc.h>
#include <conio.h>
#include "svga.h"

#define getkey(); if((key.i=bioskey(1))>0) key.i=bioskey(0);

union KB
{char ch[2];int i;} key;

void huge *image1,*image2;

void main()
{
if(!initgraph(VGA640x480))
{
closegraph();
puts("You Displaycard can't support VESA");
exit(0);
}
randomize(); //初始化随机数产生器
while(1)
{
getkey();
if(key.ch[0]||key.ch[1]) break;
putpixel(random(640),random(480),random(256));//随机写点
}
cleardevice();
while(1)
{
getkey();
if(key.ch[0]||key.ch[1]) break;
setcolor(random(256)); //随机取色(设置画出的线的颜色)
line(320,200,random(640),random(640)); //随机画线
}
cleardevice();
while(1)
{
getkey();
if(key.ch[0]||key.ch[1]) break;
setcolor(random(256));
bar(random(640),random(480),random(640),random(480)); //随机画矩形
}
cleardevice();
while(1)
{
getkey();
if(key.ch[0]||key.ch[1]) break;
setcolor(random(256));
if(random(50)&1) circle(random(640),random(480),random(320));//随机画圆
else ellipse(random(640),random(480),random(320),random(200));//随机画椭圆
}
cleardevice();
setcolor(15);bar(0,0,640,480);
image1=farmalloc(imagesize(0,0,100,100)); //为矩形象素分配内存
getimage(0,0,100,100,image1); //读取指定范围内的图象
setcolor(1);bar(0,0,100,100); //画一个矩形
image2=farmalloc(imagesize(0,0,100,100));
getimage(0,0,100,100,image2);//将矩形读入内存,当然这个矩形只是一个代表,读入的可以是任何的图象
getch();
putimage(100,100,100,100,image2);
putimage(0,0,100,100,image1);
farfree(image1);farfree(image2);
getch();
closegraph();
}
SCUM 2000-07-17
  • 打赏
  • 举报
回复
机械工业出版社有一本《C 语言图形设计》,深入浅出,20元左右。
是一本好书。
net_worm 2000-07-16
  • 打赏
  • 举报
回复
《C高级编程》天津大学某教授编(给忘了,书又不在身边)
是清华出版,价钱也便宜,大约30几吧。

比较难,如果是初学,不易看懂。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧