📄 raderdoc.cpp
字号:
// RaderDoc.cpp : implementation of the CRaderDoc class
//
#include "stdafx.h"
#include "Rader.h"
#include "RaderDoc.h"
#include "MainFrm.h"
#include "ImageSizeDialog.h"
#include "Math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRaderDoc
IMPLEMENT_DYNCREATE(CRaderDoc, CDocument)
BEGIN_MESSAGE_MAP(CRaderDoc, CDocument)
//{{AFX_MSG_MAP(CRaderDoc)
ON_COMMAND(ID_FILE_SAVEIMAGE, OnFileSaveimage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRaderDoc construction/destruction
CRaderDoc::CRaderDoc()
{
m_szFilePath = "";
m_szAvrPath = "";
m_szSdPath = "";
m_dwWidth = 0;
m_dwHeight = 0;
m_bHasReady = FALSE;
m_dZoomedRatio = 1.0;
//外部文件
m_bOutFile = FALSE;
m_szXH = _T("");
m_szXL = _T("");
m_dN = 1.0;
m_nStrech = 0;
//模板大小
m_nModel = 5;
m_dwM = 2;
m_dwM4 = 3;
m_dMaxSd = -1.0;
m_dMinSd = 1.7E+308;
for( int i=0; i<256; i++)
m_K[i] = -1.0;
}
CRaderDoc::~CRaderDoc()
{
}
BOOL CRaderDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CRaderDoc serialization
void CRaderDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
}
else
{
}
}
/////////////////////////////////////////////////////////////////////////////
// CRaderDoc diagnostics
#ifdef _DEBUG
void CRaderDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CRaderDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRaderDoc commands
BOOL CRaderDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
CFile f;
CFileException e;
DWORD dFileLength;
if(!f.Open(lpszPathName,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
dFileLength=f.GetLength();
if(dFileLength==0)
{
AfxMessageBox("File size: 0 Byte");
f.Close();
return FALSE;
}
CImageSizeDialog dlg;
dlg.dwFileLength = dFileLength;
if(dlg.DoModal()==IDOK)
{
//if(dlg.m_nBits == 2)
//{
int yj = sizeof(UNDATA);//???
if(dlg.m_dwWidth * dlg.m_dwHeight * sizeof(UNDATA) != dFileLength)
{
AfxMessageBox("The size is not match width bits!");
f.Close();
return FALSE;
}
f.Close();
m_szFilePath = lpszPathName;
char szTempName[256];
char szFileName[256];
char drive[3];
char dir[256];
char ext[5];
_splitpath( m_szFilePath, drive, dir, szFileName, ext );
strcpy( szTempName , drive );
strcat( szTempName , dir);
strcat( szTempName , szFileName);
strcat( szTempName , ".avr");
m_szAvrPath = szTempName;
strcpy( szTempName , drive );
strcat( szTempName , dir);
strcat( szTempName , szFileName);
strcat( szTempName , ".sdd");
m_szSdPath = szTempName;
m_dwWidth = dlg.m_dwWidth;
m_dwHeight = dlg.m_dwHeight;
m_bHasReady = TRUE;
//}
//else
//{
// f.Close();
// return FALSE;
//}
}
else
{
f.Close();
return FALSE;
}
return TRUE;
}
void CRaderDoc::OnFileSaveimage()
{
CFileDialog dlg( FALSE, "*.dat", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Radar Image(*.dat) | *.dat"
"||");
if(IDOK != dlg.DoModal()) return;
ASSERT(m_szFilePath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
if(dlg.GetPathName() == m_szFilePath)
{
AfxMessageBox("Please input another name.");
return;
}
//打开文件
CFile f0, f1;
CFileException e;
DWORD i, j;
if(!f0.Open(m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return;
}
if(!f1.Open(dlg.GetPathName(),CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
f0.Close();
return;
}
UNDATA* pLineData = new UNDATA[m_dwWidth];
UNDATA* pResultData = new UNDATA[m_dwWidth];
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Saveing...");
pMainFrame->OnProcessBegin();
for(i = 0; i < m_dwHeight; i++)
{
pMainFrame->OnProcessUpdate(i, m_dwHeight);
f0.Seek(i * m_dwWidth * sizeof(UNDATA), CFile::begin);
VERIFY(f0.Read(pLineData, m_dwWidth * sizeof(UNDATA)));
for(j = 0; j < m_dwWidth; j++)
pResultData[j] = pLineData[j];
f1.Write(pResultData, m_dwWidth * sizeof(UNDATA));
}
pMainFrame->OnProcessEnd(i, m_dwHeight);
pMainFrame->SetStatusBarText(0, "");
f0.Close();
f1.Close();
delete[] pLineData;
delete[] pResultData;
return;//CDocument::OnSaveDocument(lpszPathName);
}
/*BOOL CRaderDoc::CalculateAvr()
{
ASSERT(m_szFilePath != "");
ASSERT(m_szAvrPath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
//打开文件
CFile f1, f2;
CFileException e;
DWORD i, j, m, n;
if(!f1.Open(m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
if(!f2.Open(m_szAvrPath,CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return FALSE;
}
DWORD dwTemp;
DWORD dwD = (m_nModel-1)/2; //d: 1, 2, 3
DWORD* pData = new DWORD[m_dwWidth * m_nModel];
DWORD* pLineData = new DWORD[m_dwWidth];
double sum = 0.0;
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "计算平均值...");
pMainFrame->OnProcessBegin();
for(i = 0; i < m_dwHeight-m_nModel+1; i++)
{
pMainFrame->OnProcessUpdate(i, m_dwHeight-m_nModel+1);
f1.Seek(i * m_dwWidth * sizeof(DWORD), CFile::begin);
VERIFY(f1.Read(pData, m_nModel * m_dwWidth * sizeof(DWORD)));
for(j = 0; j < m_dwWidth-m_nModel+1; j++)
{
sum = 0.0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
sum += (double)pData[m * m_dwWidth + j + n];
}
}
pLineData[j+dwD] = (DWORD)(sum/(double)(m_nModel*m_nModel));
}
//补左数据
for(j=0; j<dwD; j++)
pLineData[j] = pLineData[dwD];
//补右数据
for(j=m_dwWidth-dwD; j<m_dwWidth; j++)
pLineData[j] = pLineData[m_dwWidth-dwD-1];
if(i == 0)
{
for(j=0; j<dwD; j++)
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
}
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
}
pMainFrame->OnProcessEnd(i, m_dwHeight-m_nModel+1);
pMainFrame->SetStatusBarText(0, "");
for(j=0; j<dwD; j++)
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
f1.Close();
f2.Close();
delete[] pData;
delete[] pLineData;
return TRUE;
}
BOOL CRaderDoc::CalculateSd()
{
ASSERT(m_szFilePath != "");
ASSERT(m_szSdPath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
//打开文件
CFile f1, f2;
CFileException e;
DWORD i, j, m, n;
if(!f1.Open(m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
if(!f2.Open(m_szSdPath,CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return FALSE;
}
DWORD dwTemp;
DWORD dwD = (m_nModel-1)/2; //d: 1, 2, 3
DWORD* pData = new DWORD[m_dwWidth * m_nModel];
DWORD* pLineData = new DWORD[m_dwWidth];
double sum = 0.0;
double Average;
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "计算方差...");
pMainFrame->OnProcessBegin();
for(i = 0; i < m_dwHeight-m_nModel+1; i++)
{
pMainFrame->OnProcessUpdate(i, m_dwHeight-m_nModel+1);
f1.Seek(i * m_dwWidth * sizeof(DWORD), CFile::begin);
VERIFY(f1.Read(pData, m_nModel * m_dwWidth * sizeof(DWORD)));
for(j = 0; j < m_dwWidth-m_nModel+1; j++)
{
sum = 0.0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
sum += (double)pData[m * m_dwWidth + j + n];
}
}
Average = (sum/(double)(m_nModel*m_nModel));
sum = 0.0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
sum += (double)(pData[m * m_dwWidth + j + n]-Average)*(double)(pData[m * m_dwWidth + j + n]-Average);
}
}
pLineData[j+dwD] = (DWORD)(sum/(double)(m_nModel*m_nModel));
}
//补左数据
for(j=0; j<dwD; j++)
pLineData[j] = pLineData[dwD];
//补右数据
for(j=m_dwWidth-dwD; j<m_dwWidth; j++)
pLineData[j] = pLineData[m_dwWidth-dwD-1];
if(i == 0)
{
for(j=0; j<dwD; j++)
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
}
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
}
pMainFrame->OnProcessEnd(i, m_dwHeight-m_nModel+1);
pMainFrame->SetStatusBarText(0, "");
for(j=0; j<dwD; j++)
f2.Write(pLineData, m_dwWidth * sizeof(DWORD));
f1.Close();
f2.Close();
delete[] pData;
delete[] pLineData;
return TRUE;
}*/
BOOL CRaderDoc::CalculateAvrAndSd()
{
ASSERT(m_szFilePath != "");
ASSERT(m_szAvrPath != "");
ASSERT(m_szSdPath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
//打开文件
CFile f1, f2, f3;
CFileException e;
DWORD i, j;
int m, n;
if(!f1.Open(m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
if(!f2.Open(m_szAvrPath,CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return FALSE;
}
if(!f3.Open(m_szSdPath,CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return FALSE;
}
DWORD dwD = (m_nModel-1)/2; //d: 1, 2, 3
UNDATA* pData = new UNDATA[m_dwWidth * m_nModel];
double* pLineAvrData = new double[m_dwWidth];
double* pLineSdData = new double[m_dwWidth];
double sum = 0.0;
double Average;
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
pMainFrame->OnProcessBegin();
for(i = 0; i < m_dwHeight-m_nModel+1; i++)
{
pMainFrame->OnProcessUpdate(i, m_dwHeight-m_nModel+1);
f1.Seek(i * m_dwWidth * sizeof(UNDATA), CFile::begin);
VERIFY(f1.Read(pData, m_nModel * m_dwWidth * sizeof(UNDATA)));
for(j = 0; j < m_dwWidth-m_nModel+1; j++)
{
sum = 0.0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
if(m != (int)dwD || n != (int)dwD)
sum += (double)pData[m * m_dwWidth + j + n];
}
}
Average = sum/(double)(m_nModel*m_nModel-1);
pLineAvrData[j+dwD] = Average;
sum = 0.0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
sum += (pData[m * m_dwWidth + j + n] - Average) *
(pData[m * m_dwWidth + j + n] - Average);
}
}
//???
pLineSdData[j+dwD] = sqrt(sum / (double)(m_nModel*m_nModel-1));
//求得方差最大值与最小值。
if(m_dMaxSd < pLineSdData[j+dwD])
m_dMaxSd = pLineSdData[j+dwD];
if(m_dMinSd > pLineSdData[j+dwD])
m_dMinSd = pLineSdData[j+dwD];
}
//补左数据
for(j=0; j<dwD; j++)
{
pLineAvrData[j] = pLineAvrData[dwD];
pLineSdData[j] = pLineSdData[dwD];
}
//补右数据
for(j=m_dwWidth-dwD; j<m_dwWidth; j++)
{
pLineAvrData[j] = pLineAvrData[m_dwWidth-dwD-1];
pLineSdData[j] = pLineSdData[m_dwWidth-dwD-1];
}
if(i == 0)
{
for(j=0; j<dwD; j++)
{
f2.Write(pLineAvrData, m_dwWidth * sizeof(double));
f3.Write(pLineSdData, m_dwWidth * sizeof(double));
}
}
f2.Write(pLineAvrData, m_dwWidth * sizeof(double));
f3.Write(pLineSdData, m_dwWidth * sizeof(double));
}
pMainFrame->OnProcessEnd(i, m_dwHeight-m_nModel+1);
pMainFrame->SetStatusBarText(0, "");
for(j=0; j<dwD; j++)
{
f2.Write(pLineAvrData, m_dwWidth * sizeof(double));
f3.Write(pLineSdData, m_dwWidth * sizeof(double));
}
f1.Close();
f2.Close();
f3.Close();
delete[] pData;
delete[] pLineAvrData;
delete[] pLineSdData;
return TRUE;
}
BOOL CRaderDoc::LeeFilter3(CString szResultPath, BOOL bMidValue)
{
ASSERT(m_szFilePath != "");
ASSERT(szResultPath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
//打开文件
CFile f1, f2;
CFileException e;
DWORD i, j;
int m, n;
if(!f1.Open(m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
if(!f2.Open(szResultPath,CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return FALSE;
}
DWORD dwD = (m_nModel-1)/2; //d: 1, 2, 3
UNDATA* pData = new UNDATA[m_dwWidth * m_nModel];
UNDATA* pTemplette = NULL;
pTemplette = new UNDATA[m_nModel*m_nModel];
UNDATA* pLineWriteData = new UNDATA[m_dwWidth];
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
pMainFrame->OnProcessBegin();
DWORD k;
for(i = 0; i < m_dwHeight-m_nModel+1; i++)
{
pMainFrame->OnProcessUpdate(i, m_dwHeight-m_nModel+1);
f1.Seek(i * m_dwWidth * sizeof(UNDATA), CFile::begin);
VERIFY(f1.Read(pData, m_nModel * m_dwWidth * sizeof(UNDATA)));
if(i == 0)
{
for(j=0; j<dwD; j++)
{
for(k = 0; k < m_dwWidth; k++)
pLineWriteData[k] = 0;
f2.Write(pLineWriteData, m_dwWidth * sizeof(UNDATA));
}
}
for(j = 0; j < m_dwWidth-m_nModel+1; j++)
{
DWORD dwCount = 0;
for(m=0; m<m_nModel; m++)
{
for(n=0; n<m_nModel; n++)
{
pTemplette[dwCount] = pData[m * m_dwWidth + j + n];
dwCount ++;
}
}
if(bMidValue)
pLineWriteData[j+dwD] = (UNDATA)GetOutValue(pTemplette, m_nModel*m_nModel, TRUE, m_dwM);
else
pLineWriteData[j+dwD] = (UNDATA)GetOutValue(pTemplette, m_nModel*m_nModel, FALSE, m_dwM);
}
//补左数据
for(j=0; j<dwD; j++)
{
pLineWriteData[j] = 0;//pLineWriteData[dwD];
}
//补右数据
for(j=m_dwWidth-dwD; j<m_dwWidth; j++)
{
pLineWriteData[j] = 0;//pLineWriteData[m_dwWidth-dwD-1];
}
f2.Write(pLineWriteData, m_dwWidth * sizeof(UNDATA));
}
pMainFrame->OnProcessEnd(i, m_dwHeight-m_nModel+1);
pMainFrame->SetStatusBarText(0, "");
for(j=0; j<dwD; j++)
{
for(k = 0; k < m_dwWidth; k++)
pLineWriteData[k] = 0;
f2.Write(pLineWriteData, m_dwWidth * sizeof(UNDATA));
}
f1.Close();
f2.Close();
delete[] pData;
delete[] pTemplette;
delete[] pLineWriteData;
return TRUE;
}
BOOL CRaderDoc::LeeFilter4(CString szResultPath)
{
ASSERT(m_szFilePath != "");
ASSERT(szResultPath != "");
ASSERT(m_bHasReady);
ASSERT(m_dwWidth != 0);
ASSERT(m_dwHeight != 0);
//打开文件
CFile f1, f2;
CFileException e;
DWORD i, j;
int m, n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -