📄 lfilterdlg.cpp
字号:
// LFilterDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Rader.h"
#include "RaderDoc.h"
#include "RaderView.h"
#include "LFilterDlg.h"
#include "Math.h"
#include "MainFrm.h"
#include "ModelDlg.h"
#include "Model2Dlg.h"
#include "Model4Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// LFilterDlg dialog
LFilterDlg::LFilterDlg(CWnd* pParent /*=NULL*/)
: CDialog(LFilterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(LFilterDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pView = (CRaderView*)pParent;
m_pData = m_pView->m_pImageData;
m_pShowData = NULL;
m_dwLeft = m_pView->m_dwLeft;
m_dwTop = m_pView->m_dwTop;
m_dwWidth = m_pView->m_dwWidth;
m_dwHeight = m_pView->m_dwHeight;
m_dwImageWidth = m_pView->GetDocument()->m_dwWidth;
m_dwImageHeight = m_pView->GetDocument()->m_dwHeight;
m_pBmi = m_pView->m_pBmi;
CPoint *pPoint;
pPoint = new CPoint(0,0);
m_aPoints.Add(pPoint);
//pPoint = new CPoint(20,0);
//m_aPoints.Add(pPoint);
//pPoint = new CPoint(230,100);
//m_aPoints.Add(pPoint);
pPoint = new CPoint(255,100);
m_aPoints.Add(pPoint);
m_bTrace = FALSE;
m_nModel = m_pView->GetDocument()->m_nModel;
sd_max = -1.0;
sd_min = 1.7E+308;
m_pAverage=NULL;
dSd=NULL;
m_dwTemplateSize=5;
m_tempSize=1;
m_bMidValue = FALSE;
}
LFilterDlg::~LFilterDlg()
{
if(m_pShowData != NULL)
{
delete m_pShowData;
m_pShowData = NULL;
}
CPoint *pPoint;
for(int i=0;i<m_aPoints.GetSize();i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
delete pPoint;
}
m_aPoints.RemoveAll();
if(m_pAverage!=NULL)
{
delete[] m_pAverage;
m_pAverage = NULL;
}
if(dSd!=NULL)
{
delete[] dSd;
dSd = NULL;
}
}
void LFilterDlg::InvalidateDlg()
{
CRect rectClient, rect;
GetClientRect(&rectClient);
rect.left = rectClient.left;
rect.top = rectClient.top + 105;
rect.right = rectClient.right;
rect.bottom = rectClient.bottom;
m_pData = m_pView->m_pImageData;
m_dwLeft = m_pView->m_dwLeft;
m_dwTop = m_pView->m_dwTop;
m_dwWidth = m_pView->m_dwWidth;
m_dwHeight = m_pView->m_dwHeight;
if(m_pShowData != NULL)
{
delete m_pShowData;
m_pShowData = NULL;
}
//根据窗口大小付值...
m_pShowData = new UNDATA[m_dwWidth * m_dwHeight];
for(DWORD i=0; i<m_dwWidth * m_dwHeight; i++)
m_pShowData[i] = m_pData[i];
InvalidateRect(&rect);
}
void LFilterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(LFilterDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(LFilterDlg, CDialog)
//{{AFX_MSG_MAP(LFilterDlg)
ON_WM_PAINT()
ON_COMMAND(ID_EXIT, OnExit)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_CHANGE_SMALL, OnChangeSmall)
ON_COMMAND(ID_CHANGE_MODEL, OnChangeModel)
ON_COMMAND(ID_CURVE_DFFAULT, OnCurveDefault)
ON_COMMAND(ID_CURVE_OPEN, OnCurveOpen)
ON_COMMAND(ID_CURVE_SAVE, OnCurveSave)
ON_COMMAND(ID_CHANGE_LARGE, OnChangeLarge)
ON_COMMAND(ID_CHANGE_SMALL_ONE, OnChangeSmallOne)
ON_COMMAND(ID_CHANGE_LARGE_ONE, OnChangeLargeOne)
ON_COMMAND(ID_CHANGE_THREE_SETUP, OnChangeThreeSetup)
ON_COMMAND(ID_CHANGE_THREE_SMALL, OnChangeThreeSmall)
ON_COMMAND(ID_CHANGE_THREE_LARGE, OnChangeThreeLarge)
ON_COMMAND(ID_CHANGE_FOUR_SETUP, OnChangeFourSetup)
ON_COMMAND(ID_CHANGE_FOUR_SMALL, OnChangeFourSmall)
ON_COMMAND(ID_CHANGE_FOUR_LARGE, OnChangeFourLarge)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// LFilterDlg message handlers
void LFilterDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
DrawHist(&dc);
DWORD i, j;
UNDATA dwTemp;
LPBYTE pImage = new BYTE[m_dwWidth * m_dwHeight];
for(i = 0; i < m_dwHeight; i++)
for(j = 0; j < m_dwWidth; j++)
{
if(sizeof(UNDATA) == sizeof(DWORD))
dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j] / pow(2, 24));//UNDATA
else if(sizeof(UNDATA) == sizeof(unsigned short))
dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j] / pow(2, 8));//UNDATA
else if(sizeof(UNDATA) == sizeof(BYTE))
dwTemp = (UNDATA)(m_pShowData[(m_dwHeight - 1 - i) * m_dwWidth + j]);
else
ASSERT(FALSE);
ASSERT(dwTemp < 256);
pImage[i * m_dwWidth + j] = (BYTE)dwTemp;
}
int ret;
ret = ::StretchDIBits(
dc.m_hDC, // handle of device context
10, // x-coordinate of upper-left corner of dest. rect.
110, // y-coordinate of upper-left corner of dest. rect.
m_dwWidth,//m_pBmi->bmiHeader.biWidth, // width of destination rectangle
m_dwHeight,//m_pBmi->bmiHeader.biHeight, // height of destination rectangle
0, // x-coordinate of upper-left corner of source rect.
0, // y-coordinate of upper-left corner of source rect.
m_dwWidth,//m_pBmi->bmiHeader.biWidth, // width of source rectangle
m_dwHeight,//m_pBmi->bmiHeader.biHeight, // height of source rectangle
pImage, // address of bitmap data
m_pBmi, // address of bitmap bits
DIB_RGB_COLORS, // usage
SRCCOPY // raster operation code ) ;
);
delete[] pImage;
ASSERT(ret != 0);
}
BOOL LFilterDlg::Create()
{
return CDialog::Create(LFilterDlg::IDD,m_pView);
}
void LFilterDlg::OnExit()
{
m_pView->PostMessage(WM_COMMAND, ID_LFILTER_TWO, 0L);
}
void LFilterDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
int x;
int y;
RECT Rect;
//SetRect(&Rect,7,7,117,117);
SetRect(&Rect,5,5,133,52);
MapDialogRect(&Rect);
if(point.x<Rect.left||point.y>Rect.right||point.y<Rect.top||point.y>Rect.bottom)
return;
x = (point.x-Rect.left)*255/(Rect.right-Rect.left);
y = (Rect.bottom-point.y)*100/(Rect.bottom-Rect.top);
CPoint *pPoint;
CPoint *pNextPoint;
for(int i=1;i<m_aPoints.GetSize()-1;i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
if(abs(pPoint->x-x)<=5&&abs(pPoint->y-y)<=5)
break;
}
if(i == m_aPoints.GetSize()-1)
{
for(int i=0;i<m_aPoints.GetSize()-1;i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
pNextPoint = (CPoint *)(m_aPoints[i+1]);
if(pPoint->x<x&&pNextPoint->x>x)
break;
}
if(i<m_aPoints.GetSize()-1)
{
pPoint = new CPoint(x,y);
m_aPoints.InsertAt(i+1,pPoint);
InvalidateRect(&Rect);
}
SetCursor(AfxGetApp()->LoadCursor(IDC_POINTEDIT_DRAG1));
}
else
{
SetCapture();
m_bTrace = TRUE;
m_nSelPoint = i;
pPoint = (CPoint *)(m_aPoints[i-1]);
pNextPoint = (CPoint *)(m_aPoints[i+1]);
double dRatioX = (double)(Rect.right-Rect.left)/255;
double dRatioY = (double)(Rect.bottom-Rect.top)/100;
int x1 = (int)(pPoint->x*dRatioX+Rect.left);
int x2 = (int)(pNextPoint->x*dRatioX+Rect.left);
RECT ClipRect;
SetRect(&ClipRect,x1,Rect.top,x2,Rect.bottom);
ClientToScreen(&ClipRect);
ClipCursor(&ClipRect);
SetCursor(AfxGetApp()->LoadCursor(IDC_POINTEDIT_DRAG2));
}
//GetK();
CDialog::OnLButtonDown(nFlags, point);
}
void LFilterDlg::OnMouseMove(UINT nFlags, CPoint point)
{
int x;
int y;
RECT Rect;
//SetRect(&Rect,7,7,117,117);
SetRect(&Rect,5,5,133,52);
MapDialogRect(&Rect);
if(point.x<Rect.left||point.y>Rect.right||point.y<Rect.top||point.y>Rect.bottom)
return;
x = (int)((point.x-Rect.left)*255/(double)(Rect.right-Rect.left));
y = (int)((Rect.bottom-point.y)*100/(double)(Rect.bottom-Rect.top));
//SetDlgItemInt(IDC_STATIC1,x);
//SetDlgItemInt(IDC_STATIC2,y);
CPoint *pPoint;
if(m_bTrace)
{
pPoint = (CPoint *)(m_aPoints[m_nSelPoint]);
pPoint->x = x;
pPoint->y = y;
InvalidateRect(&Rect);
SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG2 ) );
}
else
SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG1 ) );
//GetK();
CDialog::OnMouseMove(nFlags, point);
}
void LFilterDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bTrace)
{
ReleaseCapture();
m_bTrace = FALSE;
ClipCursor(NULL);
}
SetCursor( AfxGetApp()->LoadCursor( IDC_POINTEDIT_DRAG1 ) );
CDialog::OnLButtonUp(nFlags, point);
}
void LFilterDlg::DrawHist(CDC* pDC)
{
pDC->MoveTo(9,8);
pDC->LineTo(255+10+1,8);
pDC->LineTo(255+10+1,100);
pDC->LineTo(9,100);
pDC->LineTo(9,8);
//直方图
RECT Rect;
//SetRect(&Rect,7,7,117,117);
SetRect(&Rect,5,5,133,52);
MapDialogRect(&Rect);
CPoint *pPoint;
double dRatioX = (double)(Rect.right-Rect.left)/255;
double dRatioY = (double)(Rect.bottom-Rect.top)/100;
int x;
int y;
CPen BlackPen(PS_SOLID,1,RGB(0,0,0));
CPen BluePen(PS_SOLID,1,RGB(0,0,255));
CBrush BlueBrush(RGB(0,0,255));
CPen *pOldPen;
CBrush *pOldBrush;
int i;
for(i=0; i<256; i++)
{
x = (int)(i * dRatioX + Rect.left);
y = (int)(Rect.bottom - m_HistData[i] * dRatioY);
pDC->MoveTo(x, Rect.bottom);
pDC->LineTo(x, y);
}
for(i=0;i<m_aPoints.GetSize();i++)
{
pPoint = (CPoint *)(m_aPoints[i]);
x = (int)(pPoint->x*dRatioX+Rect.left);
y = (int)(Rect.bottom - pPoint->y*dRatioY);
if(i!=0&&i!=m_aPoints.GetSize()-1)
{
pOldPen = pDC->SelectObject(&BluePen);
pOldBrush = pDC->SelectObject(&BlueBrush);
pDC->Ellipse(x-2,y-2,x+2,y+2);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
if(i==0)
{
pDC->MoveTo(x,y);
}
else
{
pOldPen = pDC->SelectObject(&BlackPen);
pDC->LineTo(x,y);
pDC->SelectObject(pOldPen);
}
}
// for(i=0;i<255;i++)
// {
// pDC->MoveTo(i + 10, 10 + (int)(m_K[i]*90));
// pDC->LineTo(i + 11, 10 + (int)(m_K[i+1]*90));
// }
}
BOOL LFilterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//打开文件
CFile f;
CFileException e;
DWORD i, j;
DWORD dFileLength;
//double ColorData[256];
for( i=0; i<256; i++)
{
m_ColorData[i] = 0;
}
if(!f.Open(m_pView->GetDocument()->m_szFilePath,CFile::modeRead,&e))
{
AfxMessageBox("Cannot Open file!");
return FALSE;
}
dFileLength=f.GetLength();
UNDATA dwTemp;
BeginWaitCursor();
CMainFrame* pMainFrame = ((CMainFrame*)AfxGetMainWnd());
pMainFrame->SetStatusBarText(0, "Start Calculate Histogram...");
pMainFrame->OnProcessBegin();
//统计直方图,读取全图...
UNDATA* pData = new UNDATA[m_dwImageWidth];
for(i = 0; i < m_dwImageHeight; i++)
{
VERIFY(f.Read(pData, m_dwImageWidth * sizeof(UNDATA)));
for(j = 0; j < m_dwImageWidth; j++)
{
if(sizeof(UNDATA) == sizeof(DWORD))
dwTemp = (UNDATA)(pData[j] / pow(2, 24)); //UNDATA
else if(sizeof(UNDATA) == sizeof(unsigned short))
dwTemp = (UNDATA)(pData[j] / pow(2, 8)); //UNDATA
else if(sizeof(UNDATA) == sizeof(BYTE))
dwTemp = (UNDATA)(pData[j]);
else
ASSERT(FALSE);
ASSERT(dwTemp < 256);
m_ColorData[dwTemp]++;
}
pMainFrame->OnProcessUpdate(i, m_dwImageHeight);
}
delete[] pData;
pMainFrame->OnProcessEnd(i, m_dwImageHeight);
pMainFrame->SetStatusBarText(0, "");
f.Close();
EndWaitCursor();
double dMax = 0;
for( i=0; i<256; i++)
{
if(dMax < m_ColorData[i])
dMax = m_ColorData[i];
}
for( i=0; i<256; i++)
{
m_ColorData[i] = m_ColorData[i] / dMax;
m_HistData[i] = (BYTE)(m_ColorData[i] * 100.0);
}
OnCurveDefault();
//根据窗口大小,付值...
ASSERT(m_pShowData == NULL);
m_pShowData = new UNDATA[m_dwWidth * m_dwHeight];
for(i=0; i<m_dwWidth * m_dwHeight; i++)
m_pShowData[i] = m_pView->m_pImageData[i];
return TRUE;
}
double LFilterDlg::GetK()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
double ret;
int i, j;
CPoint* pPoint1;
CPoint* pPoint2;
int x1, y1, x2, y2;
double k, b;
//正规化
for(i=0; i<m_aPoints.GetSize()-1; i++)
{
pPoint1 = (CPoint *)(m_aPoints[i ]);
pPoint2 = (CPoint *)(m_aPoints[i + 1]);
x1 = (int)pPoint1->x;
x2 = (int)pPoint2->x;
if(x2 <= x1)
pPoint2->x = pPoint1->x + 1;
}
for(i=0; i<m_aPoints.GetSize()-1; i++)
{
pPoint1 = (CPoint *)(m_aPoints[i ]);
pPoint2 = (CPoint *)(m_aPoints[i + 1]);
x1 = (int)pPoint1->x;
y1 = (int)pPoint1->y;
x2 = (int)pPoint2->x;
y2 = (int)pPoint2->y;
if(x2 <= x1)//计算误差
{
ASSERT(FALSE);
x2 = x1 + 1;
pDoc->m_K[x1] = y1;
}
else
{
for(j=x1; j<=x2; j++)
{
k = double(y2-y1)/double(x2-x1);
b = y2 - k * x2;
//pDoc->m_K[j] = (k * j + b)/100.0;
pDoc->m_K[j] = (y2-(x2-j)*(y2-y1)/(x2-x1))/100.0;
//ASSERT(m_K[j] >= 0);
}
}
}
return ret;
}
void LFilterDlg::OnChangeLarge()
{
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;
GetK();
BeginWaitCursor();
pDoc->CalculateAvrAndSd();
if(pDoc->m_bOutFile)
pDoc->LeeFilter2(dlg.GetPathName(), true);
else
pDoc->LeeFilter2(dlg.GetPathName(), false);
EndWaitCursor();
}
void LFilterDlg::OnChangeSmall()
{
CRaderDoc* pDoc = m_pView->GetDocument();
ASSERT_VALID(pDoc);
m_pData = m_pView->m_pImageData;
ASSERT(m_pShowData != NULL);
BeginWaitCursor();
GetK();
CalculateSD(m_nModel);
RadarImageLFilter2(pDoc->m_bOutFile);//m_ptStart,m_ptEnd);
EndWaitCursor();
Invalidate();
}
BOOL LFilterDlg::RadarImageLFilter2(BOOL bIs5)//const CPoint ptStart, const CPoint ptEnd)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -