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

📄 wbase.cpp

📁 曲线角点检测的二种算法
💻 CPP
字号:
// WBase.cpp: implementation of the CWBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "cpd.h"
#include "WBase.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWBase::CWBase()
		 :bfirstdraw(true),
		  bgetpoint(false),
		  b_pt_bone(true),
		  b_pt_vector(true)
{
}

CWBase::~CWBase()
{
}
int CWBase::rchaincode(char * pname)
{
	list_n.clear();
//	ifstream in (wkp.fn);
ifstream in ( pname);
	int i ;
	int len =0 ;
	POT tp ;
	while(in>>i)
	{
		len++ ;
		in>>tp.x ;
		in>>tp.y ;
	    list_n.push_back(tp);
	}
    in.close();
	totaln=len ;
	return len ;
}
double CWBase::gformula(double _b , double _u , double x)  
{
	double d1 , d2 ;
	d1=1.0/(sqrt(2.0*PI)*_b);
	d2=-1.0/(2.0*_b*_b) ;	
	return d1*exp(d2*(x-_u)*(x-_u)) ;
}

void CWBase::grect(RECT & r) const
{
	r.left=r.top= 10000;
	r.right=r.bottom=0 ;
	int len= list_n.size();
	for(int i=0 ; i<len ;i++)
	{
		if(list_n[i].x<r.left)
			r.left=list_n[i].x;
		if(list_n[i].y<r.top)
			r.top=list_n[i].y;
		if(list_n[i].x>r.right)
			r.right=list_n[i].x;
		if(list_n[i].y>r.bottom)
			r.bottom=list_n[i].y;
	}
}
void CWBase::drawptvector(int idx , CDC *pDC) const
{
	POINT  pt_o= {DRAW_BONE_ORG_X ,DRAW_BONE_ORG_Y } ;
	CPen cp(PS_DASH,1,RGB(0,102,204));
	CPen * pOldPen=pDC->SelectObject(&cp) ;
	
	 
	vPOT  vb , vf;
	
	vb.x=vwk[idx*2].x;
	vb.y=vwk[idx*2].y;
	double vbr=sqrt(vb.x*vb.x+vb.y*vb.y);
    vb.x=pt_o.x+VECTOR_LEN*vb.x/vbr;
	vb.y=pt_o.y+VECTOR_LEN*vb.y/vbr;
	//....
	vf.x=vwk[idx*2+1].x;
	vf.y=vwk[idx*2+1].y;
	double vfr=sqrt(vf.x*vf.x+vf.y*vf.y);
    vf.x=pt_o.x+VECTOR_LEN*vf.x/vfr;
	vf.y=pt_o.y+VECTOR_LEN*vf.y/vfr;
    
	// draw vector..
    pDC->MoveTo(pt_o) ; 
	pDC->LineTo(vb.x,vb.y);
	pDC->MoveTo(pt_o);
	pDC->LineTo(vf.x,vf.y);

	pDC->SelectObject(pOldPen);

	CBrush cmston(RGB(200,20,0)) ;
	CBrush cmstoc(RGB(100,255,0));
    CBrush *pHolder=NULL ;

	if(bl[idx])
		pHolder=pDC->SelectObject(&cmstoc);
	else 
		pHolder=pDC->SelectObject(&cmston);

	pDC->Ellipse(pt_o.x-3,pt_o.y-3,pt_o.x+3,pt_o.y+3);

	pDC->SelectObject(pHolder);
}
void CWBase::drawpttype(int idx , CDC *pDC) const
{
	POINT  pt_o= {DRAW_BONE_ORG_X ,DRAW_BONE_ORG_Y } ;
	POINT  ptf = {DRAW_BONE_ORG_X ,DRAW_BONE_ORG_Y } ;
	POINT  ptb = {DRAW_BONE_ORG_X ,DRAW_BONE_ORG_Y } ;
	int len = list_n.size();
    CBrush cmston(RGB(200,20,0)) ;
	CBrush cmstoc(RGB(100,255,0));
	CBrush cPbrush(RGB(0,255,0));
	CBrush cNormal(RGB(0,0,200));
	CBrush *pHolder =pDC->SelectObject(&cNormal);;
	pDC->MoveTo(pt_o);
	for(int i=0 ; i<DRAW_BONE_ARM ; i++)
	{      
		pDC->LineTo(ptf.x+=(list_n[(idx+i+1)%len].x-list_n[(idx+i)%len].x)*DRAW_BONE_STEP ,
					ptf.y+=(list_n[(idx+i+1)%len].y-list_n[(idx+i)%len].y)*DRAW_BONE_STEP);
		if(bl[(idx+i+1)%len])
			pDC->SelectObject(&cPbrush);
	    else 
			pDC->SelectObject(&cNormal);
		pDC->Ellipse(ptf.x-2,ptf.y-2,ptf.x+2,ptf.y+2);
	}
	pDC->MoveTo(pt_o);
	for(i=0 ;i<DRAW_BONE_ARM ;i++)
	{   		
		pDC->LineTo(ptb.x+=(list_n[(idx-i-1+len)%len].x-list_n[(idx-i+len)%len].x)*DRAW_BONE_STEP,
					ptb.y+=(list_n[(idx-i-1+len)%len].y-list_n[(idx-i+len)%len].y)*DRAW_BONE_STEP);
		if(bl[(idx-i-1+len)%len])
			pDC->SelectObject(&cPbrush);
	    else 
			pDC->SelectObject(&cNormal);
		pDC->Ellipse(ptb.x-2,ptb.y-2,ptb.x+2,ptb.y+2);
	}
	// org is: mouse point to 
	if(bl[idx])
		pDC->SelectObject(&cmstoc);
	else 
		pDC->SelectObject(&cmston);
	pDC->Ellipse(pt_o.x-3,pt_o.y-3,pt_o.x+3,pt_o.y+3);
	pDC->SelectObject(pHolder);
}
void CWBase::drawmap(CDC * pDC)  
{  
		int len = get_len();
		CBrush cPbrush(RGB(0,255,0));
		CBrush mousepb(RGB(100,100,100)) ;
		CBrush * pBrushHold ;
        
		CRect clrect;
		
		GetClientRect(::AfxGetApp()->GetMainWnd()->m_hWnd,&clrect);
		CDC mDC ;
		CBitmap * pOldbmp;
		 	 			
		mDC.CreateCompatibleDC(pDC);
		if(bfirstdraw)
		{   
			bfirstdraw=false ;
			if((HBITMAP)cMBitmap)
			{
				CloseHandle((HBITMAP)cMBitmap) ;
				cMBitmap.m_hObject=NULL;
			}
			cMBitmap.CreateCompatibleBitmap(pDC,
											clrect.right-clrect.left,
											clrect.bottom-clrect.top);	
			pOldbmp=mDC.SelectObject(&cMBitmap); 

			pBrushHold=pDC->SelectObject(&cPbrush);
			POT pot_n ;
			for(int i=0 ; i<len; i++)
			{	
				pot_n=get_n(i);
				pDC->SetPixel(pot_n.x,pot_n.y,RGB(255,0,0));
				if(get_iscp(i))			
					pDC->Ellipse(pot_n.x-2,
								 pot_n.y-2,
								 pot_n.x+2,
								 pot_n.y+2);		 
			}	
			pDC->SelectObject(pBrushHold);
			mDC.BitBlt(0,0,
					   clrect.right-clrect.left,
					   clrect.bottom-clrect.top ,
					   pDC,
					   0,0,
					   SRCCOPY); 
			return ;
		}// if(bfirstdraw)...
		pOldbmp=mDC.SelectObject(&cMBitmap); 

		RECT rObj ;
		grect(rObj);
        pDC->BitBlt(rObj.left-20,rObj.top-20,
					rObj.right-rObj.left+40,
					rObj.bottom-rObj.top+40,
					&mDC, 
					rObj.left-20,rObj.top-20, 
					SRCCOPY );  
		
		
		

		if(bgetpoint)/*mouse get it one*/
		{
			pDC->BitBlt(DRAW_BONE_ORG_X-DRAW_BONE_STEP*DRAW_BONE_ARM-5,
			        DRAW_BONE_ORG_Y-DRAW_BONE_STEP*DRAW_BONE_ARM-5,
					DRAW_BONE_STEP*DRAW_BONE_ARM*2+10,
					DRAW_BONE_STEP*DRAW_BONE_ARM*2+10, 
					&mDC, 
					DRAW_BONE_ORG_X-DRAW_BONE_STEP*DRAW_BONE_ARM-5,
			        DRAW_BONE_ORG_Y-DRAW_BONE_STEP*DRAW_BONE_ARM-5,
					SRCCOPY );

			pBrushHold=pDC->SelectObject(&mousepb);	
			pDC->Ellipse(m_npt.x-2,m_npt.y-2,m_npt.x+2,m_npt.y+2);
			pDC->MoveTo(m_mpt.x,m_mpt.y);
			pDC->LineTo(m_npt.x,m_npt.y);
			pDC->SelectObject(pBrushHold);
			// draw line above
			
			if(b_pt_bone)
				drawpttype(m_idx,pDC) ;
			if(b_pt_vector)
				drawptvector(m_idx,pDC);
			 		
		} 	
		 
		mDC.SelectObject(pOldbmp); 		
/*---------------------------------------------*/	
}
inline int p2p(POT a , POT b)
{
	return  (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ;		
}
bool CWBase::gptinfo(POT & pt, int & idx) const 
{  
    int pt_be =0;
	int dist=200;
	int len =totaln; 
	int i=0 ;
	
	for(;i<len;i++)
	{
		int d = p2p(pt,list_n[i]);
		 
		if(d>200)
		{
			//i+=sqrt(d);
			continue;
		}
		else if(d<dist)
		{
			pt_be=i;
			dist=d;
		}			
	} 
	
    if(dist>=200) 
		return false;
	pt.x=list_n[pt_be].x;
	pt.y=list_n[pt_be].y;

	idx=pt_be ;
	
    return true ;
}

void CWBase::UpdatePa()
{
	PostMessage(m_hwnd_pa,WM_UPDATAS,(WPARAM)this,0);
}
void CWBase::UpdataVl()
{
	if(bgetpoint)
	PostMessage(m_hwnd_pa,WM_UPVALUES,(WPARAM)m_idx,0);
}

⌨️ 快捷键说明

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