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

📄 遗传算法图案dlg.cpp

📁 基于遗传算法的图案生成程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
		{
			s=0L;
			for(m=0;m<clcs;m++)
			{
				d=jl(i,j,particle[3*m],particle[3*m+1]);
				if(d<1) s+=(cs*particle[3*m+2]);
				else  s+=(cs*particle[3*m+2]/sum(d,sclc));/////积分
			}
			if(max<s) max=s;
			gravitation[i][j]=s;
			m_jdt.SetPos(100*(i*MY+j+1)/(MX*MY)+0.5);
		}
	//rr=(rand()%40+5)/100.;
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
		    for(m=0;m<3;m++)
			    newp[3*(i*MY+j)+m]=(g_to_c(gravitation[i][j],max)+oldp[3*(i*MY+j)+m])%256;
			    	//rr*g_to_c(gravitation[i][j],max)+(1-rr)*oldp[3*(i*MY+j)+m];
	draw_newp();
	m_mp.EnableWindow(TRUE);
	m_save.EnableWindow(TRUE);
	m_qf.EnableWindow(TRUE);
	m_xpn.EnableWindow(TRUE);
	m_left.EnableWindow(TRUE);
	m_right.EnableWindow(FALSE);

	count=1-count;//磨平,磁力场,起伏,橡皮泥四种操作的计数


	
}

void clrused()
{
	int m,n;
	for(m=0;m<MX;m++)
		for(n=0;n<MY;n++)
			used[m][n]=0;
}


void CMyDlg::Onqf() //起伏,用队列
{
	// TODO: Add your control notification handler code here
	m_mp.EnableWindow(FALSE);
	m_save.EnableWindow(FALSE);
	m_clc.EnableWindow(FALSE);
	m_xpn.EnableWindow(FALSE);
	move_point();//移动指针
	clrnewp();
	qfks=m_qfks.GetPos();
	int i,m,n,c,u,v,a,b,dv,q;
	int k,sx[4];
	long h,e;//队列的头尾
	for(i=0;i<qfks;i++)
	{
		m=rand()%MX;n=rand()%MY;//起伏点
		dv=variance_dir[m][n];
		//if(dv==8) {i--;continue;}//均值部分不起伏
		clrused();//清空使用标志
		h=0L;e=2L;
		queue[0]=m;queue[1]=n;
		while(h!=e)
		{	
			
			a=queue[h];b=queue[h+1];//读取
			for(c=0;c<3;c++)			//操作
				if(!newp[3*(a*MY+b)+c])
					newp[3*(a*MY+b)+c]=oldp[3*(a*MY+b)+c]*2%256;
			used[a][b]=1;//使用标志
			h+=2;if(h>=QUEUEN) h%=QUEUEN;
			//随机确定四个方向的顺序
			sx[0]=rand()%4;
			for(c=1;c<4;c++)
			{q=1;
			   while(q)
			   {sx[c]=rand()%4;
			    q=0;
			    for(k=0;k<c;k++)
					if(sx[c]==sx[k])
						q=1;
			   }
			}
			
			for(k=0;k<4;k++)
			{	switch(sx[k])
				{
				case 0:u=a+1;v=b;break;
				case 1:u=a;v=b-1;break;
				case 2:u=a-1;v=b;break;
				case 3:u=a;v=b+1;
				}
				if(u<0||u>MX-1||v<0||v>MY-1) continue;
				if(variance_dir[u][v]==dv&&!used[u][v]&&(e+2)%QUEUEN!=h)
				{
						queue[e]=u;queue[e+1]=v;e+=2;	if(e>=QUEUEN) e%=QUEUEN;
				}
			}
			
		}
	}
	trans();
	draw_newp();
	m_mp.EnableWindow(TRUE);
	m_save.EnableWindow(TRUE);
	m_clc.EnableWindow(TRUE);
	m_xpn.EnableWindow(TRUE);
	m_left.EnableWindow(TRUE);
	m_right.EnableWindow(FALSE);

	count=1-count;//磨平,磁力场,起伏,橡皮泥四种操作的计数

}


/*void CMyDlg::Onqf() //起伏,用堆栈
{
	// TODO: Add your control notification handler code here
	m_mp.EnableWindow(FALSE);
	m_save.EnableWindow(FALSE);
	m_clc.EnableWindow(FALSE);
	m_xpn.EnableWindow(FALSE);
	move_point();//移动指针
	clrnewp();
	qfks=m_qfks.GetPos();
	int i,m,n,c,u,v,a,b,dv;
	int f,k;
	long l;
	for(i=0;i<qfks;i++)
	{
		m=rand()%MX;n=rand()%MY;//起伏点
		dv=variance_dir[m][n];
		f=rand()%2*255;
		clrused();//清空使用标志
		l=2L;
		queue1[0]=m;queue1[1]=n;
		while(l)
		{	
			if(l<=QUEUEN)
			{ a=queue1[l-2];b=queue1[l-1];}//读取
			else
			{  a=queue2[l-QUEUEN-2];b=queue2[l-QUEUEN-1];}//读取

			for(c=0;c<3;c++)			//操作
				if(newp[3*(a*MY+b)+c]==0)
					newp[3*(a*MY+b)+c]=(oldp[3*(a*MY+b)+c]+f)/2;
			used[a][b]=1;//使用标志
			l-=2;
			for(k=0;k<4;k++)
			{	switch(k)
				{
				case 0:u=a+1;v=b;break;
				case 1:u=a;v=b-1;break;
				case 2:u=a-1;v=b;break;
				case 3:u=a;v=b+1;
				}
				if(u<0||u>MX-1||v<0||v>MY-1) continue;
				if(variance_dir[u][v]==dv&&used[u][v]==0&&l<2*QUEUEN)
				{
					if(l<QUEUEN)
					{	queue1[l]=u;queue1[l+1]=v;l+=2;	}
					else
					{   queue2[l-QUEUEN]=u;queue2[l-QUEUEN+1]=v;l+=2;	}
				}
			}
			
		}
	}
	trans();
	draw_newp();
	m_mp.EnableWindow(TRUE);
	m_save.EnableWindow(TRUE);
	m_clc.EnableWindow(TRUE);
	m_xpn.EnableWindow(TRUE);
	m_left.EnableWindow(TRUE);
	m_right.EnableWindow(FALSE);

	count=1-count;//磨平,磁力场,起伏,橡皮泥四种操作的计数

}*/




void CMyDlg::Onxpn() //橡皮泥
{
	// TODO: Add your control notification handler code here
	m_mp.EnableWindow(FALSE);
	m_save.EnableWindow(FALSE);
	m_clc.EnableWindow(FALSE);
	m_qf.EnableWindow(FALSE);
	move_point();//移动指针
	clrnewp();
	char d,dir;
	xpnks=m_xpnks.GetPos();

	int k,x,y;
	for(k=0;k<xpnks;k++)
	{
		x=rand()%MX;y=rand()%MY;//产生一点
		d=5+rand()%(MD-5);///产生宽度
		dir=rand()%4;//产生运动方向
		switch(dir)
		{
		case 0:xpn1(x,y,d,0);break;
		case 1:xpn2(x,y,d,0);break;
		case 2:xpn1(x,y,d,1);break;
		case 3:xpn2(x,y,d,1);
		}
        m_jdt.SetPos(100*(k+1)/xpnks);
	}
	trans();//从oldp传到newp
	draw_newp();
	m_mp.EnableWindow(TRUE);
	m_save.EnableWindow(TRUE);
	m_clc.EnableWindow(TRUE);
	m_qf.EnableWindow(TRUE);
	m_left.EnableWindow(TRUE);
	m_right.EnableWindow(FALSE);
	count=1-count;//磨平,磁力场,起伏,橡皮泥四种操作的计数
	
}
void 	pjxpntf(int d)//平均橡皮泥条
{
	int m,n,x,y;
	for(m=0;m<2*d+1;m++)
	{
		x=m-1;y=m+1;
		if(x<0) x=0;if(y>2*d) y=2*d;
		for(n=0;n<3;n++)
		  pjxpnt[m][n]=(xpnt[x][n]+xpnt[m][n]+xpnt[y][n])/3;
	}
}
			



int aver2(int x,int y, int i)
{
	int m,n,u,v,k=0,p;
	long c=0L;
	for(m=-1;m<2;m++)
		for(n=-1;n<2;n++)
		{
			u=x+m;v=y+n;
			if(u<0||u>MX-1||v<0||v>MY-1) continue;
			p=(int)(oldp[3*(u*MY+v)+i]);
			if(p)
			{	c+=p;k++;}
		}
	if(k==0) return(1);
	else return((int)(c/k));
}

void xpn1(int x,int y,int d,char flag)//向左、右
{
	char f=rand()%2,g=rand()%3,cd=rand()%3;
	int td,c,j;
	int k,tk,l=0,zx,t;
	double r=(1+rand()%4)/2.;
	if(g==0) d/=2;td=d;
	for(k=y-d;k<=y+d;k++)//读入橡皮泥条
	{   tk=k;if(k<0) tk=0;if(k>MY-1) tk=MY-1;
	    for(c=0;c<3;c++)
			xpnt[l][c]=aver2(x,tk,c);
		l++;
	}
	pjxpntf(d);//平均橡皮泥条
	l=0;
	while(td>0)
	{
		for(j=y-td;j<=y+td;j++)//写橡皮泥条
		{
			if(j<0||j>MY-1) continue;
		    for(c=0;c<3;c++)
			  newp[3*(x*MY+j)+c]=(oldp[3*(x*MY+j)+c]+pjxpnt[d+j-y][c])/2;
		}
		l++;
		if(g)	td-=(rand()%(2+cd));//宽度减小
		else    { t=d*d-l*l/(r*r);if(t<1) td=0; else td=sqrt(t);}
		zx=rand()%3;//中心上下移动
		if(zx==0) 
		{	if(f) y--;else  y++;}
		if(flag) x--;else x++;//右移
		if(x<0||x>MX-1||y<0||y>MY-1)
			break;
	}
}

void xpn2(int x,int y,int d,char flag)//向上下
{
	int td,c,i;
	int k,tk,l=0,zx,t;
	double r=(1+rand()%4)/2.;
	char f=rand()%2,g=rand()%3,cd=rand()%3;
	if(g==0) d/=2;td=d;
	for(k=x-d;k<=x+d;k++)//读入橡皮泥条
	{   tk=k;if(k<0) tk=0;if(k>MX-1) tk=MX-1;
	    for(c=0;c<3;c++)
			xpnt[l][c]=aver2(tk,y,c);
		l++;
	}
	pjxpntf(d);//平均橡皮泥条
	l=0;
	while(td>0)
	{
		for(i=x-td;i<=x+td;i++)//写橡皮泥条
		{
			if(i<0||i>MX-1) continue;
		    for(c=0;c<3;c++)
			  newp[3*(i*MY+y)+c]=(oldp[3*(i*MY+y)+c]+pjxpnt[d+i-x][c])/2;
		}
		l++;
		if(g)	td-=((rand()%(2+cd)));//宽度减小
		else    { t=d*d-l*l/(r*r);if(t<1) td=0; else td=sqrt(t);}
		zx=rand()%3;//中心上下移动
		if(zx==0) 
		{	if(f) x--;else  x++;}
		if(flag) y++;else y--;//上移
		if(x<0||x>MX-1||y<0)
			break;
	}
}

void move_point()//移动指针
{
	if(count)
	{
		newp=&(newmat[0][0][0]);
		oldp=&(oldmat[0][0][0]);
	}
	else
	{
		oldp=&(newmat[0][0][0]);
		newp=&(oldmat[0][0][0]);
	}
}


void CMyDlg::Onleft() 
{
	// TODO: Add your control notification handler code here
	move_point();
	draw_newp();
	m_left.EnableWindow(FALSE);
	m_right.EnableWindow(TRUE);
	count=1-count;

}

void CMyDlg::Onright() 
{
	// TODO: Add your control notification handler code here
	move_point();

	draw_newp();
	m_left.EnableWindow(TRUE);
	m_right.EnableWindow(FALSE);
	count=1-count;

}

void clrnewp()//清空新矩阵
{
	int i,j,c;
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
			for(c=0;c<3;c++)
				newp[3*(i*MY+j)+c]=0;
}

void trans()
{
	int i,j,c;
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
			if(!newp[3*(i*MY+j)])
			  for(c=0;c<3;c++)
				newp[3*(i*MY+j)+c]=oldp[3*(i*MY+j)+c];
}

void CMyDlg::draw_newp()
{	int i,j;
	CClientDC p(this);
	for(i=0;i<MX;i++)
		for(j=0;j<MY;j++)
			p.SetPixelV(XX+i,YY+j,newp[3*(i*MY+j)]*65536
			+newp[3*(i*MY+j)+1]*256+newp[3*(i*MY+j)+2]);
}


void CMyDlg::findmax(char f)
{
	int m,n,r,u,v,c,ys[3],dir,a,b,k;
	int max=0;
	char sx[4],q;
	long h,e;//队列的头尾
	long l,rd,t;
	CClientDC p(this);
	mx=0;my=0;
	rd=rand()%((long)MX*MY);//查找最大时的开头随机
	for(l=0L;l<(long)MX*MY;l++)//查找最大
	{   t=(l+rd)%((long)MX*MY);
		if(max<weight[t%MX][t/MX])
			{	max=weight[t%MX][t/MX];
				mx=t%MX;my=t/MX;
			}
	}
	weight[mx][my]=1;//变为最小
	if(f==0) r=1+rand()%FXCBBJ;//方向传播半径
	else     r=1+rand()%YSCBBJ;//颜色传播半径
	if(f==0) dir=0;//dir=variance_dir[mx][my];//f=0时传播的是变异方向
	else
	{	for(c=0;c<3;c++)    //f=1时传播的是颜色
			ys[c]=newmat[mx][my][c];
	}
	clrused();//清空使用标志
	h=0L;e=2L;
	queue[0]=mx;queue[1]=my;
	while(h!=e)
	{	
		a=queue[h];b=queue[h+1];//读取
		if(f==0)                 //操作
		//if(a<0||a>MX-1||b<0||b>MY-1)
		  //p.TextOut(222,333,"MMMMMMMMMMMMMM");//
			variance_dir[a][b]=dir;
		else
		{
			for(c=0;c<3;c++)
				newmat[a][b][c]=(ys[c]+newmat[a][b][c])/2;
			p.SetPixelV(XX+a,YY+b,newmat[a][b][0]*65536
				+newmat[a][b][1]*256+newmat[a][b][2]);
		}
		used[a][b]=1;//使用标志
		h+=2;if(h>=QUEUEN) h%=QUEUEN;
			//随机确定四个方向的顺序
		sx[0]=rand()%4;
		for(c=1;c<4;c++)
		{  q=1;
		   while(q)
		   {sx[c]=rand()%4;
			   q=0;
			   for(k=0;k<c;k++)
				if(sx[c]==sx[k])
				{q=1;break;}
			}
		}
		for(k=0;k<4;k++)
		{	switch(sx[k])
			{
			case 0:u=a+1;v=b;break;
			case 1:u=a;v=b-1;break;
			case 2:u=a-1;v=b;break;
			case 3:u=a;v=b+1;
			}
			if(u<0||u>MX-1||v<0||v>MY-1) continue;
			if(rand()%CBBL==0&&
				sqrt((u-mx)*(u-mx)+(v-my)*(v-my))<r+rand()%(1+r/2)
				&&!used[u][v]
			    &&(e+2)%QUEUEN!=h)
				{
					queue[e]=u;queue[e+1]=v;e+=2;	
					if(e>=QUEUEN) e%=QUEUEN;
				}
		}
			
	}

}

⌨️ 快捷键说明

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