一个分形mandelbrot集的dos TC小程序

头文件: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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值