📄 mandelbrotdlg.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 + -