头文件:michael.h
/******************************************************
*Copyright(c) 2020 HUST EST0105
*All Rights Reserved.
*
*Filename:michael.h
*Programmer:Michaelexe
*E-mail:michaelexe@163.com
*Date:Augest 18th,2022
******************************************************/
#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define INT_MOUSE 0x33
void mousePosGet(int *x,int *y);
void mousePosSet(int x,int y);
int mousePressLeft();
int mousePressRight();
int mousePressMiddle();
void mousePosGet(int *x,int *y)
{ union REGS mregs;
mregs.x.ax=0x3;
int86(INT_MOUSE,&mregs,&mregs);
*x=mregs.x.cx;
*y=mregs.x.dx;
}
void mousePosSet(int x,int y)
{ union REGS mregs;
mregs.x.ax=0x4;
mregs.x.cx=x;
mregs.x.dx=y;
int86(INT_MOUSE,&mregs,&mregs);
}
int mousePressLeft()
{ union REGS mregs;
mregs.x.ax=0x3;
int86(INT_MOUSE,&mregs,&mregs);
return(mregs.x.bx&0x1);
}
int mousePressRight()
{ union REGS mregs;
mregs.x.ax=0x3;
int86(INT_MOUSE,&mregs,&mregs);
return(mregs.x.bx&0x2);
}
int mousePressMiddle()
{ union REGS mregs;
mregs.x.ax=0x3;
int86(INT_MOUSE,&mregs,&mregs);
return(mregs.x.bx&0x4);
}
源文件:mandelbrot.c
#include<michael.h>
void mandelbrot(void);
void drawMandelbrotSet(float reCmax,float imCmax,float reCmin,float imCmin);
main()
{ int key;
int GraphDriver=VGA,GraphMode=VGAHI;
initgraph(&GraphDriver,&GraphMode,"c:\\tc\\BGI");
setcolor(0);
mandelbrot();
}
void mandelbrot(void)
{
int x=0,y=0,length=20;
void far *pBitmap;
float reCminM1=-2.25,reCmaxM1=1.75,reCminM2,reCmaxM2,reCJ1=0.3;
float imCminM1=-1.8,imCmaxM1=1.5,imCminM2,imCmaxM2,imCJ1=0.3;
float deltReCM1,deltImCM1;
l:
deltReCM1=(reCmaxM1-reCminM1)/599;
deltImCM1=(imCmaxM1-imCminM1)/479;
pBitmap=malloc(imagesize(x,y,x+length,y+length));
drawMandelbrotSet(reCmaxM1,imCmaxM1,reCminM1,imCminM1);
do
{ setcolor(0);
rectangle(x,y,x+length,y+length);
if(x!=0&&y!=0)putimage(x,y,pBitmap,0);
mousePosGet(&x,&y);
getimage(x,y,x+length,y+length,pBitmap);
setcolor(WHITE);
rectangle(x,y,x+length,y+length);
delay(1000);
if(mousePressLeft())
{
cleardevice();
reCminM2=reCminM1+x*deltReCM1;
reCmaxM2=reCminM1+(x+length)*deltReCM1;
imCminM2=imCminM1+y*deltImCM1;
imCmaxM2=imCminM1+(y+length)*deltImCM1;
drawMandelbrotSet(reCmaxM2,imCmaxM2,reCminM2,imCminM2);
sleep(3);
goto l;
}
}while(!kbhit());
}
void drawMandelbrotSet(float reCmax,float imCmax,float reCmin,float imCmin)
{ float reC,imC;
float reZ,imZ,tmpReZ,deltImC,deltReC,absZ;
int xCord,yCord,nColor,nTimes;
deltReC=(reCmax-reCmin)/599;
deltImC=(imCmax-imCmin)/479;
for(xCord=1;xCord<=599;xCord++)
for(yCord=1;yCord<=479;yCord++)
{
reC=reCmin+deltReC*xCord;
imC=imCmin+deltImC*yCord;
reZ=0;
imZ=0;
for(nTimes=0;nTimes<160;nTimes++)
{
tmpReZ=reZ*reZ-imZ*imZ+reC;
imZ=2*reZ*imZ+imC;
reZ=tmpReZ;
absZ=reZ*reZ+imZ*imZ;
if(absZ>=4)
{
nColor=nTimes/10;
break;
}
nColor=0;
}
putpixel(xCord,yCord,nColor);
}
}