📄 wr.cpp
字号:
//wk1.cpp
#include <StdAfx.h>
#include <windows.h>
#include <string.h>
#include <vector>
#include <iomanip.h>
#include <math.h>
#include "wr.h"
using namespace std ;
///////////////////////////////////////////////求两点间距离
double distance(POT a,POT b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
///////////////////////////////////////////////////////////取得正太分布值
/////////////////////////////////////////////////初始化参数
CWR::CWR(HWND hwnd_pa)
{
m_hwnd_pa=hwnd_pa;
::AfxGetApp()->GetMainWnd()->SetWindowText("角度权值算法");
}
CWR::~CWR()
{
::AfxGetApp()->GetMainWnd()->SetWindowText("");
}
void CWR::setparam(const char * filename ,
double _b____b,
double _u____u,
int dmin___k,
int dmax___delta,
double alpa___alpa,
int n___ramda
)
{
strcpy(wkp.fn,filename);
wkp.dmin=dmin___k ;
wkp.dmax= dmax___delta;
wkp.alpa= alpa___alpa;
wkp._b=_b____b ;
wkp._u= _u____u;
wkp.n=n___ramda ;
}
char*
CWR::getfn()
{
return wkp.fn;
}
///////////////////////////////////////////////第一次扫描
void CWR::firstscanf()
{ bl.clear();
vlsv.clear();
vwk.clear();
for(int i=0;i<list_n.size();i++)bl.push_back(true);
int jt,kt,len;
double aftemp1;
len=list_n.size();
for(i=0;i<len;i++)
{
int mid;
mid=(wkp.dmin+wkp.dmax)*(wkp.dmin+wkp.dmax)/4;
int j=1;
jt=(i+j)%len;
while(distance(list_n[i],list_n[jt])<mid)
{
jt=(i+j)%len;
j++;
}
int k=1;
kt=(i-k+len)%len;
while(distance(list_n[i],list_n[kt])<mid)
{
k++;
kt=(i-k+len)%len;
}
vPOT tp ;
tp.x=(double) list_n[kt].x-list_n[i].x;
tp.y=(double) list_n[kt].y-list_n[i].y;
vwk.push_back(tp);
tp.x=(double) list_n[jt].x-list_n[i].x;
tp.y=(double) list_n[jt].y-list_n[i].y;
vwk.push_back(tp);
double af[10];
for(j=0;j<wkp.n;j++)
{
double a=sqrt(distance(list_n[i],list_n[(jt-2+j+len)%len] ));
double b=sqrt(distance(list_n[i],list_n[(kt+2-j+len)%len] ));
double c=sqrt(distance(list_n[(jt-2+j+len)%len],list_n[(kt+2-j+len)%len]));
af[j]=acos2((a*a+b*b-c*c)/(2*a*b));
}
double sum=0;
double fai;
aftemp1=0;
for(j=0;j<wkp.n;j++)
{
fai=gformula(wkp._b ,wkp._u , j-wkp.n/2);
aftemp1+=af[j]*fai;
sum+=fai;
}
aftemp1/=sum;
vlsv.push_back(aftemp1);
if(aftemp1>wkp.alpa/180.0*PI)bl[i]=false;
}
}
/////////////////////////////////////////////////////第二次扫描
void CWR::secondscanf()
{
int len=wkp.totaln;
int ii,i;
for(i=0;i<len;i++)
if(bl[i])
{
for(ii=0;
distance(list_n[i],list_n[(i+1+ii+len)%len])<wkp.dmax*wkp.dmax;
ii++
)
if(vlsv[i]>=vlsv[(i+1+ii+len)%len])bl[i]=false;
}
for(i=0;i<len;i++)
if(bl[i])
{
for(ii=0;
distance(list_n[i],list_n[(i+1-ii+len)%len])<wkp.dmax*wkp.dmax;
ii++)
if(vlsv[i]>vlsv[(i+1-ii+len)%len])bl[i]=false;
}
wkp.m_cornerpoint=0;
for(i=0;i<bl.size();i++)
if(bl[i])wkp.m_cornerpoint++;
}
void
CWR::startwk()
{
wkp.totaln=rchaincode(wkp.fn);
firstscanf();
secondscanf();
}
////////////////////////////////////////////输出关于角点检测算法的数据详细信息
void CWR::get_data(const char * logname)
{
ofstream oon (logname);
oon<<"Y.H.He"<<endl;
SYSTEMTIME st ;
GetLocalTime(&st);
oon<<st.wYear<<"-"<<st.wMonth<<"-"<<st.wDay <<endl
<<st.wHour<<":"<<st.wMinute<<":"<<st.wSecond<<endl ;
oon<<"-----------------------关于角点检测算法的数据详细信息---------"<<"\n"<<"\n";
oon<<"#######################原始参数的值###########################\n";
oon<<"打开的文件是: "<<wkp.fn<<"\n";
oon<<"曲线上点的个数是: "<<wkp.totaln<<"\n";
oon<<"检测到点的个数是: "<<wkp.m_cornerpoint<<"\n";
oon<<"角点最大角度值是: "<<wkp.alpa<<"\n";
oon<<"距离最小值dmin是: "<<wkp.dmin<<"\n";
oon<<"距离最大值dmax是: "<<wkp.dmax<<"\n";
oon<<"正态分布函数参数σ是: "<<wkp._b<<"\n";
oon<<"正态分布函数参数μ是: "<<wkp._u<<"\n";
oon<<"正态分布函数参数 n是: "<<wkp.n<<"\n";
oon<<"#######################点的坐标和评估值#######################\n";
for(int i=0;i<list_n.size();i++)
if(bl[i])
{
oon<<"第"<<i<<"个点 坐标是:("<<list_n[i].x<<","<<list_n[i].y<<")"
<<",角度评估是:"<<vlsv[i]*180/PI<<", 角点\n";
}
else
{
oon<<"第"<<i<<"个点 坐标是:("<<list_n[i].x<<","<<list_n[i].y<<")"
<<",角度评估是:"<<vlsv[i]*180/PI<<", 非角点\n";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -