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