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

📄 遗传算法图案dlg.cpp

📁 基于遗传算法的图案生成程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 遗传算法图案Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "遗传算法图案.h"
#include "遗传算法图案Dlg.h"
#include "math.h"
//#include "time.h"
#include "afxwin.h"
#define XX 14
#define YY 41
#define QUEUEN 32000//队列大小
#define CBBL 3//1/CBBL的概率向外传播
#define ZDZS 25//最大磁力指数

#define MX 781 //窗口宽
#define MY 488//窗口高

#define BF 15//色度摆动幅度
#define AA 100//变异方向的扭曲幅度

#define DIR 18////每个点的变异方向总数,0,1黑;2,3白;4,5,6,7,8,9其他单色,其他为渐变
#define MD 100//橡皮泥半宽度
#define QFBJ 100//起伏半径
#define CLKD 50//磁力场画法时的宽度

#define FXCBBJ 5//方向传播半径
#define YSCBBJ 80//颜色传播半径

unsigned char newmat[MX][MY][3];//新矩阵
unsigned char oldmat[MX][MY][3];//老矩阵
unsigned char *newp,*oldp;//新老指针
char used[MX][MY];//点使用标志

int queue[QUEUEN];//队列

CUIntArray across_point;//交叉点对
char variance_dir[MX][MY];//每个点的变异方向

long gravitation[MX][MY];//磁力场
unsigned char weight[MX][MY];//每点的权
CUIntArray particle;//质点

CByteArray mpmb;//磨平模板
int mpmbh;

char mpbj;//抹平半径
double sclc;//磁力场指数
char qfks;//起伏块数
char xpnks;//橡皮泥块数
char clcs;//磁力场点数

int mx,my;//权最大值点

char count=0;//操作计数器

unsigned char xpnt[2*MD+1][3];//橡皮泥条
unsigned char pjxpnt[2*MD+1][3];//平均橡皮泥条



int seed;//初始化随机数序列种子
int colony;//初始群体规模
int times;//生物年代
int acrossn;//一代选择交叉对数
char cloner;//克隆权重
char variancer;//变异权重
char cvp;//一个点产生克隆变异的概率

char hxfg,zxfg;//横向分割,纵向分割,颜色变化速度
int sbcc;//渗变层次







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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Control(pDX, IDC_title, m_title);
	DDX_Control(pDX, IDC_draw, m_draw);
	DDX_Control(pDX, IDC_sclcs, m_sclcs);
	DDX_Control(pDX, IDC_BUTTON3, m_right);
	DDX_Control(pDX, IDC_BUTTON2, m_left);
	DDX_Control(pDX, IDC_xpnks, m_xpnks);
	DDX_Control(pDX, IDC_qfks, m_qfks);
	DDX_Control(pDX, IDC_sclc, m_sclc);
	DDX_Control(pDX, IDC_xpn, m_xpn);
	DDX_Control(pDX, IDC_qf, m_qf);
	DDX_Control(pDX, IDC_mpbj, m_mpbj);
	DDX_Control(pDX, IDC_save, m_save);
	DDX_Control(pDX, IDC_clc, m_clc);
	DDX_Control(pDX, IDC_mp, m_mp);
	DDX_Control(pDX, IDC_zxfg, m_zxfg);
	DDX_Control(pDX, IDC_sbcc, m_sbcc);
	DDX_Control(pDX, IDC_hxfg, m_hxfg);
	DDX_Control(pDX, IDC_PROGRESS1, m_jdt);
	DDX_Control(pDX, IDC_cvp, m_cvp);
	DDX_Control(pDX, IDC_pic, m_pic);
	DDX_Control(pDX, IDC_acrossn, m_acrossn);
	DDX_Control(pDX, IDC_cloner, m_cloner);
	DDX_Control(pDX, IDC_colony, m_colony);
	DDX_Control(pDX, IDC_variancer, m_variancer);
	DDX_Control(pDX, IDC_times, m_times);
	DDX_Control(pDX, IDC_seed, m_seed);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_draw, Ondraw)
	ON_BN_CLICKED(IDC_save, Onsave)
	ON_NOTIFY(UDN_DELTAPOS, IDC_colony, OnDeltaposcolony)
	ON_BN_CLICKED(IDC_mp, Onmp)
	ON_BN_CLICKED(IDC_clc, Onclc)
	ON_BN_CLICKED(IDC_qf, Onqf)
	ON_BN_CLICKED(IDC_xpn, Onxpn)
	ON_BN_CLICKED(IDC_BUTTON2, Onleft)
	ON_BN_CLICKED(IDC_BUTTON3, Onright)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_seed.SetBuddy(GetDlgItem(IDC_Eseed));
	m_colony.SetBuddy(GetDlgItem(IDC_Ecolony));
	m_times.SetBuddy(GetDlgItem(IDC_Etimes));
	m_acrossn.SetBuddy(GetDlgItem(IDC_Eacrossn));
	m_cloner.SetBuddy(GetDlgItem(IDC_Ecloner));
	m_variancer.SetBuddy(GetDlgItem(IDC_Evariancer));
	m_cvp.SetBuddy(GetDlgItem(IDC_Ecvp));
	m_hxfg.SetBuddy(GetDlgItem(IDC_Ehxfg));
	m_zxfg.SetBuddy(GetDlgItem(IDC_Ezxfg));
	m_sbcc.SetBuddy(GetDlgItem(IDC_Esbcc));
	m_mpbj.SetBuddy(GetDlgItem(IDC_Emp));
	m_sclc.SetBuddy(GetDlgItem(IDC_Eclc));
	m_qfks.SetBuddy(GetDlgItem(IDC_Eqfks));
	m_xpnks.SetBuddy(GetDlgItem(IDC_Expnks));
	m_sclcs.SetBuddy(GetDlgItem(IDC_Eclcs));

	m_sclc.SetRange(1,20);//(+6)/10;
	m_qfks.SetRange(1,20);
	m_xpnks.SetRange(4,20);
	m_sclc.SetPos(10);
	m_qfks.SetPos(10);
	m_xpnks.SetPos(10);
	m_seed.SetRange(-1,10000);
	m_seed.SetPos(-1);
	m_colony.SetRange(500,2000);
	m_colony.SetPos(1000);
	m_times.SetRange(20,100);
	m_times.SetPos(50);////////////////////////////
	m_acrossn.SetRange(250,1000);
	m_acrossn.SetPos(500);
	m_cloner.SetRange(1,10);
	m_variancer.SetRange(1,10);
	m_cloner.SetPos(5);
	m_variancer.SetPos(5);
	m_cvp.SetRange(1,10);
	m_cvp.SetPos(5);
	m_jdt.SetRange(0,100);
	m_hxfg.SetRange(4,20);
	m_zxfg.SetRange(3,16);
	m_sbcc.SetRange(50,1000);///////////////
	m_hxfg.SetPos(10);
	m_zxfg.SetPos(8);
	m_sbcc.SetPos(200);///////////////////
	m_mpbj.SetRange(1,10);
	m_mpbj.SetPos(2);
	m_sclc.SetRange(1,ZDZS);///10.;
	m_qfks.SetRange(3,10);
	m_xpnks.SetRange(4,20);
	m_sclc.SetPos(ZDZS/2);
	m_qfks.SetPos(2);
	m_xpnks.SetPos(10);


	m_mp.EnableWindow(FALSE);
	m_save.EnableWindow(FALSE);
	m_clc.EnableWindow(FALSE);
	m_qf.EnableWindow(FALSE);
	m_xpn.EnableWindow(FALSE);
	m_left.EnableWindow(FALSE);
	m_right.EnableWindow(FALSE);
	m_sclcs.SetRange(1,40);
	m_sclcs.SetPos(10);

	srand(time(NULL));
	//m_draw.SetFocus();





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

void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{	CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{	CDialog::OnSysCommand(nID, lParam);
	}
}

// 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 CMyDlg::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
	{	CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void initrgbmat();//初始化rgb矩阵
void initdir();
void dsb1();//一代渗变,随机
void dsb2();//一代渗变,竞争

void initpart();
void move_point();//移动指针
void tydir();//同一方向
void clrnewp();
void trans();
void xpn1(int,int,int,char);
void xpn2(int,int,int,char);

void initweight();
void findmax(char f);
int aver1(int,int,int);
int aver2(int,int,int);


void CMyDlg::Ondraw() 
{
	// TODO: Add your control notification handler code here
	int i;
	m_mp.EnableWindow(FALSE);
	m_save.EnableWindow(FALSE);
	m_clc.EnableWindow(FALSE);
	m_qf.EnableWindow(FALSE);
	m_xpn.EnableWindow(FALSE);
	m_left.EnableWindow(FALSE);
	m_right.EnableWindow(FALSE);
	read();//读入控制参数
	if(seed>=0)  srand(seed);
	across_point.SetSize(4*acrossn);//分配内存
	initrgbmat();//初始化rgb矩阵
	initweight();//初始化权
	initdir();//初始化颜色变异方向
	myclear();
	count=0;///////////
	/*CString s;
	CClientDC p(this);
	RECT k;
	m_pic.GetWindowRect(&k);
	s.Format("%d %d",k.bottom-k.top,k.right-k.left);
	p.TextOut(22,22,s);*/
	/*CClientDC p(this);
	int x,y;
	for(x=0;x<MX;x++)
		for(y=0;y<MY;y++)
			if(variance_dir[x][y]==8)
			  p.SetPixelV(XX+x,YY+y,65536*rgbmat[x][y][0]+256*rgbmat[x][y][1]
				            +rgbmat[x][y][2]);*/
	for(i=0;i<times;i++)
	{
		dsb2();//一代渗变
		clone_or_variance();//克隆或变异
		select_across();//选择交叉
		findmax(0);//找最大权点,将其颜色变异方向传播
		m_jdt.SetPos((int)(100*(i+1)/times+0.5));
	}
	for(i=0;i<10;i++)
	{		
		findmax(1);//找最大权点,将其颜色传播
	}

	m_mp.EnableWindow(TRUE);
	m_save.EnableWindow(TRUE);
	m_clc.EnableWindow(TRUE);
	m_qf.EnableWindow(TRUE);
	m_xpn.EnableWindow(TRUE);

}
void initweight()
{
	int i,j;
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
			weight[i][j]=1+rand()%5;
}

void tydir()
{
	int m,n;
	for(m=0;m<MX;m++)
		for(n=0;n<MY;n++)
			variance_dir[m][n]=8;
}


void CMyDlg::Onsave() 
{
	// TODO: Add your control notification handler code here
	CString path;
	CClientDC p(this);
	CFile fp;
	long l;int i,j;char f;
	CFileDialog cf(FALSE,"BMP",NULL,OFN_CREATEPROMPT|OFN_OVERWRITEPROMPT,NULL,NULL);
	if(cf.DoModal()==IDOK)
	{	path=cf.GetPathName();
	    //p.TextOut(33,44,path);
	    fp.Open(path,CFile::modeCreate|CFile::modeWrite);
	    BITMAPFILEHEADER bf;
	    BITMAPINFOHEADER bi;
	    bf.bfType=0x4d42;
	    bf.bfReserved1=0;
	    bf.bfReserved2=0;
    	bf.bfOffBits=54L;
	    bi.biSize=40L;
	    bi.biWidth=(long)MX;
	    bi.biHeight=(long)MY;
	    bi.biPlanes=1;
	    bi.biBitCount=24;
	    bi.biCompression=BI_RGB;
	    bi.biXPelsPerMeter=1024L;
	    bi.biYPelsPerMeter=768L;
	    bi.biClrUsed=0L;
	    bi.biClrImportant=0;
        fp.Write(&bf,14);
	    fp.Write(&bi,40);
	    l=0L;
	    for(j=MY-1;j>=0;j--)
		{
		    for(i=0;i<MX;i++)
			{	
		    	fp.Write(&(newmat[i][j][0]),1);
    		    fp.Write(&(newmat[i][j][1]),1);
			    fp.Write(&(newmat[i][j][2]),1);
			    l+=3;
			}
		    while(l%4)
			{f=0;fp.Write(&f,1);l++;}
		}
	bf.bfSize=54+l;
	bi.biSizeImage=l;
	fp.SeekToBegin();
	fp.Write(&bf,14);
	fp.Write(&bi,40);
	fp.Close();

⌨️ 快捷键说明

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