⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawer.cpp

📁 Julia集的分形算法
💻 CPP
字号:
// Drawer.cpp: implementation of the Drawer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Drawer.h"
#include <complex>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Drawer::Drawer(HDC hDC):bReDraw(TRUE),m_OutR(100.0),m_times(500)
{
	m_Rect.left = 100;
	m_Rect.top = 20;
	m_Rect.right = 740;
	m_Rect.bottom = 500;
	nEnlarge = 100;
	Large = 1;
	ParaWindow.dPmin = -2.2;
	ParaWindow.dQmin = -1.2;
	ParaWindow.dPmax = 0.8;
	ParaWindow.dQmax = 1.2;
/*
	ParaWindow.dPmin = -1.0;
	ParaWindow.dQmin = -4.0;
	ParaWindow.dPmax = 8.0;
	ParaWindow.dQmax = 8.0;
*/	
	m_hDC = CreateCompatibleDC(hDC);
	m_hBitmap = CreateCompatibleBitmap(hDC,640,480);
	SelectObject(m_hDC,m_hBitmap);
}

Drawer::~Drawer()
{
	DeleteDC(m_hDC);
	DeleteObject(m_hBitmap);
	m_hBitmap = NULL;
	m_hDC = NULL;
}

void Drawer::Enlarge(RECT rt)
{
	int iTmp;
	double dTmp;
	double dp,dq;
	if(rt.left > rt.right)
	{
		iTmp = rt.right;
		rt.right = rt.left;
		rt.left = iTmp;
	}
	if(rt.top > rt.bottom)
	{
		iTmp = rt.bottom;
		rt.bottom = rt.top;
		rt.top = iTmp;
	}
	if(rt.left < m_Rect.left) return;
	if(rt.top < m_Rect.top) return;
	if(rt.right > m_Rect.right)	return;
	if(rt.bottom > m_Rect.bottom) return;
	
	dp = (ParaWindow.dPmax - ParaWindow.dPmin)/(m_Rect.right - m_Rect.left);
	dq = (ParaWindow.dQmax - ParaWindow.dQmin)/(m_Rect.bottom - m_Rect.top);

	dTmp = ParaWindow.dPmin;
	ParaWindow.dPmin = ParaWindow.dPmin + dp*(rt.left - m_Rect.left);
	ParaWindow.dPmax = dTmp + dp*(rt.right - m_Rect.left);

	dTmp = ParaWindow.dQmin;
	ParaWindow.dQmin = ParaWindow.dQmin + dq*(rt.top - m_Rect.top);
	ParaWindow.dQmax = dTmp + dq*(rt.bottom - m_Rect.top);

	bReDraw = TRUE;
}

void Drawer::Reset()
{
	ParaWindow.dPmin = -2.0;
	ParaWindow.dQmin = -2.0;
	ParaWindow.dPmax = 2.0;
	ParaWindow.dQmax = 2.0;
	bReDraw = TRUE;
}

void Drawer::DrawJulia(HDC hDC)
{
	if(!bReDraw)
	{
		BitBlt(hDC, m_Rect.left, m_Rect.top, m_Rect.right-m_Rect.left,\
			m_Rect.bottom-m_Rect.top, m_hDC, 0, 0,SRCCOPY);
		return;
	}
	int i = m_Rect.left,i1(0);
	int j = m_Rect.top,j1(0);
	int k = 0;
	double r;
	double x0(0),y0(0),dp,dq;

	// c1 = λ - 1;c2 = λ - 2;
	std::complex<double> C1(-1.0,0);
	std::complex<double> C2(-2.0,0);

	dp = (ParaWindow.dPmax - ParaWindow.dPmin)/(m_Rect.right - m_Rect.left);
	dq = (ParaWindow.dQmax - ParaWindow.dQmin)/(m_Rect.bottom - m_Rect.top);

	for(i1 = 0;i < m_Rect.right;i++,i1++)
	{
		for(j1 = 0,j = m_Rect.top;j<m_Rect.bottom;j++,j1++)
		{
			x0 = ParaWindow.dPmin + dp*i1;
			y0 = ParaWindow.dQmin + dq*j1;

			std::complex<double> Z(0,0);
			std::complex<double> Tn(x0,y0);
			
			for(k = 0;k<m_times;k++)
			{
			//	Tn = Tn = (pow(Tn,2) + C1)/(Tn*2.0 + C2);
			//	Tn = pow(Tn,2);
				Z = pow(Z,2) + Tn;
			
			//	Z = (pow(Z,2) + Tn + C1)/(Z*2.0 + Tn + C2);
			//	Z = pow(Z,2);
				r = abs(Z);
				r *= r;
			
				if(r > m_OutR)
					break;
			}

			if (k >= m_times) k = r*100;
			k *= 0x1111ff;
			
			
			SetPixelV(hDC, i, j, k);
			
			
			SetPixelV(m_hDC, (i-m_Rect.left), (j-m_Rect.top), k);
		}
	}
	bReDraw = FALSE;
}

void Drawer::Resize(HDC hDC,RECT Rect)
{
	HBITMAP hBitmap = NULL;
	
	hBitmap = CreateCompatibleBitmap(hDC,Rect.right - Rect.left,Rect.bottom - Rect.top);
	if(hBitmap)
	{
		m_Rect = Rect;
		DeleteObject(m_hBitmap);
		m_hBitmap = hBitmap;
		SelectObject(m_hDC,hBitmap);
		bReDraw = TRUE;
	}
	
}

void Drawer::DrawTnCurve(HDC hDC)
{
//	MessageBox(NULL,NULL,NULL,MB_OK);
	double Labuda0 = 2.0 - 1.0/(1.0 + pow(2.0,1.0/6.0));
	double Labuda = Labuda0 + 0*(2 - Labuda0)/10;

	//Draw coordinate in the Rect;
	SetMapMode(hDC,MM_LOENGLISH);
	SetViewportOrgEx(hDC,m_Rect.right - 50,(-Large)*(m_Rect.top + 20) + 2*(m_Rect.top + 20),NULL);
	MoveToEx(hDC,0,0,NULL);
	LineTo(hDC,0,-(Large)*m_Rect.bottom);
	MoveToEx(hDC,0,0,NULL);
	LineTo(hDC,-(Large*10)*m_Rect.right,0);
	MoveToEx(hDC,20,20,NULL);
	LineTo(hDC,-m_Rect.right + 50,-m_Rect.right + 50);

	//Draw The Tn Curve;
	double Z = 0.0;
	double Tn = 0.0;
	HPEN pen = CreatePen(PS_SOLID,1,RGB(0,255,0));
	HPEN pOldPen;
	double Tn_Z = 0;
	BOOL bFirst = TRUE;
	for(Z = -3.0; Z < 0.1; Z += 0.00001)
	{
		Tn = ((Z*Z + Labuda -1)/(2*Z + Labuda -2));
		Tn = pow(Tn,7.0);
		if(abs(100*nEnlarge*Z - 100*nEnlarge*Tn) == 0 && bFirst)// break;
		{
			bFirst = FALSE;
			Tn_Z = nEnlarge*Z;		
		}
		SetPixelV(hDC,(long)nEnlarge*Z,(long)nEnlarge*Tn,RGB(255,0,0));
	}
	Z = 1 - Labuda;
	Tn = ((Z*Z + Labuda -1)/(2*Z + Labuda -2));
	Tn = pow(Tn,7.0);
	pOldPen = (HPEN)SelectObject(hDC,pen);
	MoveToEx(hDC,(long)nEnlarge*Z,(long)nEnlarge*Tn,NULL);
	LineTo(hDC,0,(long)nEnlarge*Tn);
	SelectObject(hDC,&pOldPen);
	if(pen)
	{
		DeleteObject(pen);
		pen = CreatePen(PS_SOLID,1,RGB(178,0,155));
	}
	SelectObject(hDC,pen);
	MoveToEx(hDC,(long)nEnlarge*Tn,(long)nEnlarge*Tn,NULL);
	LineTo(hDC,(long)nEnlarge*Tn,-(long)nEnlarge*m_Rect.bottom);
	if(pen)
	{
		DeleteObject(pen);
		pen = CreatePen(PS_SOLID,1,RGB(0,0,255));
	}
	SelectObject(hDC,pen);
	MoveToEx(hDC,(long)Tn_Z,(long)Tn_Z,NULL);
	LineTo(hDC,0,(long)Tn_Z);
	if(pen)
	{
		DeleteObject(pen);
		SelectObject(hDC,&pOldPen);
	}
}

BOOL Drawer::SaveBMP()
{
	BITMAPFILEHEADER bmpFHD = {0};
	BITMAPINFOHEADER bmpIFH = {0};
	LPBYTE lpBits = NULL;
	BITMAP bm = {0};
	
	int nRes = GetObject(m_hBitmap,sizeof(BITMAP),&bm);
	
	if(nRes == 0)
	{
		MessageBox(NULL,NULL,"存储信息错误!",MB_OK);
		return FALSE;
	}

	bmpIFH.biBitCount = bm.bmBitsPixel;
	bmpIFH.biHeight = bm.bmHeight;
	bmpIFH.biWidth = bm.bmWidth;
	bmpIFH.biSize = sizeof(BITMAPINFOHEADER) + bmpIFH.biClrUsed*sizeof(RGBQUAD);
	bmpIFH.biSizeImage = bm.bmWidthBytes*bm.bmHeight;
	bmpIFH.biPlanes = 1;
	
	lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED,bmpIFH.biSizeImage);
	
	if(!lpBits)
	{
		MessageBox(NULL,NULL,"分配内存错误!",MB_OK);
		return FALSE;
	}
	
	if(!GetDIBits(m_hDC,m_hBitmap,0,(WORD)bmpIFH.biHeight,lpBits,(BITMAPINFO*)&bmpIFH,DIB_RGB_COLORS))
	{
		MessageBox(NULL,NULL,"获取图片信息出错",MB_OK);
		return FALSE;
	}

	HANDLE hf;
	hf = CreateFile("D:\\1.bmp",GENERIC_READ | GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hf == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	bmpFHD.bfType = 0x4D42;
	bmpFHD.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpIFH.biSize ;//+ bmpIFH.biClrUsed*sizeof(RGBQUAD); 
	bmpFHD.bfSize = sizeof(BITMAPFILEHEADER) + bmpIFH.biSize + bmpIFH.biSizeImage;
	bmpFHD.bfReserved1 = bmpFHD.bfReserved2 = 0;
	
	DWORD lpTmp;
	if(!WriteFile(hf,(LPVOID)&bmpFHD,sizeof(BITMAPFILEHEADER),&lpTmp,NULL))
	{
		MessageBox(NULL,"写头文件出错",NULL,MB_OK);
		return FALSE;
	}
	if(!WriteFile(hf,(LPVOID)&bmpIFH,sizeof(BITMAPINFOHEADER) + bmpIFH.biClrUsed*sizeof(RGBQUAD),&lpTmp,NULL))
	{
		MessageBox(NULL,"写头文件信息出错",NULL,MB_OK);
		return FALSE;
	}
	if(!WriteFile(hf,(LPVOID)lpBits,bmpIFH.biSizeImage,&lpTmp,NULL))
	{
		MessageBox(NULL,"写头文件内容出错",NULL,MB_OK);
		return FALSE;
	}

	if(!CloseHandle(hf))
	{
		return FALSE;
	}
	return TRUE;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -