📄 fractal.cpp
字号:
// Fractal.cpp: implementation of the CFractal class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "decompress.h"
#include "Fractal.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFractal::CFractal()
{
}
//Range矩阵的赋值
CFractal::CFractal(int **R)
{
Range=R;
flag=0; //标志默认为0,即4*4的矩阵块
}
CFractal::~CFractal()
{
}
//Domain矩阵
void CFractal::DomainJuZhen()
{
if(flag==0) //4*4的矩阵块
{
xChaZhi=4;
yChaZhi=4;//一般xChaZhi与yChaZhi相等
}
else //2*2的矩阵块
{
xChaZhi=2;
yChaZhi=2;
}
int i,j;
Domain=new int*[xChaZhi];
for(i=0;i<xChaZhi;i++)
Domain[i]=new int[yChaZhi];
TempDomain=new int*[xChaZhi];
for(i=0;i<xChaZhi;i++)
TempDomain[i]=new int[yChaZhi];
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
CDecompressDoc *pCurrentDoc=(CDecompressDoc *)pMain->GetActiveDocument();
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
TempDomain[i][j]=Domain[i][j]=pCurrentDoc->Coefficient[lx+i][ly+j];
}
}
}
//求匹配误差
float CFractal::JiShuangWuCha(float* aa,float* gg)
{
float N=xChaZhi*yChaZhi;
int i,j;
double sum=0;
double temp;
*aa=JiShuangA();
*gg=JiShuangG();
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
temp=a*Domain[i][j]+g-Range[i][j];
temp=pow(temp,2);
sum+=temp;
}
}
float WuCha=sum/N;
return WuCha;
}
//计算对比度因子a
float CFractal::JiShuangA()
{
int N=xChaZhi*yChaZhi;
long int temp=RangeDomainSum();
temp=N*temp;
long int R=RangeSum();
long int D=DomainSum();
temp=temp-R*D;
long int DDtemp=N*DomainDomainSum();
long int Dtemp=pow(DomainSum(),2);
DDtemp=DDtemp-Dtemp;
float a=temp/DDtemp;
return a;
}
//计算亮度偏移因子
float CFractal::JiShuangG()
{
float N=xChaZhi*yChaZhi;
long int R=RangeSum();
long int D=DomainSum()*JiShuangA();
long int temp=R-D;
float g=temp/N;
return g;
}
//求Range和Domain各项乘积的和
long int CFractal::RangeDomainSum()
{
long int sum=0;
int i,j;
for(i=0;i<xChaZhi;i++)
for(j=0;j<yChaZhi;j++)
sum+=Range[i][j]*Domain[i][j];
return sum;
}
//求Range各项之和
long int CFractal::RangeSum()
{
long int sum=0;
int i,j;
for(i=0;i<xChaZhi;i++)
for(j=0;j<yChaZhi;j++)
sum+=Range[i][j];
return sum;
}
//求Domain各项之和
long int CFractal::DomainSum()
{
long int sum=0;
int i,j;
for(i=0;i<xChaZhi;i++)
for(j=0;j<yChaZhi;j++)
sum+=Domain[i][j];
return sum;
}
////求Domain与Domain各项乘积之和
long int CFractal::DomainDomainSum()
{
long int sum=0;
int i,j;
for(i=0;i<xChaZhi;i++)
for(j=0;j<yChaZhi;j++)
sum+=pow(Domain[i][j],2);
return sum;
}
float CFractal::BianHuan0(float* aa,float* gg) //变换0:旋转0度
{
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan1(float* aa,float* gg) //变换1:X轴方向旋转180度
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[xChaZhi-i-1][j];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan2(float* aa,float* gg) //变换2:Y轴方向旋转180度
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[i][yChaZhi-j-1];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan3(float* aa,float* gg) //变换3:旋转180度
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[xChaZhi-i-1][yChaZhi-j-1];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan4(float* aa,float* gg) //变换4:旋转到与y=x直线对称
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[j][i];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan5(float* aa,float* gg) //变换5:逆时针90度旋转
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[yChaZhi-j-1][i];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan6(float* aa,float* gg) //变换6:逆时针270度旋转
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[j][xChaZhi-i-1];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::BianHuan7(float* aa,float* gg) //变换7:旋转至与y=-x直线对称
{
int i,j;
for(i=0;i<xChaZhi;i++)
{
for(j=0;j<yChaZhi;j++)
{
Domain[i][j]=TempDomain[yChaZhi-j-1][xChaZhi-i-1];
}
}
return JiShuangWuCha(aa,gg);
}
float CFractal::FindMinWuCha()
{
float a0,g0;
float a1,g1;
float a2,g2;
float a3,g3;
float a4,g4;
float a5,g5;
float a6,g6;
float a7,g7;
float MinWuCha=BianHuan0(&a0,&g0);
a=a0;
g=g0;
BhJuZhen=0;
if(MinWuCha>BianHuan1(&a1,&g1))
{
MinWuCha=BianHuan1(&a1,&g1);
a=a1;
g=g1;
BhJuZhen=1;
}
else if(MinWuCha>BianHuan2(&a2,&g2))
{
MinWuCha=BianHuan2(&a2,&g2);
a=a2;
g=g2;
BhJuZhen=2;
}
else if(MinWuCha>BianHuan3(&a3,&g3))
{
MinWuCha=BianHuan3(&a3,&g3);
a=a3;
g=g3;
BhJuZhen=3;
}
else if(MinWuCha>BianHuan4(&a4,&g4))
{
MinWuCha=BianHuan4(&a4,&g4);
a=a4;
g=g4;
BhJuZhen=4;
}
else if(MinWuCha>BianHuan5(&a5,&g5))
{
MinWuCha=BianHuan5(&a5,&g5);
a=a5;
g=g5;
BhJuZhen=5;
}
else if(MinWuCha>BianHuan6(&a6,&g6))
{
MinWuCha=BianHuan6(&a6,&g6);
a=a6;
g=g6;
BhJuZhen=6;
}
else if(MinWuCha>BianHuan7(&a7,&g7))
{
MinWuCha=BianHuan7(&a7,&g7);
a=a7;
g=g7;
BhJuZhen=7;
}
return MinWuCha;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -