📄 遗传算法图案dlg.cpp
字号:
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 + -