📄 zhang.c
字号:
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#include "string.h"
#include "Math.h"
#define ESC 0x1b
#define DELTA 5.0
#define pi 3.1415926
#define true 1
#define false 0
#define closegr closegraph
typedef struct{
float x;
float y;
}Point;
typedef struct{
int pointNum;
Point *vertices;
}Polygon;
typedef struct{
unsigned all;
unsigned left,right,top,bottom;
}OutCode;
typedef struct{
int xmin,xmax,ymin,ymax;
}Rectangle;
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
void Pause(void)
{
int c;
c = getch(); /* Read a character from kbd */
if( ESC == c ){ /* Does user wish to leave? */
closegraph(); /* Change to text mode */
exit( 1 ); /* Return to OS */
}
if( 0 == c ){ /* Did use hit a non-ASCII key? */
c = getch(); /* Read scan code for keyboard */
}
}
/*----------------------------直线中点算法-----------------------------*/
void MidPointLine(int x0,int y0,int x1,int y1,int color,int width,int figure)
{
int flag,t,x,y,i;
float incrE,incrNE, dx,dy,s,d;
if(x1<x0)
{t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
}
dx=x1-x0;
dy=y1-y0;
s=y0-dy/dx*x0;
y0=y0-s;
y1=y1-s;
if(dy>0&&dy/dx<=1)
{flag=0;}
else if(dy/dx>=-1&&dy<0)
{flag=1;
y0=-y0;
y1=-y1;
}
else if(dy/dx>1)
{flag=2;
t=x0;x0=y0;y0=t;
t=x1;x1=y1;y1=t;
if(x1<x0)
{t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
}
}
else if(dy/dx<-1)
{flag=3;
t=x0;x0=y0;y0=t;
t=x1;x1=y1;y1=t;
y0=-y0;
y1=-y1;
if(x1<x0)
{t=x0;x0=x1;x1=t;
t=y0;y0=y1;y1=t;
}
}
dx=x1-x0;
dy=y1-y0;
d=dx-2*dy;
incrE=-2*dy;
incrNE=2*(dx-dy);
x=x0;y=y0;
if(flag==0)
putpixel(x,y+(int)(s+0.5),color);
else if(flag==1)
putpixel(x,-y+(int)(s+0.5),color);
else if(flag==2)
putpixel(y,x+(int)(s+0.5),color);
else if(flag==3)
putpixel(-y,x+(int)(s+0.5),color);
while(x<x1)
{if(d>0)
d+=incrE;
else
{
d+=incrNE;
y++;
}
x++;
if(figure==true)
{if(flag==0)
for(i=-width/2;i<width-width/2;i++)
putpixel(x+450,y+i+(int)(s+0.5)+225,color);
else if(flag==1)
for(i=-width/2;i<width-width/2;i++)
putpixel(x+450,-y+i+(int)(s+0.5)+225,color);
else if(flag==2)
for(i=-width/2;i<width-width/2;i++)
putpixel(y+450,x+i+(int)(s+0.5)+225,color);
else if(flag==3)
for(i=-width/2;i<width-width/2;i++)
putpixel(-y+450,x+i+(int)(s+0.5)+225,color);
}
else
{if(flag==0)
{if((x+450)%16>=8)
for(i=-width/2;i<width-width/2;i++)
putpixel(x+450,y+i+(int)(s+0.5)+225,color);}
else if(flag==1)
{if((x+450)%16>=8)
for(i=-width/2;i<width-width/2;i++)
putpixel(x+450,-y+i+(int)(s+0.5)+225,color);}
else if(flag==2)
{if((x+225)%16>=8)
for(i=-width/2;i<width-width/2;i++)
putpixel(y+450,x+i+(int)(s+0.5)+225,color);}
else if(flag==3)
{if((x+225)%16>=8)
for(i=-width/2;i<width-width/2;i++)
putpixel(-y+450,x+i+(int)(s+0.5)+225,color);}
}
}
Pause();
}
/*-----------------生成圆的等面积正多边形迫近法--------------------*/
void CircleToPolygon(int radius)
{
int i,n;
float x,y,xnew,ynew,alfa,cos1,sin1;
/*计算圆心角和边数n*/
alfa=2*acos(((float)radius-DELTA)/(float)radius);
printf("alfa=%f\n",alfa);
n=(int)(360/alfa);
printf("n=%d\n",n);
/*由递推式求解顶点*/
x=sqrt(alfa/sin(alfa))*radius;
y=0.0;
cos1=cos(alfa/360*2*pi);
sin1=sin(alfa/360*2*pi);
for(i=1;i<n;i++)
{
xnew=cos1*x-sin1*y;
ynew=sin1*x+cos1*y;
line((int)(x+0.5+450),(int)(y+0.5+225),(int)(xnew+0.5+450),(int)(ynew+0.5+225));
x=xnew;
y=ynew;
}
x=sqrt(alfa/sin(alfa))*radius;
y=0.0;
line((int)(xnew+0.5+450),(int)(ynew+0.5+225),(int)(x+450),(int)(y+225));
Pause();
}
/*-----------------------------------建立坐标系-----------------------------*/
void establishcoordinate()
{
int x,y;
line(300,225,600,225);
line(450,100,450,350);
for(x=300;x<600;x+=10)
for(y=222;y<225;y++)
putpixel(x,y,WHITE);
outtextxy(442,228,"0");
outtextxy(300,232,"-150");
outtextxy(600,232,"150");
outtextxy(605,220,"x");
/*---------------------以下为说明语句--------------------*/
line(350,155,360,155);
for(x=350;x<=360;x+=10)
for(y=152;y<155;y++)
putpixel(x,y,WHITE);
outtextxy(349,160,"10");
outtextxy(280,150,"explain");
/*---------------------以上为说明语句--------------------*/
for(y=100;y<350;y+=10)
for(x=450;x<453;x++)
putpixel(x,y,WHITE);
outtextxy(415,100,"-125");
outtextxy(415,350,"125");
outtextxy(450,355,"y");
line(595,220,600,225);
line(595,230,600,225);
line(445,345,450,350);
line(455,345,450,350);
Pause();
}
/*-----------------------------------用正负法画抛物线-----------------------------*/
void PositiveNegativeParabola(float a,float b,float c,int color)
{
int x,y,d;
x=0;
y=0;
putpixel(x+450+b,y+225+c,color);
if(a>0)
{ y=1;
putpixel(x+450+b,y+225+c,color);
d=1;
while(y<=100)
{
if(d>=0)
{d=d-2*a*x-a;
x++;
}
else
{d=d+1;
y++;
}
putpixel(-x+450+b,y+225+c,color);
putpixel(x+450+b,y+225+c,color);
}
}
else if(a<0)
{
x=1;
putpixel(x+450+b,y+225+c,color);
d=1;
while(y>=-100)
{
if(d>=0)
{
d=d-1;
y--;
}
else
{
d=d-2*a*x-a;
x++;
}
putpixel(-x+450+b,y+225+c,color);
putpixel(x+450+b,y+225+c,color);
}
}
else
{
printf("this is not a Parabola!\n");
}
Pause();
}
/*---------------------计算五角星各顶点坐标,绘制五角星----------------------*/
void DrawPentacle(int radius,int centerx,int centery)
{
int i;
int list[10][2];
setcolor(RED);
for(i=0;i<10;i++)
if(i%2==0)
{
list[i][0]=(int)(radius*cos(pi/5*i-pi/10))+centerx;
list[i][1]=(int)(radius*sin(pi/5*i-pi/10))+centery;
}
else
{
list[i][0]=(int)(radius*sin(pi/10)/sin(pi*7/10)*cos(pi/5*i-pi/10))+centerx;
list[i][1]=(int)(radius*sin(pi/10)/sin(pi*7/10)*sin(pi/5*i-pi/10))+centery;
}
for(i=0;i<10;i++)
line(list[i][0],list[i][1],list[(i+1)%10][0],list[(i+1)%10][1]);
}
/*------------------------逐点判断算法--------------------------------*/
void FillPentacle(int Pentaclecolor)
{
int x,y,i0,y0,flag=0;
setcolor(RED);
for(y=129;y<=303;y++)
for(x=200;x<=getmaxx();x++)
if(getpixel(x-1,y)!=RED&&getpixel(x,y)==RED&&flag==0)
{i0=x;
y0=y;
flag++;
}
else if(getpixel(x,y)==RED&&getpixel(x-1,y)!=RED&&flag==1)
{
line(i0,y0,x,y);
flag=0;
}
}
/*-------------------------画直线部分的程序输入-----------------------*/
void DrawLine()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -