⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 padlg.cpp

📁 曲线角点检测的二种算法
💻 CPP
字号:
// paDlg.cpp : implementation file
//

#include "stdafx.h"
#include "cpd.h"
#include "paDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CpaDlg dialog
 

inline CpaDlg::Enable4Button(bool b)
{
	GetDlgItem(IDC_VALUE_PLUS)->EnableWindow(b); 
	GetDlgItem(IDC_VALUE_DEC)->EnableWindow(b) ;
	GetDlgItem(IDC_VALUE_PLUSPLUS)->EnableWindow(b); 
	GetDlgItem(IDC_VALUE_DECDEC)->EnableWindow(b) ;
}

CpaDlg::CpaDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CpaDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CpaDlg)
	m_fn = _T("");
	m_k = 0.0;
	m_lc = 0.0;
	m_lpi = 0.0;
	m_w_6 = 0.0;
	m_ac = 0.0;
	m_w_u = 0.0;
	//}}AFX_DATA_INIT
	pActive= NULL; 
	m_pcwk=NULL ;
}
BOOL CpaDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();	
	Enable4Button(false);
	GetDlgItem(IDC_VALUE_DEC)->EnableWindow(false); 
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CpaDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CpaDlg)
	DDX_Control(pDX, IDC_EDIT_WEIGTED_6, m_w_6_ctrl);
	DDX_Control(pDX, IDC_EDIT_W_U, m_w_u_ctrl);
	DDX_Control(pDX, IDC_EDIT_LEN_PI, m_lpi_ctrl);
	DDX_Control(pDX, IDC_EDIT_LEN_COMPARE, m_lc_ctrl);
	DDX_Control(pDX, IDC_EDIT_K, m_k_ctrl);
	DDX_Control(pDX, IDC_EDIT_EALPA, m_ac_ctrl);
	DDX_Text(pDX, IDC_EDIT_FN, m_fn);
	DDX_Text(pDX, IDC_EDIT_K, m_k);
	DDX_Text(pDX, IDC_EDIT_LEN_COMPARE, m_lc);
	DDX_Text(pDX, IDC_EDIT_LEN_PI, m_lpi);
	DDX_Text(pDX, IDC_EDIT_WEIGTED_6, m_w_6);
	DDX_Text(pDX, IDC_EDIT_EALPA, m_ac);
	DDX_Text(pDX, IDC_EDIT_W_U, m_w_u);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CpaDlg, CDialog)
	//{{AFX_MSG_MAP(CpaDlg)
	ON_EN_SETFOCUS(IDC_EDIT_K, OnSetfocusEditK)
	ON_EN_SETFOCUS(IDC_EDIT_EALPA, OnSetfocusEditEalpa)
	ON_EN_SETFOCUS(IDC_EDIT_LEN_COMPARE, OnSetfocusEditLenCompare)
	ON_EN_SETFOCUS(IDC_EDIT_LEN_PI, OnSetfocusEditLenPi)
	ON_EN_SETFOCUS(IDC_EDIT_WEIGTED_6, OnSetfocusEditWeigted6)
	ON_EN_KILLFOCUS(IDC_EDIT_WEIGTED_6, OnKillfocusEditWeigted6)
	ON_EN_KILLFOCUS(IDC_EDIT_K, OnKillfocusEditK)
	ON_EN_KILLFOCUS(IDC_EDIT_EALPA, OnKillfocusEditEalpa)
	ON_EN_KILLFOCUS(IDC_EDIT_LEN_COMPARE, OnKillfocusEditLenCompare)
	ON_EN_KILLFOCUS(IDC_EDIT_LEN_PI, OnKillfocusEditLenPi)
	ON_EN_SETFOCUS(IDC_EDIT_W_U, OnSetfocusEditWU)	
	ON_WM_MOVE()
	ON_EN_CHANGE(IDC_EDIT_WEIGTED_6, OnChangeEditWeigted6)
	ON_EN_CHANGE(IDC_EDIT_W_U, OnChangeEditWU)
	ON_BN_CLICKED(IDC_VALUE_PLUS, OnValuePlus)
	ON_BN_CLICKED(IDC_VALUE_DEC, OnValueDec)
	ON_BN_CLICKED(IDC_VALUE_DECDEC, OnValueDecdec)
	ON_BN_CLICKED(IDC_VALUE_PLUSPLUS, OnValuePlusplus)
	ON_EN_SETFOCUS(IDC_EDIT_FN, OnSetfocusEditFn)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_PARAMPLUS,OnValuePlus)
	ON_MESSAGE(WM_PARAMDEC,OnValueDec)
	ON_MESSAGE(WM_UPDATAS,Onupdateparam)
	ON_MESSAGE(WM_UPVALUES,Onupdatevl)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CparamDlg message handlers

void CpaDlg::PostNcDestroy() 
{
	delete this ;
	CDialog::PostNcDestroy();
}

void CpaDlg::OnCancel() 
{
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())
							->m_hWnd,
					WM_COMMAND,
					ID_WK_PARAM,0) ; 

	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())
							->m_hWnd,
					WM_COMMAND,
					IDC_REFRESH ,0) ; 
	 

//	CDialog::OnCancel();
}

 
void CpaDlg::Onupdateparam(WPARAM wParam,LPARAM lParam) 
{
	m_pcwk=(CWK *)(wParam) ; // 
    if(m_pcwk)
	{
	m_pcwk->get_fn(m_fn);	 
	m_pcwk->get_b(m_w_6);
	m_pcwk->get_u(m_w_u);
	m_pcwk->get_k(m_k);
    m_pcwk->get_alpa(m_ac);
    m_pcwk->get_delta(m_lc); 
	m_pcwk->get_ramda(m_lpi);
	}
	 
	UpdateData(false);// update to board
}


void CpaDlg::OnOK() 
{
	UpdateData(true);// retieved to vars
	Enable4Button(false);
	GetDlgItem(IDOK)->EnableWindow(false);

	if(m_pcwk)
	{
	m_pcwk->set_fn(m_fn);
	m_pcwk->set_b(m_w_6);
	m_pcwk->set_u(m_w_u);
	m_pcwk->set_k(m_k);
    m_pcwk->set_alpa(m_ac);
    m_pcwk->set_delta(m_lc); 
	m_pcwk->set_ramda(m_lpi);
	}
	
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())
							->m_hWnd,
					WM_UPDAATEPARAM,
					0,0) ;

	
 	Enable4Button(true);
	GetDlgItem(IDOK)->EnableWindow(true);
}

void CpaDlg::OnSetfocusEditFn() 
{	
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("Chain-Code 文件");
}
void CpaDlg::OnSetfocusEditWeigted6() 
{
	UpdateData(true);
	pActive=(&(CpaDlg::m_w_6));
	Enable4Button(true);
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("σ:用于产生权值");
    updategragh();

}
void CpaDlg::OnSetfocusEditWU() 
{
	UpdateData(true);
	pActive=(&(CpaDlg::m_w_u));
	Enable4Button(true);
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("μ:用于产生权值");
	updategragh();
}

void CpaDlg::OnSetfocusEditK() 
{
    UpdateData(true);
	pActive=(&(CpaDlg::m_k)); 
	Enable4Button(true);

	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("κ:评估涉及范围");
}

void CpaDlg::OnSetfocusEditEalpa() 
{
    UpdateData(true);	
	pActive=(&(CpaDlg::m_ac));
	Enable4Button(true);

	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("α:角点阀值");
}

void CpaDlg::OnSetfocusEditLenCompare() 
{
	UpdateData(true);
	pActive=(&(CpaDlg::m_lc));
	Enable4Button(true);

	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("δ:比较涉及范围");
}

void CpaDlg::OnSetfocusEditLenPi() 
{
	UpdateData(true);	
	pActive=(&(CpaDlg::m_lpi));
	Enable4Button(true);

	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("λ:置角点旁π范围");
}


void CpaDlg::OnKillfocusEditWeigted6() 
{
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("");
}

void CpaDlg::OnKillfocusEditK() 
{	
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("");
}

void CpaDlg::OnKillfocusEditEalpa() 
{	
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("");
}

void CpaDlg::OnKillfocusEditLenCompare() 
{	
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("");
}
void CpaDlg::OnKillfocusEditLenPi() 
{
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("");
}




void CpaDlg::OnMove(int x, int y) 
{
	CDialog::OnMove(x, y);
	 
    CFrameWnd * pframewnd=((CFrameWnd*)::AfxGetApp()->GetMainWnd()) ;
	if(pframewnd==NULL)
		return ;
	CView * pview=pframewnd->GetActiveView();
	if(pview==NULL)
		return ;
	do{
	RECT rmain ;
	RECT rparam ;
	pframewnd->GetWindowRect(&rmain);
	GetWindowRect(&rparam) ;
	POINT pt ;
	pt.x=rparam.left ; pt.y=rparam.top ;
	if(PtInRect(&rmain,pt)) break ;
	pt.x=rparam.left ; pt.y=rparam.bottom;
	if(PtInRect(&rmain,pt)) break ;
	pt.x=rparam.right; pt.y=rparam.top;
	if(PtInRect(&rmain,pt)) break ;
	pt.x=rparam.right; pt.y=rparam.bottom;
	if(PtInRect(&rmain,pt)) break ;
 	return ;
	}while(0) ;
	
 	::PostMessage(pview->m_hWnd,WM_COMMAND,IDC_REFRESH ,0) ;		
}

void CpaDlg::OnChangeEditWeigted6() 
{
	updategragh();
}

void CpaDlg::OnChangeEditWU() 
{
	updategragh();
}

void CpaDlg::updategragh()
{
	char str_6[32];
	char str_u[32];
	GetDlgItem(IDC_EDIT_WEIGTED_6)->GetWindowText(str_6,32);
	GetDlgItem(IDC_EDIT_W_U)->GetWindowText(str_u,32);
	double d_w_6 =atof(str_6);
	double d_w_u =atof(str_u);
	
	CWnd * pgragh=GetDlgItem(IDC_STATIC_GRAPH) ;
	CDC  * pCDC = pgragh->GetDC(); 
	 
	RECT rsize ;
	pgragh->GetClientRect(&rsize);
	int ox=rsize.right-rsize.left;
	int oy=rsize.bottom-rsize.top;
	 
    
	int i , j ;
	for(i=0 ; i<ox ;i++)
		for(j=0 ; j<oy ; j++)
			pCDC->SetPixel(i,j,RGB(140,140,140)) ;
 
		double y_max =CWK::gformula(d_w_6,d_w_u,d_w_u);
	double yper=oy/((5.0/4.0)*y_max);
  
#define DISP 10
	pCDC->MoveTo(0,rsize.bottom-CWK::gformula(d_w_6,d_w_u,0)*yper-DISP);
	for(i=0;i<ox;i++)
	{
		j=rsize.bottom-CWK::gformula(d_w_6,d_w_u,((double)i*0.1))*yper-DISP ;
		pCDC->LineTo(i,j) ;
		if(i*0.1==(int)(i*0.1))
			pCDC->Ellipse(i-2,j-2,i+2,j+2);
	}
	char str_ymax[16];
	sprintf(str_ymax,"%f",y_max);
	GetDlgItem(IDC_STATIC_TEMP)->SetWindowText(str_ymax) ;
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText("正态分布曲线") ;
}

	   
void CpaDlg::Onupdatevl(WPARAM wParam,LPARAM lParam)
{
#define DISP2 10
	int  idx=(int)(wParam);
 	CWnd * pgragh=GetDlgItem(IDC_STATIC_GRAPH) ;
	CDC  * pCDC = pgragh->GetDC(); 
	 
	RECT rsize ;
	pgragh->GetClientRect(&rsize);
	int ox=rsize.right-rsize.left;
	int oy=rsize.bottom-rsize.top;
	   
	int i ;
	 
	CBrush cBG(RGB(212,208,200));
	CBrush *pOldBrush =NULL;
	pOldBrush=pCDC->SelectObject(&cBG);
	pCDC->Rectangle(&rsize);
	pCDC->SelectObject(pOldBrush);
	double npery=oy/(PI+0.2) ;
	int nperx=ox/20 ;

	POINT po , pt;
    int len=m_pcwk->get_len();
	po.x=ox/2+rsize.left;
	po.y=rsize.bottom-m_pcwk->get_vl(idx)*npery+DISP2;

	CBrush cMayBe(RGB(255,0,0));
	CBrush cCenterN(RGB(0,0,255));
	 
	pCDC->MoveTo(po);
	for(i=1;i<10;i++)
	{
		pt.x=po.x+nperx*i ;
		pt.y=rsize.bottom-m_pcwk->get_vl((idx+i)%len)*npery+DISP2;
		pCDC->LineTo(pt);
		if(m_pcwk->get_vl((idx+i)%len)*180.0/PI<m_ac)
		{
			pOldBrush=pCDC->SelectObject(&cMayBe);
			pCDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);
			pCDC->SelectObject(pOldBrush);
		}
		else
		{
			pCDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);
		}
	}

	pCDC->MoveTo(po);
	for(i=1;i<10;i++)
	{
		pt.x=po.x-nperx*i ;
		pt.y=rsize.bottom-m_pcwk->get_vl((idx-i+len)%len)*npery+DISP2;
		pCDC->LineTo(pt);
		
		if(m_pcwk->get_vl((idx-i+len)%len)*180.0/PI<m_ac)
		{
			pOldBrush=pCDC->SelectObject(&cMayBe);
			pCDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);
			pCDC->SelectObject(pOldBrush);
		}
		else
		{
			pCDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2);
		}			
	}

	if(m_pcwk->get_vl(idx)*180.0/PI<m_ac)
	{
		pOldBrush=pCDC->SelectObject(&cMayBe);
		pCDC->Ellipse(po.x-3,po.y-3,po.x+3,po.y+3);
		pCDC->SelectObject(pOldBrush);
	}
	else
	{
		pOldBrush=pCDC->SelectObject(&cCenterN);
		pCDC->Ellipse(po.x-3,po.y-3,po.x+3,po.y+3);
		pCDC->SelectObject(pOldBrush);
	}

	char str[32];
	
	sprintf(str,"评估值%.3f",m_pcwk->get_vl(idx)*180.0/PI);
	GetDlgItem(IDC_STATIC_INFO)->SetWindowText(str);
	if(idx==1)
		sprintf(str,"%d st",idx) ;
	else if(idx==2)
		sprintf(str,"%d nd",idx) ;
	else if(idx==3)
		sprintf(str,"%d rd",idx) ;
	else
		sprintf(str,"%d th",idx) ;

	GetDlgItem(IDC_STATIC_TEMP)->SetWindowText(str) ;
}
void CpaDlg::OnValuePlus() 
{
	Enable4Button(false);
	GetDlgItem(IDOK)->EnableWindow(false);
	if(pActive==NULL)
		return ;	    	 
    
	UpdateData(true);
		 
	if(*pActive==(int)(*pActive))
	{ // note : this is interg value. 1++
		*pActive=*pActive+1 ;		
	}
	else  
	{ // note : this is real value. 0.10001++
		*pActive=*pActive+0.100001 ;		
	}
    UpdateData(false);

	if(m_pcwk)
	{
	m_pcwk->set_fn(m_fn);
	m_pcwk->set_b(m_w_6);
	m_pcwk->set_u(m_w_u);
	m_pcwk->set_k(m_k);
    m_pcwk->set_alpa(m_ac);
    m_pcwk->set_delta(m_lc); 
	m_pcwk->set_ramda(m_lpi);
	}
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())
							->m_hWnd,
					WM_UPDAATEPARAM,
					0,0) ;	

	 
	Enable4Button(true);
	GetDlgItem(IDOK)->EnableWindow(true);
    updategragh();	
}

void CpaDlg::OnValueDec() 
{
	Enable4Button(false);
	GetDlgItem(IDOK)->EnableWindow(false);
	if(pActive==NULL)
		return ;	    
	     
	UpdateData(true);
		 
	if(*pActive==(int)(*pActive))
	{ // note : this is interg value. 1++
		*pActive=*pActive-1 ;		
	}
	else  
	{ // note : this is real value. 0.10001++
		*pActive=*pActive-0.100001 ;		
	}
    UpdateData(false);
	 
	if(m_pcwk)
	{
	m_pcwk->set_fn(m_fn);
	m_pcwk->set_b(m_w_6);
	m_pcwk->set_u(m_w_u);
	m_pcwk->set_k(m_k);
    m_pcwk->set_alpa(m_ac);
    m_pcwk->set_delta(m_lc); 
	m_pcwk->set_ramda(m_lpi);
	}
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())
							->m_hWnd,
					WM_UPDAATEPARAM,
					0,0) ;	

	 
	Enable4Button(true);
	GetDlgItem(IDOK)->EnableWindow(true);
    updategragh();		
}

void CpaDlg::OnValueDecdec() 
{	
	Enable4Button(false);
	GetDlgItem(IDOK)->EnableWindow(false);
	if(pActive==NULL)
		return ;	    
	 
    
	UpdateData(true);
		 
	if(*pActive==(int)(*pActive))
	{ // note : this is interg value. 1++
		*pActive=*pActive-10 ;		
	}
	else  
	{ // note : this is real value. 0.10001++
		*pActive=*pActive-1.100001 ;		
	}
    UpdateData(false);

	if(m_pcwk)
	{
	m_pcwk->set_fn(m_fn);
	m_pcwk->set_b(m_w_6);
	m_pcwk->set_u(m_w_u);
	m_pcwk->set_k(m_k);
    m_pcwk->set_alpa(m_ac);
    m_pcwk->set_delta(m_lc); 
	m_pcwk->set_ramda(m_lpi);
	}
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())							
							->m_hWnd,
					WM_UPDAATEPARAM,
					0,0) ;	

	 
	Enable4Button(true);
	GetDlgItem(IDOK)->EnableWindow(true);
    updategragh();	
}

void CpaDlg::OnValuePlusplus() 
{	
	Enable4Button(false);
	GetDlgItem(IDOK)->EnableWindow(false);
	if(pActive==NULL)
		return ;	    
	    
	UpdateData(true);
		 
	if(*pActive==(int)(*pActive))
	{ // note : this is interg value. 1++
		*pActive=*pActive+10 ;		
	}
	else  
	{ // note : this is real value. 0.10001++
		*pActive=*pActive+1.100001 ;		
	}
    UpdateData(false);

	if(m_pcwk)
	{
	m_pcwk->set_fn(m_fn);
	m_pcwk->set_b(m_w_6);
	m_pcwk->set_u(m_w_u);
	m_pcwk->set_k(m_k);
    m_pcwk->set_alpa(m_ac);
    m_pcwk->set_delta(m_lc); 
	m_pcwk->set_ramda(m_lpi);
	}
	::SendMessage(((CFrameWnd*)::AfxGetApp()
						->GetMainWnd())						
							->m_hWnd,
					WM_UPDAATEPARAM,
					0,0) ;	

	 
	Enable4Button(true);
	GetDlgItem(IDOK)->EnableWindow(true);
    updategragh();		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -