📄 lfilterdlg.cpp
字号:
if(IDOK != dlg.DoModal()) return;
CPoint *pPoint;
CFile f;
CFileException e;
DWORD i;
for(i=0;i<(DWORD)m_aPoints.GetSize();i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
delete pPoint;
}
m_aPoints.RemoveAll();
if(!f.Open(dlg.GetPathName(),CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return;
}
DWORD dwKey, dwPointNum;
f.Read(&dwKey, sizeof(DWORD));
if(dwKey != 1972717)
{
AfxMessageBox("Not LFilter curve!");
f.Close();
return;
}
f.Read(&dwPointNum, sizeof(DWORD));
for(i = 0; i < dwPointNum; i++)
{
pPoint = new CPoint;
f.Read(pPoint, sizeof(CPoint));
m_aPoints.Add(pPoint);
}
f.Close();
RECT Rect;
//SetRect(&Rect,7,7,117,117);
SetRect(&Rect,5,5,133,52);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void LFilterDlg::OnCurveSave()
{
CFileDialog dlg( FALSE, "*.cuv", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"LFilter curve(*.cuv) | *.cuv"
"||");
if(IDOK != dlg.DoModal()) return;
CFile f;
CFileException e;
CPoint *pPoint;
if(!f.Open(dlg.GetPathName(),CFile::modeCreate | CFile::modeWrite,&e))
{
AfxMessageBox("Cannot Save file!");
return;
}
DWORD dwKey = 1972717;
f.Write(&dwKey, sizeof(DWORD));
DWORD dwPointNum = (DWORD)m_aPoints.GetSize();
f.Write(&dwPointNum, sizeof(DWORD));
for(DWORD i=0;i<dwPointNum;i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
f.Write(pPoint, sizeof(CPoint));
}
f.Close();
}
void LFilterDlg::OnChangeSmallOne()
{
m_pData = m_pView->m_pImageData;
ASSERT(m_pShowData != NULL);
BeginWaitCursor();
RadarImageLFilter1();
EndWaitCursor();
Invalidate();
}
void LFilterDlg::OnChangeLargeOne()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
CFileDialog dlg( FALSE, "*.dat", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Radar Image(*.dat) | *.dat"
"||");
if(IDOK != dlg.DoModal()) return;
BeginWaitCursor();
pDoc->LeeFilter1(dlg.GetPathName());
EndWaitCursor();
}
double LFilterDlg::GetMidValue(UNDATA * pData,DWORD NumOfData, BOOL bFlag)
{
double sum;
UNDATA temp;
DWORD i,j;
//确定窗口数据存在。
ASSERT(pData != NULL);
if(bFlag)
{
//排序
for(i = 0; i < NumOfData-1; i++)
{
for(j = i+1; j < NumOfData; j++)
{
if(pData[j] > pData[i])
{
temp = pData[j];
pData[j] = pData[i];
pData[i] = temp;
}
}
}
//返回中值。
return (double)pData[(NumOfData-1)/2];
}
else
{
//返回均值。
sum = 0;
for(i = 0;i < NumOfData;i++)
sum = sum + pData[i];
return sum/(double)NumOfData;
}
}
//???
double LFilterDlg::GetOutValue(UNDATA * pData,DWORD NumOfData, BOOL bFlag, DWORD m)
{
int middle;
double average;
DWORD i;
double sum;
double k,stdDiverse;
k = sqrt(NumOfData/(double)m - 1);
middle = (NumOfData-1)/2;
sum = 0;
average = GetMidValue(pData,NumOfData,FALSE);//false:不排序,只求均值
for(i = 0;i < NumOfData;i++)
//sum = sum + fabs(pData[i] - average);
sum = sum + (pData[i] - average)*(pData[i] - average);
stdDiverse = k * sqrt(sum/(double)NumOfData);
if( pData[middle] > average-stdDiverse && pData[middle] < average+stdDiverse )
{
return (double)pData[middle];
}
else
{
if(bFlag)
{
return GetMidValue(pData,NumOfData,TRUE);
}
else
{
return average;
}
}
}
UNDATA LFilterDlg::GetOutValue4(UNDATA * pData, DWORD NumOfData, DWORD m)
{
ASSERT(pData != NULL);
ASSERT(m <= (NumOfData-3)/2);
UNDATA CurrentData = pData[(NumOfData-1)/2];
UNDATA Min, Max;
UNDATA temp;
DWORD i, j;
for(i = 0; i < NumOfData-1; i++)
{
//排序
for(j = i+1; j < NumOfData; j++)
{
if(pData[j] > pData[i])
{
temp = pData[j];
pData[j] = pData[i];
pData[i] = temp;
}
}
}
Max = pData[m];
Min = pData[NumOfData - m - 1];
if(CurrentData <= Min)
return Min;
else if(CurrentData >= Max)
return Max;
else
return CurrentData;
}
void LFilterDlg::OnChangeThreeSetup()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
CModel2Dlg dlg;
switch(m_nModel)
{
case 3:
dlg.m_nModel = 0;
break;
case 5:
dlg.m_nModel = 1;
break;
case 7:
dlg.m_nModel = 2;
break;
case 9:
dlg.m_nModel = 3;
break;
case 11:
dlg.m_nModel = 4;
break;
case 13:
dlg.m_nModel = 5;
break;
case 15:
dlg.m_nModel = 6;
break;
default:
ASSERT(FALSE);
break;
}
if(m_bMidValue)
dlg.m_nMid = 0;
else
dlg.m_nMid = 1;
dlg.m_dwM = pDoc->m_dwM;
if(IDOK == dlg.DoModal())
{
switch(dlg.m_nModel)
{
case 0:
m_nModel = 3;
break;
case 1:
m_nModel = 5;
break;
case 2:
m_nModel = 7;
break;
case 3:
m_nModel = 9;
break;
case 4:
m_nModel = 11;
break;
case 5:
m_nModel = 13;
break;
case 6:
m_nModel = 15;
break;
default:
ASSERT(FALSE);
break;
}
if(dlg.m_nMid == 0)
m_bMidValue = TRUE;
else if(dlg.m_nMid == 1)
m_bMidValue = FALSE;
pDoc->m_dwM = dlg.m_dwM;
m_pView->GetDocument()->m_nModel = m_nModel;
}
}
void LFilterDlg::OnChangeFourSetup()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
CModel4Dlg dlg;
switch(m_nModel)
{
case 3:
dlg.m_nModel = 0;
break;
case 5:
dlg.m_nModel = 1;
break;
case 7:
dlg.m_nModel = 2;
break;
case 9:
dlg.m_nModel = 3;
break;
case 11:
dlg.m_nModel = 4;
break;
case 13:
dlg.m_nModel = 5;
break;
case 15:
dlg.m_nModel = 6;
break;
default:
ASSERT(FALSE);
break;
}
dlg.m_dwM = pDoc->m_dwM4;
if(IDOK == dlg.DoModal())
{
switch(dlg.m_nModel)
{
case 0:
m_nModel = 3;
break;
case 1:
m_nModel = 5;
break;
case 2:
m_nModel = 7;
break;
case 3:
m_nModel = 9;
break;
case 4:
m_nModel = 11;
break;
case 5:
m_nModel = 13;
break;
case 6:
m_nModel = 15;
break;
default:
ASSERT(FALSE);
break;
}
pDoc->m_dwM4 = dlg.m_dwM;
m_pView->GetDocument()->m_nModel = m_nModel;
}
}
void LFilterDlg::OnChangeThreeSmall()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
m_pData = m_pView->m_pImageData;
ASSERT(m_pShowData != NULL);
BeginWaitCursor();
RadarImageLFilter3(m_nModel, pDoc->m_dwM);
EndWaitCursor();
Invalidate();
}
void LFilterDlg::RadarImageLFilter3(const DWORD dwTemplateSize, DWORD m)
{
ASSERT(m_pData == m_pView->m_pImageData);
DWORD i, j;
m_dwTemplateSize = dwTemplateSize;
m_tempSize = (m_dwTemplateSize-1) / 2;
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
pMainFrame->OnProcessBegin();
//m_tempSize = 1, 2, 3
UNDATA* pData = NULL;
pData = new UNDATA[(m_tempSize*2+1) * (m_tempSize*2+1)];
for(i=m_tempSize;i<m_dwHeight-m_tempSize;i++)
{
pMainFrame->OnProcessUpdate(i-m_tempSize, m_dwHeight-m_tempSize*2);
for(j=m_tempSize;j<m_dwWidth-m_tempSize;j++)
{
DWORD dwCount = 0;
for(UINT i1=i-m_tempSize;i1<=i+m_tempSize;i1++)
for(UINT j1=j-m_tempSize;j1<=j+m_tempSize;j1++)
{
pData[dwCount] = m_pData[j1+i1*m_dwWidth];
dwCount ++;
}
if(m_bMidValue)
m_pShowData[j+i*m_dwWidth] = (UNDATA)GetOutValue(pData, (m_tempSize*2+1) * (m_tempSize*2+1), TRUE, m);
else
m_pShowData[j+i*m_dwWidth] = (UNDATA)GetOutValue(pData, (m_tempSize*2+1) * (m_tempSize*2+1), FALSE, m);
}
}
delete[] pData;
pMainFrame->OnProcessEnd(i-m_tempSize, m_dwHeight-m_tempSize*2);
pMainFrame->SetStatusBarText(0, "");
//补数据...暂时不补
/*
for(i=0;i<m_tempSize;i++)
{
//上行
for(j=0; j<m_dwWidth; j++)
{
m_pShowData[i * m_dwWidth + j] = m_pShowData[(m_tempSize + i) * m_dwWidth + j];
}
//下行
for(j=0; j<m_dwWidth; j++)
{
m_pShowData[(m_dwHeight-m_tempSize+i) * m_dwWidth + j]
= m_pShowData[(m_dwHeight-m_tempSize*2+i) * m_dwWidth + j];
}
}
for(i=0;i<m_dwHeight;i++)
{
//左列
for(j=0; j<m_tempSize; j++)
{
m_pShowData[i * m_dwWidth + j] = m_pShowData[i * m_dwWidth + j + m_tempSize];
}
//右列
for(j=0; j<m_tempSize; j++)
{
m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize+j)] =
m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize*2+j)];
}
}*/
}
void LFilterDlg::OnChangeThreeLarge()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
CFileDialog dlg( FALSE, "*.dat", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Radar Image(*.dat) | *.dat"
"||");
if(IDOK != dlg.DoModal()) return;
BeginWaitCursor();
pDoc->LeeFilter3(dlg.GetPathName(), m_bMidValue);
EndWaitCursor();
}
void LFilterDlg::RadarImageLFilter4(const DWORD dwTemplateSize, DWORD m)
{
ASSERT(m_pData == m_pView->m_pImageData);
DWORD i, j;
m_dwTemplateSize = dwTemplateSize;
m_tempSize = (m_dwTemplateSize-1) / 2;
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Start calculate average value and variance...");
pMainFrame->OnProcessBegin();
//m_tempSize = 1, 2, 3
UNDATA* pData = NULL;
pData = new UNDATA[(m_tempSize*2+1) * (m_tempSize*2+1)];
for(i=m_tempSize;i<m_dwHeight-m_tempSize;i++)
{
pMainFrame->OnProcessUpdate(i-m_tempSize, m_dwHeight-m_tempSize*2);
for(j=m_tempSize;j<m_dwWidth-m_tempSize;j++)
{
DWORD dwCount = 0;
for(UINT i1=i-m_tempSize;i1<=i+m_tempSize;i1++)
for(UINT j1=j-m_tempSize;j1<=j+m_tempSize;j1++)
{
pData[dwCount] = m_pData[j1+i1*m_dwWidth];
dwCount ++;
}
UNDATA tempData[25];
for(DWORD y=0; y<25; y++)
tempData[y] = pData[y];
m_pShowData[j+i*m_dwWidth] = GetOutValue4(pData, (m_tempSize*2+1) * (m_tempSize*2+1), m);
for( y=0; y<25; y++)
tempData[y] = pData[y];
}
}
delete[] pData;
pMainFrame->OnProcessEnd(i-m_tempSize, m_dwHeight-m_tempSize*2);
pMainFrame->SetStatusBarText(0, "");
//补数据...暂时不补
/*
for(i=0;i<m_tempSize;i++)
{
//上行
for(j=0; j<m_dwWidth; j++)
{
m_pShowData[i * m_dwWidth + j] = m_pShowData[(m_tempSize + i) * m_dwWidth + j];
}
//下行
for(j=0; j<m_dwWidth; j++)
{
m_pShowData[(m_dwHeight-m_tempSize+i) * m_dwWidth + j]
= m_pShowData[(m_dwHeight-m_tempSize*2+i) * m_dwWidth + j];
}
}
for(i=0;i<m_dwHeight;i++)
{
//左列
for(j=0; j<m_tempSize; j++)
{
m_pShowData[i * m_dwWidth + j] = m_pShowData[i * m_dwWidth + j + m_tempSize];
}
//右列
for(j=0; j<m_tempSize; j++)
{
m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize+j)] =
m_pShowData[i * m_dwWidth + (m_dwWidth-m_tempSize*2+j)];
}
}*/
return;
}
void LFilterDlg::OnChangeFourSmall()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
m_pData = m_pView->m_pImageData;
ASSERT(m_pShowData != NULL);
BeginWaitCursor();
RadarImageLFilter4(m_nModel, pDoc->m_dwM4);
EndWaitCursor();
Invalidate();
}
void LFilterDlg::OnChangeFourLarge()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
CFileDialog dlg( FALSE, "*.dat", NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Radar Image(*.dat) | *.dat"
"||");
if(IDOK != dlg.DoModal()) return;
BeginWaitCursor();
pDoc->LeeFilter4(dlg.GetPathName());
EndWaitCursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -