⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph.h

📁 一个在C语言环境中运行的贝塞尔曲线.rar
💻 H
字号:
#if !defined graphheadfile 
#define graphheadfile 
/***************************************************************/ 

#include <graphics.h> 
#include <conio.h> 
#include <math.h> 
#include <dos.h>/*调用函数:int86()'注:中断'鼠标操作时用*/ 
union REGS regs;/*鼠标操作时用*/ 
int color[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
void*mimage; 
/***************************************************************/ 
void arrowhead(int x,int y);/*箭头*/ 
void buttonup(int sx,int sy,int mx,int my);/*绘制按钮(抬起)*/ 
void buttondn(int sx,int sy,int mx,int my);/*绘制按钮(按下)*/ 
void clbutton(int sx,int sy,int mx,int my);/*清除在点(sx,sy),(mx,my)之间矩形区域内的按钮*/ 
void clwinrect(int sx,int sy,int mx,int my);/*清除在点(sx,sy),(mx,my)之间矩形区域内的windows框*/ 
void initm(int xmi,int ymi,int xma,int yma);/*初始化设定鼠标移动范围*/ 
void loadmimage(int x,int y); 
void menupad(int sx,int sy,int mx,int my,int type);/*绘制菜单面板type 0:无标题栏;type 1:有标题栏*/ 
int messagebox(int x0,int y0,int x1,int y1,char*message);/*消息提示框*/ 
void movem(int x,int y);/*手动移动鼠标*/ 
void opbar(int x0,int y0,int x1,int y1);/*反色方条*/ 
void oppixel(int x,int y);/*在(x,y)处绘制反色点*/ 
void opline(int x0,int y0,int x1,int y1);/*绘制反色线(包含oppixel)*/ 
void oprect(int x0,int y0,int x1,int y1);/*反色矩形*/ 
void putmimage(int x,int y); 
void putnumxy(int x,int y,float num,int type);/*在屏幕上打印数字*/ 
void readm(int*x,int*y,int*button);/*读取鼠标状态*/ 
void winrect(int sx,int sy,int mx,int my);/*在点(sx,sy),(mx,my)之间的矩形区域,添加一个模拟Windows的框*/ 
/***************************************************************/ 
/* 格式:s e t c o l o r < >< 红> < 绿> < 蓝> */ 
#include<dos.h> 
#include<stdlib.h> 
#include<stdio.h> 
void setregscolor(int colornum,int read0,int green0,int blue0) 
{ 
union REGS r; 
int num[]={0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63}; 
outportb(0x3c8,num[colornum%16]) ; 
outportb(0x3c9,read0) ; 
outportb(0x3c9,green0) ; 
outportb(0x3c9,blue0) ; 
} 




void oparrowhead(int x,int y)/*反色箭头*/ 
{ 
opline(x,y,x+10,y+10); 
opline(x+10,y+10,x+5,y+10); 
opline(x+6,y+11,x+9,y+18); 
opline(x+6,y+17,x+3,y+11); 
opline(x+3,y+12,x,y+15); 
opline(x,y+15,x,y); 
oppixel(x+7,y+18); 
} 
void arrowhead(int x,int y)/*箭头*/ 
{ 
int n; 
setcolor(15); 
setlinestyle(0,0,1); 
for(n=1;n<10;n++) 
line(x+n,y+n,x+n,y+9); 
for(n=12;n>9;n--) 
line(x+13-n,y+n,x+13-n,y+9); 
line(x+7,y+16,x+4,y+10); 
line(x+6,y+16,x+3,y+10); 
setcolor(0); 
line(x,y,x+10,y+10); 
line(x+10,y+10,x+5,y+10); 
line(x+8,y+16,x+5,y+10); 
line(x+6,y+17,x+3,y+11); 
line(x+3,y+11,x,y+14); 
line(x,y+14,x,y); 
line(x+7,y+17,x+8,y+17); 
} 
/*-------------------------------------------------------------*/ 
void buttonup(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域内,添加一个突起的按钮*/ 
{ 
if(my<sy+17)my=sy+17; 
if(mx<sx+30)mx=sx+30; 
/* setfillstyle(1,7); 
bar(sx,sy,mx,my);*/ 
/*以下模拟Windows按钮*/ 
setcolor(15); 
rectangle(sx,sy,mx,my); 
setcolor(7); 
rectangle(sx+1,sy+1,mx-1,my-1); 
setcolor(0); 
line(sx,my,mx,my); 
line(mx,sy,mx,my); 
setcolor(8); 
line(sx+1,my-1,mx-1,my-1); 
line(mx-1,sy+1,mx-1,my-1); 
} 
/*-------------------------------------------------------------*/ 
void buttondn(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域内,添加一个按下的按钮*/ 
{ 
if(my<sy+17)my=sy+17; /*保证纵坐标最大数比最小数大17*/ 
if(mx<sx+30)mx=sx+30; /*保证横坐标最大数比最小数大30(即:按钮的最小尺寸为30X17)*/ 
/* setfillstyle(1,7); 
bar(sx,sy,mx,my);*/ /*如果去掉注释号按钮将以覆盖的模式出现,本程序按钮均为非覆盖模式,不覆盖原有的图形*/ 
/*以下模拟Windows按钮*/ 
setcolor(0); /*设定当前绘图颜色(背景色:黑)*/ 
rectangle(sx,sy,mx,my); /*在点(sx,sy),(mx,my)之间的矩形区域画方形边框*/ 
setcolor(15); /*设定当前绘图颜色(白)*/ 
line(sx,my,mx,my); /*在点(sx,my),(mx,my)之间画线*/ 
line(mx,sy,mx,my); /*在点(mx,sy),(mx,my)之间画线*/ 
setcolor(7); /*设定当前绘图颜色(浅灰)*/ 
line(sx+1,my-1,mx-1,my-1); /*在点(sx+1,my-1),(mx-1,my-1)之间画线*/ 
line(mx-1,sy+1,mx-1,my-1); /*在点(mx-1,sy+1),(mx-1,my-1)之间画线*/ 
setcolor(8); /*设定当前绘图颜色(深灰)*/ 
line(sx+1,sy+1,mx-2,sy+1); /*在点(sx+1,sy+1),(mx-2,sy+1)之间画线*/ 
line(sx+1,sy+1,sx+1,my-2); /*在点(sx+1,sy+1),(sx+1,my-2)之间画线*/ 
} 
/*-------------------------------------------------------------*/ 
void clbutton(int sx,int sy,int mx,int my)/*清除在点(sx,sy),(mx,my)之间矩形区域内的按钮*/ 
{ 
if(my<sy+17)my=sy+17; 
if(mx<sx+30)mx=sx+30; 
setlinestyle(0,0,1); /*设定线型*/ 
rectangle(sx,sy,mx,my); 
rectangle(sx+1,sy+1,mx-1,my-1); 
} 
/*-------------------------------------------------------------*/ 
void clwinrect(int sx,int sy,int mx,int my) 
{ 
rectangle(sx,sy,mx,my); 
rectangle(sx+1,sy+1,mx-1,my-1); 
} 
/*-------------------------------------------------------------*/ 
void initm(int xmi,int ymi,int xma,int yma)/*初始化设定鼠标移动范围*/ 
{ 
regs.x.ax=7; 
regs.x.cx=xmi; 
regs.x.dx=xma; 
int86(51,&regs,&regs); 
regs.x.ax=8; 
regs.x.cx=ymi; 
regs.x.dx=yma; 
int86(51,&regs,&regs); 
mimage=malloc(imagesize(0,0,18,10)); 
} 
/*-------------------------------------------------------------*/ 
void loadmimage(int x,int y) 
{ 
getimage(x,y,x+10,y+18,mimage); 
} 
/*-------------------------------------------------------------*/ 
void menupad(int sx,int sy,int mx,int my,int type)/*在点(sx,sy),(mx,my)之间的矩形区域内,画一个菜单面板,type 偶:无标题栏;type 奇:有标题栏;type>1:有忖底*/ 
{ 
if(type<0)type=-type;/*防止错误输入*/ 
if(my<sy+25)my=sy+25;/*设定菜单盘的最小范围*/ 
if(mx<sx+30)mx=sx+30; 
if(type>1) 
{ 
setfillstyle(1,7);/*设定填充模式*/ 
bar(sx,sy,mx,my);/*显示菜单盘*/ 
} 
setcolor(0); 
line(sx,my,mx,my); 
line(mx,sy,mx,my); 
setcolor(8); 
line(sx+1,my-1,mx-1,my-1); 
line(mx-1,sy+1,mx-1,my-1); 
setcolor(15); 
line(sx+1,sy+1,sx+1,my-2); 
line(sx+1,sy+1,mx-2,sy+1); 
if(type%2)/*如果有标题栏,则显示蓝框*/ 
{ 
setfillstyle(1,1); 
bar(sx+4,sy+4,mx-4,sy+17); 
} 
} 
/*-------------------------------------------------------------*/ 
int messagebox(int x0,int y0,int x1,int y1,char*message)/*消息提示框*/ 
{ 
void *buffer; 
int re; 
float size; 
if(x0>x1)x0=x0+x1,x1=x0-x1,x0=x0-x1; 
if(y0>y1)y0=y0+y1,y1=y0-y1,y0=y0-y1; 
size=((float)(x1-x0))*((float)(y1-y0)); 
if(size>60000) 
{ 
x1=x0+300; 
y1=y0+200; 
} 
else if(size<3200) 
{ 
x1=x0+80; 
y1=y0+40; 
} 
buffer=malloc(imagesize(x0,y0,x1,y1)); 
getimage(x0,y0,x1,y1,buffer); 
menupad(x0,y0,x1,y1,3); 
setcolor(15); 
outtextxy(x0+8,y0+8,"Message!"); 
setcolor(color[0]); 
outtextxy(x0+20,(y0+y1)/2,message); 
re=getch(); 
putimage(x0,y0,buffer,COPY_PUT); 
free(buffer); 
buffer=0; 
return re; 
} 
/*-------------------------------------------------------------*/ 
void movem(int x,int y)/*手动移动鼠标*/ 
{ 
regs.x.ax=4; 
regs.x.cx=x; 
regs.x.dx=y; 
int86(51,&regs,&regs); 
} 
/*-------------------------------------------------------------*/ 
void opbar(int x0,int y0,int x1,int y1)/*反色方条*/ 
{ 
int x,y; 
if(x0>x1) 
{ 
x0+=x1; 
x1=x0-x1; 
x0-=x1; 
} 
if(y0>y1) 
{ 
y0+=y1; 
y1=y0-y1; 
y0-=y1; 
} 
for(x=x0;x<=x1;x++) 
for(y=y0;y<=y1;y++) 
oppixel(x,y); 
} 
/*-------------------------------------------------------------*/ 
void oppixel(int x,int y)/*在(x,y)处绘制反色点*/ 
{ 
int color,xmax=640,ymax=480; 
if(x<=xmax&&x>=0&&y<=ymax&&y>=0) 
putpixel(x,y,15-getpixel(x,y)); 
} 
/*-------------------------------------------------------------*/ 
void opline(int x0,int y0,int x1,int y1)/*绘制反色线*/ 
{ 
int x,y; 
int dy,dx; 
if(y1==y0&&x1!=x0) 
{ 
dx=(x1-x0)/abs(x1-x0); 
for(x=x0;x!=x1;x+=dx) 
oppixel(x,y0); 
/*oppixel(x1,y1);*/ 
return; 
} 
else if(x1==x0&&y1!=y0) 
{ 
dy=(y1-y0)/abs(y1-y0); 
for(y=y0;y!=y1;y+=dy) 
oppixel(x0,y); 
/*oppixel(x1,y1);*/ 
return; 
} 
else if(y1!=y0&&abs(y1-y0)>=abs(x1-x0)) 
{ 
int xt=x0; 
dy=(y1-y0)/abs(y1-y0); 
for(y=y0;y!=y1;y+=dy) 
{ 
xt=(int)((float)(y-y0)*(float)(x1-x0)/(float)(y1-y0))+x0; 
oppixel(xt,y); 
} 
/*if(x1!=x0||y1!=y0) 
oppixel(x1,y1);*/ 
return; 
} 
else if(x1!=x0&&abs(y1-y0)<abs(x1-x0)) 
{ 
int yt=y0; 
dx=(x1-x0)/abs(x1-x0); 
for(x=x0;x!=x1;x+=dx) 
{ 
yt=(int)((float)(x-x0)*(float)(y1-y0)/(float)(x1-x0))+y0; 
oppixel(x,yt); 
} 
/*if(x1!=x0||y1!=y0) 
oppixel(x1,y1);*/ 
return; 
} 
} 
/*-------------------------------------------------------------*/ 
void oprect(int x0,int y0,int x1,int y1)/*反色矩形*/ 
{ 
opline(x0,y0,x1,y0); 
opline(x1,y0,x1,y1); 
opline(x1,y1,x0,y1); 
opline(x0,y1,x0,y0); 
} 
/*-------------------------------------------------------------*/ 
void putmimage(int x,int y) 
{ 
putimage(x,y,mimage,COPY_PUT); 
} 
/*-------------------------------------------------------------*/ 
void putnumxy(int x,int y,float num,int type)/*在屏幕上打印数字*/ 
{ 
char s[30];/*开辟一个字符串*/ 
if(type<0)type=-type;/*防止错误输入*/ 
type=type%2; 
if(type)sprintf(s,"%f",num);/*如果type==1浮点输出*/ 
else if(!type)sprintf(s,"%0.0f",num);/*如果type!=1整数输出*/ 
outtextxy(x,y,s); 
} 
/*-------------------------------------------------------------*/ 
void readm(int *mx,int *my,int *mbutt)/*读取鼠标状态*/ 
{ 
int xnew,ynew,bnew/*,x0=*mx,y0=*my,b0=*mbutt*/; 
regs.x.ax=3; 
/* do*/ 
{ 
int86(51,&regs,&regs); 
xnew=regs.x.cx; 
ynew=regs.x.dx; 
bnew=regs.x.bx; 
} 
/* while(xnew==x0&&ynew==y0&&bnew==b0);*/ 
*mbutt=bnew; 
*mx=xnew; 
*my=ynew; 
} 
/*-------------------------------------------------------------*/ 
void winrect(int sx,int sy,int mx,int my)/*在点(sx,sy),(mx,my)之间的矩形区域,添加一个模拟Windows的框*/ 
{ 
if(mx<sx+36)mx=sx+36;/*设定最小范围*/ 
if(my<sy+23)my=sy+23; 
setcolor(15); 
rectangle(sx+1,sy+1,mx,my); 
putpixel(mx,sy,15); 
putpixel(sx,my,15); 
setcolor(8); 
rectangle(sx,sy,mx-1,my-1); 
} 
/***************************************************************/ 
#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -