📄 nllbfdlg.cpp
字号:
ofn.hwndOwner = ::GetFocus();
ofn.hInstance = NULL;;
ofn.lpstrFilter = "文本文件(*.txt)\0*.txt\0All Files(*.*)\0*.*\0";
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = FileBName;
ofn.nMaxFile = _MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = _MAX_FNAME;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = "浏览";
ofn.Flags = 0;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = "txt";
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
if(GetOpenFileName(&ofn))
{
m_EditDataInB.SetWindowText(FileBName);
m_EditDataOut.SetWindowText("DataOut.txt");
}
/////如果文件名不为空
if(strlen(FileBName))
{
////读取文件输入文件B的头信息
if((fpIn=fopen(FileBName,"r"))==NULL)
{
strcat(FileBName,".txt");
if((fpIn=fopen(FileBName,"r"))==NULL)
{
MessageBox( "读文件失败!!!",
"信息",
MB_ICONINFORMATION|MB_OK);
}
}
///////读取六行文件头,取得左下角坐标及网格间距//调试成功
for(k=1;k<=12;k++)
fscanf(fpIn,"%s",&szBufStrB[k]);
cols=atoi(szBufStrB[2]);//读取输入文件列数//调试成功
rows=atoi(szBufStrB[4]);//读取输入文件行数//调试成功
xcor=atof(szBufStrB[6]);//读取左下角横坐标//调试成功
ycor=atof(szBufStrB[8]);//读取左下角纵坐标//调试成功
cellsize=atof(szBufStrB[10]);//读取网格间距//调试成功
if (strcmp(szBufStrB[1],"ncols")==0)
{
datamax=0;
datamin=0;
dataaver=0.0;
for(i=1;i<=rows;i++)
{
for(j=1;j<=cols;j++)
{
fscanf(fpIn,"%f",&dtmida);//读取输入数据文件
dataaver=dataaver+dtmida*1.0/(rows*cols);//求平均值
if(dtmida>datamax)//求最大值
datamax=dtmida;
if(dtmida<datamin)//求最小值
datamin=dtmida;
}
}
fclose(fpIn);//关闭文件B
sprintf(szBufMax,"%f",datamax);
sprintf(szBufMin,"%f",datamin);
sprintf(szBufAver,"%f",dataaver);
//sprintf(szBufCols,"%s",sizeof(szBufStrB[1]));
////在文件头信息中输入行数列数和间距
m_EditRows.SetWindowText(szBufStrB[4]);
m_EditCols.SetWindowText(szBufStrB[2]);
m_EditCellSize.SetWindowText(szBufStrB[10]);
m_EditMax.SetWindowText(szBufMax);
m_EditMin.SetWindowText(szBufMin);
m_EditAverage.SetWindowText(szBufAver);
}
else
{
MessageBox( "原始数据文件格式不正确!!!",
"信息",
MB_ICONINFORMATION|MB_OK);
////清空原始数据的信息
m_EditRows.SetWindowText("");
m_EditCols.SetWindowText("");
m_EditCellSize.SetWindowText("");
m_EditMax.SetWindowText("");
m_EditMin.SetWindowText("");
//sprintf(szBufDataIna,"%s","");
m_EditDataInB.SetWindowText("");
//sprintf(szBufDataOut,"%s","");
}
}
}
//void CNllbfDlg::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
//{
// // TODO: Add your control notification handler code here
// COleDateTime dtChosenTime;
// switch(pNMHDR->idFrom)
// {
// case IDC_TIMER:
// m_MyTime.GetTime(dtChosenTime);
// m_Time.SetWindowText(dtChosenTime.Format("%M:%S"));
// break;
//
// }
// *pResult = 0;/
//}
BOOL CNllbfDlg::ADD(char szBufFileIn[],char szBufFileOut[])
{
////显示等待提示框
m_Status.SetWindowText("程序正在计算,请耐心等待...");
////分配数组空间
//CArray<float,float> DTR;//用于参数设置文件
CArray<float,float> DTIN[ROWS_MAX];//用于原始数据文件
//CArray<float,float> DTN;//用于输出数据文件
//CArray<float,float> DTX;//用于存放X数据
//CArray<float,float> DTY;//用于存放Y数据
//CArray<float,float> DTFDV[ROWS_MAX];//用于存放分维值Fractal Dimension Value
//CArray<float,float> DTCORX[ROWS_MAX];//用于存放各分区的中心横向坐标
//CArray<float,float> DTCORY[ROWS_MAX];//用于存放各分区的中心纵向坐标
int cols,rows,panum,midnum;//横向和纵向的间距及行数和列数对分区数取模的余数
//intev=0;inteh=0;modv=0;modh=0;
double xcor,ycor,cellsize,xtcor,ytcor,newxcor,newycor;
xcor=0.0;ycor=0.0;cellsize=0.0;
int i,j,l,n,m,p,q;//循环变量
i=0;j=0;k=0;l=0;
float x[10],y[10],ab[4],dt[3];
static int corrnum;//最终分界点的位置数;
float result,dtmidc;
int intever,intehor,pntver,pnthor;//纵向间距,横向间距,纵向滑过点数,横向滑动点数
int numver,numhor,modver,modhor;//纵向及横向分区的个数
float corrst;
static int num; //大于指定含量的元素个数
int mp,np,mr,nr;
intever=32;//滑动窗口纵向点数
intehor=32;//滑动窗口横向点数
mp=intever;//二维FFT纵向点数
np=intehor;//二维FFT横向点数
mr=2;//横向点数2次方,不参与计算
nr=2;//纵向点数2次方,不参与计算
pntver=16;//纵向滑动的点数
pnthor=16;//横向滑动的点数
numver=1;//初始纵向分区数
numhor=1;//初始横向分区数
modver=0;//初始纵向取模
modhor=0;//初始横向取模
//////*************************工作正式开始******************************************************
////给输入数据赋初值为零(分配空间)
for(i=0;i<=2000;i++)
{
DTIN[i].SetSize(COLS_MAX,COLS_MAX);//原始数据
// DTCORX[i].SetSize(COLS_MAX,COLS_MAX);
// DTCORY[i].SetSize(COLS_MAX,COLS_MAX);
// DTFDV[i].SetSize(COLS_MAX,COLS_MAX);
}
//////////////************读入原始数据的头信息数据*************************************
////打开原始数据文件
if((fpIn=fopen(szBufDataIn,"r"))==NULL)
{
strcat(szBufDataIn,".txt");
if((fpIn=fopen(szBufDataIn,"r"))==NULL)
{
MessageBox( "读文件失败!!!",
"信息",
MB_ICONINFORMATION|MB_OK);
return FALSE;
}
}
///////读取六行文件头,取得左下角坐标及网格间距//调试成功
for(k=1;k<=12;k++)
fscanf(fpIn,"%s",&szBufStrB[k]);
cols=atoi(szBufStrB[2]);//读取输入文件列数//调试成功
rows=atoi(szBufStrB[4]);//读取输入文件行数//调试成功
xcor=atof(szBufStrB[6]);//读取左下角横坐标//调试成功
ycor=atof(szBufStrB[8]);//读取左下角纵坐标//调试成功
cellsize=atof(szBufStrB[10]);//读取网格间距//调试成功
//左上角坐标
xtcor=xcor;
ytcor=ycor+rows*cellsize;
///求分区的个数
modver=(rows-intever)%pntver;//纵向求余
numver=int((rows-intever-modver)/pntver)+1;//纵向分区个数
if(numver==0)
{
numver=1;
}
modhor=(cols-intehor)%pnthor;//横向求余
//numhor=int((cols-intehor-modhor)/pnthor);//横向分区个数
numhor=int((cols-intehor-modhor)/pnthor)+1;//横向分区个数
if(numhor==0)
{
numhor=1;
}
////*****************8开始读入数据文件A******************************
for(i=1;i<=rows;i++)
{
for(j=1;j<=cols;j++)
{
fscanf(fpIn,"%f",&dtmida);
DTIN[i].SetAtGrow(j,dtmida);
}
}
fclose(fpIn);//关闭文件A
/////读入各分区数据
float c[10];//存放系数,c[0]-常数项,c[1]-一次项系数,c[2]-分维数
CNumber *scd;//分区复数数据,sectional complex data
scd=new CNumber[(mp+1)*(np+1)];
float dtxcor[100][100],wn[500],spd[500];
float dtycor[100][100];
///打开或新建一个文件以输出数据
if((fpOut =fopen(szBufDataOut,"w"))==NULL)
{
strcat(szBufDataOut,".txt");
if((fpOut=fopen(szBufDataOut,"r"))==NULL)
{
MessageBox("写文件失败!!!", "信息",MB_ICONINFORMATION|MB_OK);
return FALSE;
}
}
//****计算每个分区数据的分维值并输出
for(k=1;k<=numver;k++)//纵向分区的个数
{
for(p=1;p<=numhor;p++)//横向分区的个数
{
//分区数据块赋值
for(i=1;i<=mp;i++)//纵向间隔
{
for(j=1;j<=np;j++)//横向间隔
{
scd[(i-1)*mp+j].re=DTIN[i+(k-1)*pntver][j+(p-1)*pnthor];//通过
scd[(i-1)*mp+j].im=0.0;
}
}
////求分区中心坐标
newxcor=xtcor+(intehor/2.0+(k-1)*pnthor)*cellsize;
newycor=ytcor-(intever/2.0+(p-1)*pntver)*cellsize;
dtxcor[k][p]=newxcor;
dtycor[k][p]=newycor;
//二维付立叶正变换//通过
fft2d(scd,mp,np,mr,nr,1);
//功率谱密度,返回块数据的分维数
specd(scd,mp,np,mr,nr,3.2,&wn[0],&spd[0],&c[0]);
//最小二乘求分维值
//ercheng(&wn[1],&spd[1],&c[0],mp);//y=c[1]*x+c[0],通过
//c[2]=4.0+c[1]/2.0;//分维值,据吴小羊
//tdta=1.0-c[1];
//tdta=abs(tdta);
//c[2]=3.5-tdta/2.0;//据李桐林
///*
//**********开始,检查功率谱及波数的正确性*******
int ilng;
ilng=int(c[7]);
for(i=1;i<=ilng;i++)
{
//fprintf(fpOut,"%f ", wn[i]);//输出一次项系数
fprintf(fpOut,"%f ", spd[i]);//输出一次项系数
}
//**********结束,检查功率谱及波数的正确性*******
//*/
fprintf(fpOut,"%f, ", float(newxcor));//输出X坐标
fprintf(fpOut,"%f, ", float(newycor));//输出Y坐标
//fprintf(fpOut,"%f ",c[0]);//输出常数项
fprintf(fpOut,"%f ", c[1]);//输出一次项系数
fprintf(fpOut,"%f ", c[2]);//输出分维值
fprintf(fpOut,"%f ", c[3]);//minr
fprintf(fpOut,"%f ", c[4]);//maxr
//fprintf(fpOut,"%f ", c[5]);//输出分维值
fprintf(fpOut,"%f ", c[6]);//数组spd不为零的个数
fprintf(fpOut,"%f ", c[7]);//数组spd不为零的个数
fprintf(fpOut,"\n");
}
}
fclose(fpOut);//关闭文件
//////删除各数组中的元素
for(i=0;i<=rows+10;i++)
{
DTIN[i].RemoveAll();
}
return TRUE;
}//ADD function end
//*********最小二乘法拟合直线函数**********//
// y=a[0]+a[1]*x //
// x[]:输入X数据 //
// y[]:输入Y数据 //
// a[]:存放系数 //
// m:数据个数 //
// //
//*****************************************//
void CNllbfDlg::ercheng(float x[], float y[], float a[], int m)
{
int i;
float averx,avery,mida,midb;
averx=0.0;
avery=0.0;
mida=0.0;
midb=0.0;
a[0]=0.0;
a[1]=0.0;
//求出X和Y数据的平均值averx,avery
for(i=0;i<=m-1;i++)//下标从1开始
{
averx=averx+x[i]*1.0/m;
avery=avery+y[i]*1.0/m;
}
//求一次项系数a[1]
for(i=0;i<=m-1;i++)//下标从1开始
{
mida=mida+(x[i]-averx)*(y[i]-avery);
midb=midb+(x[i]-averx)*(x[i]-averx);
}
a[1]=mida*1.0/midb;
a[0]=avery-a[1]*averx;//常数,(零次项系数)
return;
}
//************************************************//
//******* 基2FFT整序算法 ***********//
//名称:reoredr
//参数说明:
//x为CNumber型的时域指针
//n为变换点数,2的整数次方,如4,8,16,32...... //
//m为变换点数的2次方数
//n==2**m
//***************** //
//作者:柯丹
//时间:2007.11.15
//************************************************//
void CNllbfDlg::reorder(CNumber* x, int n, int m)
{
//n=2**m;
int nv2,nm1,i,j,k,sign;
CNumber *mdata,*mdatb,*u,*w;
mdata=new CNumber[1];
mdatb=new CNumber[1];
u=new CNumber[1];
w=new CNumber[1];
nv2=n/2;
nm1=n-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -