📄 xuanzhuandewujiaoxing.c
字号:
#define pi 3.141592
#define MAX(a,b) (a>b)? a:b
#define MIN(a,b) (a<b)? a:b
#include "graphics.h"
#include "math.h"
struct edge {
int ymax;
float x;
float delat;
struct edge * pedge; };
struct point{
float x;
int y;} ;
struct point pot[20];
struct et { struct edge * pedge;
int n;};
struct edge g_aet[20];
struct edge dge[20];
struct et g_et[20];
struct point point1,point2;
int ZUO(float x)
{ if((int)x==x)
return (int)x;
return (int)x+1;
}
int YOU(float x)
{ if((int)x==x)
return (int)x-1;
return (int)x;
}
int k=400,l=0;
int o=0;
void init()
{int i;
for(i=0;i<=19;i++)
{ g_aet[i].ymax=0; g_aet[i].x=0; g_aet[i].delat=0;
g_aet[i].pedge=0;
g_et[i].pedge=0;g_et[i].n=0;
dge[i].ymax=0;
dge[i].x=0;
dge[i].delat=0;
dge[i].pedge=0;
pot[i].x=0;
pot[i].y=0;}
}
void draw(int color,int x,int y)
{
int i,t,j,a,c,p,z; float b;
struct edge temp;
/**/for(i=k;i<=l;i++)
{
a=0;
for(t=0;t<=19;t++)
{ if(g_et[t].n==i) break;}
for(j=0;j<=19;j++)
{ if(g_aet[j].ymax==0) break;}
if(t!=20){ g_aet[j].ymax=g_et[t].pedge->ymax;
g_aet[j].x=g_et[t].pedge->x;
g_aet[j].delat=g_et[t].pedge->delat;
if(g_et[t].pedge->pedge!=0)
{
g_aet[j+1].ymax=g_et[t].pedge->pedge->ymax;
g_aet[j+1].x=g_et[t].pedge->pedge->x;
g_aet[j+1].delat=g_et[t].pedge->pedge->delat;
if(g_et[t].pedge->pedge->pedge!=0)
{
g_aet[j+2].ymax=g_et[t].pedge->pedge->pedge->ymax;
g_aet[j+2].x=g_et[t].pedge->pedge->pedge->x;
g_aet[j+2].delat=g_et[t].pedge->pedge->pedge->delat;
if(g_et[t].pedge->pedge->pedge->pedge!=0)
{
g_aet[j+3].ymax=g_et[t].pedge->pedge->pedge->pedge->ymax;
g_aet[j+3].x=g_et[t].pedge->pedge->pedge->pedge->x;
g_aet[j+3].delat=g_et[t].pedge->pedge->pedge->pedge->delat; }
}
}
}
for(j=0;j<=19;j++)
{ if(g_aet[j].ymax==0) break; }
j--;
for(t=0;t<=j;t++)
{ for(z=0;z<=j-1;z++)
{
if(g_aet[z].x>g_aet[z+1].x)
{ temp.ymax=g_aet[z].ymax;
temp.x=g_aet[z].x;
temp.delat=g_aet[z].delat;
g_aet[z].ymax=g_aet[z+1].ymax;
g_aet[z].x=g_aet[z+1].x;
g_aet[z].delat=g_aet[z+1].delat;
g_aet[z+1].ymax=temp.ymax;
g_aet[z+1].x=temp.x;
g_aet[z+1].delat=temp.delat;
}
}
}
for(j=0;j<=19;j++)
{ if(g_aet[j].ymax==0) break; }
j--;
for(p=0;p<=j;p++)
{ a++;
if(a%2!=0)b=g_aet[p].x;
else
{
for(c=ZUO(b);c<=YOU(g_aet[p].x);c++)
putpixel(c+x,i+y,color);}
}
for(t=0;t<=j;t++)
{ if(g_aet[t].ymax==(i+1))
{ g_aet[t].ymax=0;
g_aet[t].x=0;
g_aet[t].delat=0;
}
g_aet[t].x+=g_aet[t].delat;
}
for(t=0;t<=j;t++)
{ for(z=0;z<=j-1;z++)
{
if(g_aet[z].x<g_aet[z+1].x)
{ temp.ymax=g_aet[z].ymax;
temp.x=g_aet[z].x;
temp.delat=g_aet[z].delat;
g_aet[z].ymax=g_aet[z+1].ymax;
g_aet[z].x=g_aet[z+1].x;
g_aet[z].delat=g_aet[z+1].delat;
g_aet[z+1].ymax=temp.ymax;
g_aet[z+1].x=temp.x;
g_aet[z+1].delat=temp.delat;
}
}
}
}
}
void generate(struct point * pot)
{
int i,y,n=1,m,q,p,h;float x;
for(h=0;h<=19;h++)
{ if(pot[h].x==0) break;}
h--;
for(i=0;i<=h;i++)
{
if(n==1)
{ point2.x=point1.x=pot[0].x;
point2.y=point1.y=pot[0].y;
n++;
}
else{ x=pot[i].x;
y=pot[i].y;
if(point1.y==y) { n++; point1.x=x; point1.y=y; continue;}
m=MIN(point1.y,y);
if(x==point1.x)
{ dge[i-1].delat=0;
dge[i-1].ymax=MAX(point1.y,y);
dge[i-1].x=x;
dge[i-1].pedge=0;
for(q=0;q<=19;q++)
{ if(g_et[q].n==m) break;}
if(q==20)
{
g_et[i-1].pedge=&dge[i-1];
g_et[i-1].n=m;
}
else
{
if(g_et[q].pedge->pedge==0)
{g_et[q].pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else
{ if(g_et[q].pedge->pedge->pedge==0)
{g_et[q].pedge->pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else {
{ if(g_et[q].pedge->pedge->pedge->pedge==0)
{ g_et[q].pedge->pedge->pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}}
}}}}
else
{
dge[i-1].delat=(float)(x-point1.x)/(y-point1.y);
dge[i-1].ymax=MAX(point1.y,y);
if(point1.y>y) dge[i-1].x=x;
else {dge[i-1].x=point1.x; }
dge[i-1].pedge=0;
for(q=0;q<=19;q++)
{ if(g_et[q].n==m) break;}
if(q==20)
{ g_et[i-1].pedge=&dge[i-1];
g_et[i-1].n=m;
}
else
{
if(g_et[q].pedge->pedge==0)
{g_et[q].pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else
{ if(g_et[q].pedge->pedge->pedge==0)
{g_et[q].pedge->pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else { { if(g_et[q].pedge->pedge->pedge->pedge==0)
{
g_et[q].pedge->pedge->pedge->pedge= &dge[i-1];
g_et[i-1].n=0;}
}
}
}
}
}
p=MAX(point1.y,y);
k=MIN(k,m);l=MAX(l,p);
point1.x=x;
point1.y=y;
n++;}
}
if(point1.y==point2.y) return;
else
{if(point2.x==point1.x){
dge[i-1].delat=0;
dge[i-1].ymax=MAX(point1.y,point2.y);
dge[i-1].x=point2.x;}
else
{ dge[i-1].ymax=MAX(point1.y,point2.y);
if(point1.y>point2.y) dge[i-1].x=point2.x;
else {dge[i-1].x=point1.x;}
dge[i-1].delat=(float)(point2.x-point1.x)/(point2.y-point1.y);
}
}
m=MIN(point1.y,point2.y);
k=MIN(k,m); l=MAX(l,dge[i-1].ymax);
for(q=0;q<=19;q++)
{ if(g_et[q].n==m) break;}
if(q==20)
{ g_et[i-1].pedge=&dge[i-1];
g_et[i-1].n=m;
}
else
{
if(g_et[q].pedge->pedge==0)
{g_et[q].pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else
{
if(g_et[q].pedge->pedge->pedge==0)
{g_et[q].pedge->pedge->pedge=&dge[i-1];
g_et[i-1].n=0;}
else { if(g_et[q].pedge->pedge->pedge->pedge==0)
{g_et[q].pedge->pedge->pedge->pedge= &dge[i-1];
g_et[i-1].n=0;
}
}
}
}
}
void wujiaoxing1(int color,int x,int y)
{
int i,n=1;
init();
for(i=0;i<=9;i++)
{
if(n==1)
{ pot[0].x=50*cos(i*pi/5+o)+200;
pot[0].y=50*sin(i*pi/5+o)+200;
n++;
}
else
{ if(n%2==0)
{ pot[i].x=20*cos(i*pi/5+o)+200;
pot[i].y=20*sin(i*pi/5+o)+200;
}
else
{ pot[i].x=50*cos(i*pi/5+o)+200;
pot[i].y=50*sin(i*pi/5+o)+200;
}
n++;
}
}
generate(pot);
draw(color,x,y);
}
void fangzi(int color,int x,int y)
{ int i;
init();
pot[0].x=225;
pot[0].y=50;
pot[1].x=225;
pot[1].y=80;
pot[2].x=250;
pot[2].y=80;
pot[3].x=200;
pot[3].y=110;
pot[4].x=150;
pot[4].y=80;
pot[5].x=175;
pot[5].y=80;
pot[6].x=175;
pot[6].y=50;
generate(pot);draw(color,x,y);
/*for(i=0;i<=9;i++)
{ printf("%d %f %f\n",dge[i].ymax,dge[i].x,dge[i].delat);
printf("%d\n",g_et[i].n);}*/
}
void che(int color,int x,int y)
{ int i;
init();
pot[0].x=5;
pot[0].y=5;
pot[1].x=105;
pot[1].y=5;
pot[2].x=105;
pot[2].y=15;
pot[3].x=75;
pot[3].y=25;
pot[4].x=65;
pot[4].y=35;
pot[5].x=55;
pot[5].y=35;
pot[6].x=45;
pot[6].y=25;
pot[7].x=5;
pot[7].y=15;
generate(pot);draw(color,x,y);
}
void jian(int color,int x,int y)
{ int i;
init();
pot[0].x=5; pot[10].x=5;pot[10].y=15;
pot[0].y=5; pot[7].x=5;pot[7].y=15;
pot[1].x=105;
pot[1].y=5; pot[7].x=5;pot[7].y=15;
pot[2].x=105;
pot[2].y=15;
pot[3].x=75;
pot[3].y=25;
pot[4].x=65;
pot[4].y=35;
pot[5].x=55;
pot[5].y=35;
pot[6].x=45;
pot[6].y=25;
pot[7].x=5;
pot[7].y=15;
pot[8].x=5;
pot[8].y=15;
pot[9].x=5;
pot[9].y=15;
generate(pot);draw(color,x,y);
}void shan(int color, int x ,int y)
{ int i;
init();
pot[0].x=50;
pot[0].y=50;
pot[1].x=100;
pot[1].y=100;
pot[2].x=150;
pot[2].y=50;
pot[3].x=200;
pot[3].y=100;
pot[4].x=250;
pot[4].y=50;
generate(pot);draw(color,x,y);
}
void wujiaoxing2(int color,int x,int y)
{
int i,n=1;
init();
for(i=0;i<=19;i++)
{
if(n==1)
{ pot[0].x=50*cos(i*pi/5+o)+300;
pot[0].y=50*sin(i*pi/5+o)+300;
n++;
}
else
{ if(n%2==0)
{ pot[i].x=20*cos(i*pi/10+o)+300;
pot[i].y=20*sin(i*pi/10+o)+300;
}
else
{ pot[i].x=50*cos(i*pi/10+o)+300;
pot[i].y=50*sin(i*pi/10+o)+300;
}
n++;
}
}
generate(pot);
draw(color,x,y);
}
void wujiaoxing3(int color,int x,int y)
{
int i,n=1;
init();
for(i=0;i<=9;i++)
{
if(n==1)
{ pot[0].x=130;
pot[0].y=200;
n++;
}
else
{ if(n%2==0)
{ pot[i].x=40*cos(i*pi/5)+100;
pot[i].y=40*sin(i*pi/5)+200;
}
else
{ pot[i].x=100*cos(i*pi/5)+100;
pot[i].y=100*sin(i*pi/5)+200;
}
n++;
}
}
generate(pot);
draw(color,x,y);
}
void liubianxing(int color,int x,int y)
{
int i;
init();
for(i=0;i<=5;i++)
{ pot[i].x=30*cos(o+i*pi/3)+450;
pot[i].y=30*sin(o+i*pi/3)+250;}
generate(pot);
draw(color,x,y);
}
void shibianxing(int color,int x,int y)
{
int i;
init();
for(i=0;i<=11;i++)
{ pot[i].x=30*cos(i*pi/5)+550;
pot[i].y=30*sin(i*pi/5)+400;}
generate(pot);
draw(color,x,y);
}
void main()
{ int a=1;
int driver=DETECT,mode; int i,x=100,y=0;
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"\\tc");
initgraph(&driver,&mode,"\\tc");
che(3,0,200);shan(3,0,50);
wujiaoxing2(4,0,0); wujiaoxing2(2,250,-140);
while(!kbhit())
{
y=y-10;
x=x+10;o=o+30;
fangzi(5,x,0);
fangzi(0,x,0);
shibianxing(6,y,0); shibianxing(0,y,0);
liubianxing(1,0,0); liubianxing(0,0,0);
wujiaoxing1(2,0,0); wujiaoxing1(0,0,0);
delay(1000);
}
getch();
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -