📄 draw.c
字号:
LineToCircle(x0,y0,oldr);
LineToCircle(x0,y0,r);
last_x=x1;
last_y=y1;
oldr=r;
}
}
/*绘制结束后,记录圆的圆心和半径*/
Rx=x0;
Ry=y0;
R=r;
while(1)
{
key=bioskey(0);
if(key==ESC)
break;
/*放大圆*/
if(key==PAGEUP)
{
if(Rx-R>10 && Ry-R>40 && Rx+R<620 && Ry+R<445)
{
/*如果半径和初始状态一样大,则保留原来的圆*/
if(R==r)
{
setcolor(WHITE);
R+=10;
circle(Rx,Ry,R);
}
else
{
setcolor(BLACK);
/*用背景色画圆,覆盖原有的*/
circle(Rx,Ry,R);
/*增加半径*/
R+=10;
setcolor(WHITE);
/*绘制新圆*/
circle(Rx,Ry,R);
}
}
}
/*缩小圆*/
if(key==PAGEDOWN)
{
if(Rx-R>10 && Ry-R>40 && Rx+R<620 && Ry+R<445)
{
/*如果半径和初始状态一样大,则保留原来的圆*/
if(R==r)
{
setcolor(WHITE);
R-=10;
circle(Rx,Ry,R);
}
else
{
setcolor(BLACK);
/*用背景色画圆,覆盖原有的*/
circle(Rx,Ry,R);
setcolor(WHITE);
/*减小半径*/
R-=10;
circle(Rx,Ry,R);
}
}
}
}
DrawMouse(x1,y1);
}
}
DrawMouse(last_x,last_y);
}
/*求阶乘函数*/
long factorial(int n)
{
long s=1;
if(n==0)
return 1;
while(n>0)
{
s*=n;
n--;
}
return s;
}
/*伯恩斯坦基函数*/
float berFunction(int i,int n,double t)
{
if(i==0&&t==0||t==1&&i==n)
return 1;
else if(t==0||t==1)
return 0;
return factorial(n)/(factorial(i)*factorial(n-i))*pow(t,i)*pow(1-t,n-i);
}
/*绘制Bezier曲线函数*/
void DrawBezier()
{
int x,y,x0,y0,x1,y1;
float j,t,dt;
int i,n;
int endFlag=0;
int last_x=0,last_y=0;
n=0;
DrawMouse(last_x,last_y);
while(mouseStatus(&x1,&y1)==LEFT_PRESSED);
while(1)
{
while((mouseStatus(&x1,&y1)==RIGHT_PRESSED))
endFlag=1;
if(endFlag==1)
break;
/*如果有两个以上的点,则将其连接,即画直线*/
if(n>1)
line(linePoint_x[n-1],linePoint_y[n-1],linePoint_x[n-2],linePoint_y[n-2]);
/*移动鼠标*/
while(mouseStatus(&x1,&y1) == NO_PRESSED)
{
if(last_x!=x1||last_y!=y1)
{
DrawMouse(last_x,last_y);
DrawMouse(x1,y1);
last_x=x1;
last_y=y1;
}
}
/*单击左键时,绘制点*/
while(mouseStatus(&x0,&y0)==LEFT_PRESSED);
putpixel(x0,y0,14);
/*记录每次鼠标左键单击的点坐标*/
linePoint_x[n]=x0;
linePoint_y[n]=y0;
n++;
}
DrawMouse(x1,y1);
dt=1.0/10;
setwritemode(0);
for(j=0;j<=10;j+=0.5)
{
t=j*dt;
x=0;
y=0;
i=0;
while(i<n-1)
{
x+=berFunction(i,n-2,t)*linePoint_x[i];
y+=berFunction(i,n-2,t)*linePoint_y[i];
i++;
}
if(j==0)
moveto(x,y);
lineto(x,y);
}
setwritemode(1);
}
void main()
{
int gdriver,gmode;
int x0,y0,x1,y1;
int last_x,last_y;
int i;
x0=250;
y0=250;
gdriver=DETECT;
while( 1)
{
initgraph(&gdriver,&gmode,"");
setbkcolor(0);
setcolor(14);
/*绘制画布*/
rectangle(5,30,630,445);
setfillstyle(1,2);
/*填充画布以外的颜色,画布仍呈背景色*/
floodfill(10,10,14);
/*绘制按钮框*/
for(i=0;i<=7;i++)
{
setcolor(RED);
line(60*i+1,2,60*i+1,25);
line(60*i+1,2,60*i+55,2);
setcolor(RED);
line(60*i+1,25,60*i+55,25);
line(60*i+55,2,60*i+55,25);
}
setcolor(RED);
line(0,446,639,446);
line(0,478,639,478);
setcolor(8);
/*绘制退出按钮框*/
rectangle(570,2,625,25);
setfillstyle(1,RED);
floodfill(620,5,8);
setcolor(WHITE);
outtextxy(585,10,"EXIT");
/*显示“直线”*/
outChinese(zhi16K, 16, 10,6, WHITE);
outChinese(xian16K, 16, 28,6, WHITE);
/*显示“矩形”*/
outChinese(ju16K, 16, 70,6, WHITE);
outChinese(xing16K, 16, 88,6, WHITE);
/*显示“圆形”*/
outChinese(yuan16K, 16, 130,6, WHITE);
outChinese(xing16K, 16, 148,6, WHITE);
outtextxy(185,10,"Bezier");
/*显示“清屏”*/
outChinese(qing16K, 16, 250,6, WHITE);
outChinese(ping16K, 16, 268,6, WHITE);
/*显示“保存”*/
outChinese(bao16K, 16, 310,6, WHITE);
outChinese(cun16K, 16, 328,6, WHITE);
/*显示“加载”*/
outChinese(jia16K, 16, 370,6, WHITE);
outChinese(zai16K, 16, 388,6, WHITE);
/*显示“帮助”*/
outChinese(bang16K, 16, 430,6, WHITE);
outChinese(zhu16K, 16, 448,6, WHITE);
setMousePos(x0,y0);
setwritemode(1);
DrawMouse(x0,y0);
last_x=x0;
last_y=y0;
while(!((mouseStatus(&x1,&y1)==NO_PRESSED) && x1>240 &&x1<295&&y1>1&&y1<25))
{
/*单击退出按钮*/
if((mouseStatus(&x1,&y1)==NO_PRESSED) && x1>570 &&x1<625&&y1>1&&y1<25)
exit(0);
/*鼠标移动*/
while(mouseStatus(&x1,&y1) == NO_PRESSED||y1>25)
{
if(last_x!=x1 && last_y!=y1)
{
DrawMouse(last_x,last_y);
DrawMouse(x1,y1);
last_x=x1;
last_y=y1;
}
}
DrawMouse(last_x,last_y);
/*在按钮框中单击左键后*/
while(mouseStatus(&x1,&y1)==LEFT_PRESSED);
/*绘制直线*/
if(x1>0 && x1<60 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
/*呈凹陷状态*/
line(1,2,1,25);
line(1,2,55,2);
setcolor(15);
line(1,25,55,25);
line(55,2,55,25);
setwritemode(1);
DrawLine();
setwritemode(0);
setcolor(RED);
/*还原成初始状态*/
rectangle(1,2,55,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*绘制矩形*/
if(x1>60 && x1<115 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(61,2,61,25);
line(61,2,115,2);
setcolor(15);
line(61,25,115,25);
line(115,2,115,25);
setwritemode(1);
DrawRectangle();
setwritemode(0);
setcolor(RED);
rectangle(61,2,115,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*绘制圆形*/
if(x1>120 && x1<175 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(121,2,121,25);
line(121,2,175,2);
setcolor(15);
line(121,25,175,25);
line(175,2,175,25);
setwritemode(1);
DrawCircle();
setwritemode(0);
setcolor(RED);
rectangle(121,2,175,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*绘制Bezier曲线*/
if(x1>180 && x1<235 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(181,2,181,25);
line(181,2,235,2);
setcolor(15);
line(181,25,235,25);
line(235,2,235,25);
setwritemode(1);
DrawBezier();
setwritemode(0);
setcolor(RED);
rectangle(181,2,235,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*保存文件*/
if(x1>300 && x1<355 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(301,2,301,25);
line(301,2,355,2);
setcolor(15);
line(301,25,355,25);
line(355,2,355,25);
setwritemode(1);
save();
setwritemode(0);
setcolor(RED);
rectangle(301,2,355,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*加载已有的文件*/
if(x1>360 && x1<415 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(361,2,361,25);
line(361,2,415,2);
setcolor(15);
line(361,25,415,25);
line(415,2,415,25);
setwritemode(1);
load();
setwritemode(0);
setcolor(RED);
rectangle(361,2,415,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
/*显示用户帮助*/
if(x1>420 && x1<475 && y1>1 && y1<25)
{
setwritemode(0);
setcolor(8);
line(421,2,421,25);
line(421,2,475,2);
setcolor(15);
line(421,25,475,25);
line(475,2,475,25);
setwritemode(1);
showHelp();
setwritemode(0);
setcolor(RED);
rectangle(421,2,475,25);
setcolor(15);
setwritemode(1);
DrawMouse(last_x,last_y);
}
}
closegraph();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -