📄 wbase.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 + -