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

📄 mandelbrotdlg.cpp

📁 分形算法与设计第六章的程序源代码。全部运行通过。
💻 CPP
字号:
// MandelbrotDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Mandelbrot.h"
#include "MandelbrotDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMandelbrotDlg dialog

CMandelbrotDlg::CMandelbrotDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMandelbrotDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMandelbrotDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	/************************************************************************/
	pl=0.5;
	ps=-2.0;
	ql=1.3;
	qs=-1.3;
	K=100;
	m=500;
	Mx=0;
	My=0;
	/************************************************************************/
	
	/************************************************************************/
	xs = -1.5; 
	xl = 1.5; 
	ys = -1.5; 
	yl = 1.5;
	/************************************************************************/
}

void CMandelbrotDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMandelbrotDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMandelbrotDlg, CDialog)
	//{{AFX_MSG_MAP(CMandelbrotDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMandelbrotDlg message handlers

BOOL CMandelbrotDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	/************************************************************************/
	//获取窗口大小
	GetClientRect(&m_Rect);
	//得到物理画布1
	m_DC1.Attach(::GetDC(*this));
	m_DC1.SetViewportExt(m_Rect.Width()/2, m_Rect.Height());
	//得到物理画布2
	m_DC2.Attach(::GetDC(*this));
	m_DC2.SetViewportOrg(m_Rect.Width()/2, 0);
	m_DC2.SetViewportExt(m_Rect.Width()/2, m_Rect.Height());
	
	//创建内存画布1
	m_MemDC1.CreateCompatibleDC(&m_DC1);
	m_Bitmap1.CreateCompatibleBitmap(&m_DC1, m_Rect.Width()/2, m_Rect.Height());
	m_MemDC1.SelectObject(&m_Bitmap1);

	//创建内存画布2
	m_MemDC2.CreateCompatibleDC(&m_DC2);
	m_Bitmap2.CreateCompatibleBitmap(&m_DC2, m_Rect.Width()/2, m_Rect.Height());
	m_MemDC2.SelectObject(&m_Bitmap2);

	Mx = m_Rect.Width()/2;
	My = m_Rect.Height();
	DrawMandel();
	/************************************************************************/
	

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMandelbrotDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		/************************************************************************/
		m_DC1.BitBlt(0, 0, m_Rect.Width()/2, m_Rect.Height(), 
			&m_MemDC1, 0, 0, SRCCOPY);
		m_DC2.BitBlt(0, 0, m_Rect.Width()/2, m_Rect.Height(), 
			&m_MemDC2, 0, 0, SRCCOPY);
		/************************************************************************/		
		CDialog::OnPaint();
	}
}

HCURSOR CMandelbrotDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//绘制M集
void CMandelbrotDlg::DrawMandel()
{
	double x0,y0,pk,qk,r,p0,q0,p,q;
	int H,k,np,nq;
	
	p=(pl-ps)/Mx;
	q=(ql-qs)/My;
	for(np=0;np<=Mx;np++)
	{
		for(nq=0;nq<=My;nq++)
		{  x0=ps+np*p;
		y0=qs+nq*q;
		k=0,p0=q0=0;
loop1:
		pk=p0*p0-q0*q0+x0;
		qk=2*p0*q0+y0;
		k=k+1;
		r=pk*pk+qk*qk;
		p0=pk,q0=qk;
		if(r>m){
			H=k;
			goto loop2;}
		if(k==K){
			H=int(r*1);goto loop2;}
		if(r<=m && k<K) goto loop1;
loop2:
		m_MemDC1.SetPixel(np,nq,H*1000);
		}		 
		
	}
}

//绘制J集
void CMandelbrotDlg::DrawJulia(double p, double q)
{
	double x0,y0,xb,yb,xk,yk,r;
	int H,k,nx,ny;
	
	xb = (xl - xs) / Mx;
    yb = (yl - ys) / My;
	for(nx=0;nx<=Mx;nx++)
	{
		for(ny=0;ny<=My;ny++)
			
		{  x0=xs+nx*xb;
		y0=ys+ny*yb;
		k=0;
loop1:
		xk=x0*x0-y0*y0+p;
		yk=2*x0*y0+q;
		k=k+1;
		r=xk*xk+yk*yk;
		x0=xk,y0=yk;
		if(r>m){
			H=k;
			goto loop2;}
		if(k==K){
			H=int(r*10);goto loop2;}
		if(r<=m && k<K) goto loop1;
loop2:
		m_MemDC2.SetPixel(nx,ny,H*1000);
		}		 
		
	}
}

//单击时,算出M集中的p,q, 传入J集
void CMandelbrotDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	//DrawJulia(0.32, 0.043);
	if (point.x < m_Rect.Width()/2) {
		double dp = (pl-ps)/Mx;
		double dq = (ql-qs)/My;
		DrawJulia(ps+dp*point.x, qs+dq*point.y);
	}

	CDialog::OnLButtonDown(nFlags, point);
	InvalidateRect(NULL, FALSE);
}

⌨️ 快捷键说明

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