资源简介
通过最小二乘法计算圆心坐标及半径,显示残差V=B*dX-L
代码片段和文件信息
#include “StdAfx.h“
#include “Circle.h“
#include “Matrix.h“
#include
CCircle::CCircle(void)
{
}
CCircle::~CCircle(void)
{
}
int CCircle::SplitStringArray(CString str char split CStringArray& aStr)
{
int startIdx = 0;
int idx = str.Find(split startIdx);
aStr.RemoveAll();//先清空
while (-1 != idx)
{
CString sTmp = str.Mid(startIdx idx - startIdx);
aStr.Add(sTmp);
startIdx = idx + 1;
idx = str.Find(split startIdx);
}
CString sTmp = str.Right(str.GetLength() - startIdx);
if (! sTmp.IsEmpty())
aStr.Add(sTmp);
return aStr.GetSize();
}
BOOL CCircle::Reorder(CString& str)
{
CStringArray aStrLine;
PCount=SplitStringArray(str13aStrLine); //得到数据的行数
if(PCount<3)
{
AfxMessageBox(_T(“输入的数据不完整!!!“));
return FALSE;
}
p=new HPOINT [PCount];
CStringArray aStrTmp;
int n;
for(int i=0;i {
n=SplitStringArray(aStrLine[i]‘ ‘aStrTmp);
p[i].x=_tstof(aStrTmp[1]);
p[i].y=_tstof(aStrTmp[2]);
}
return TRUE;
}
BOOL CCircle::LeastSquare(CString& str)
{
CMatrix B(PCount3); //系数矩阵
CMatrix L(PCount1); //常数项阵
CMatrix dX(PCount1); //参数改正数
CMatrix V(PCount1); //残差
CMatrix rou(PCount1);
CMatrix N(33); //法方程系数阵
CMatrix W(31); //法方程常数阵
double x0=0;
double y0=0;
for(int i=0;i {
x0+=p[i].x;
y0+=p[i].y;
}
x0=x0/PCount;
y0=y0/PCount;
double r0=1;
do
{
for(int i=0;i {
rou(i0)=sqrt(pow((p[i].x-x0)2)+pow((p[i].y-y0)2));
B(i0)=(x0-p[i].x)/rou(i0);
B(i1)=(y0-p[i].y)/rou(i0);
B(i2)=-1;
L(i0)=r0-rou(i0);
}
N=~B*B;
W=~B*L;
dX=N.Inv()*W;
x0=x0+dX(00);//拟合直线的斜距
y0=y0+dX(10);//拟合直线的斜率
r0=r0+dX(20);
}while (fabs(dX(20))>1e-5);
//CMatrix V;
V=B*dX-L;
//x=x0;
//y=y0;
//r=r0;
CString strastrbtemp;
stra.Format(_T(“ 圆心坐标X 圆心坐标Y 半径R\r\n%10.4f%10.4f%10.4f\r\n“)x0y0r0);
for(int i=0;i {
strb.Format(_T(“%7.4f\r\n“)V(i0));
temp+=strb;
}
str=stra+“ 残差V=B*dx-L\r\n“+temp;
return true;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 190976 2016-10-20 14:58 FittingCircle\Debug\FittingCircle.exe
文件 1280792 2016-10-20 14:58 FittingCircle\Debug\FittingCircle.ilk
文件 5213184 2016-10-20 14:58 FittingCircle\Debug\FittingCircle.pdb
文件 2162 2016-10-20 14:58 FittingCircle\FittingCircle\Circle.cpp
文件 497 2016-10-20 14:50 FittingCircle\FittingCircle\Circle.h
文件 57615 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\Circle.obj
文件 4030 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\cl.command.1.tlog
文件 69954 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\CL.read.1.tlog
文件 4570 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\CL.write.1.tlog
文件 915 2016-10-20 10:57 FittingCircle\FittingCircle\Debug\FittingCircle.exe.em
文件 980 2016-10-20 10:57 FittingCircle\FittingCircle\Debug\FittingCircle.exe.em
文件 640 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\FittingCircle.exe.intermediate.manifest
文件 65 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\FittingCircle.lastbuildstate
文件 3355 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\FittingCircle.log
文件 30434 2016-10-20 14:51 FittingCircle\FittingCircle\Debug\FittingCircle.obj
文件 33751040 2016-10-20 10:57 FittingCircle\FittingCircle\Debug\FittingCircle.pch
文件 70064 2016-10-20 14:57 FittingCircle\FittingCircle\Debug\FittingCircle.res
文件 713 2016-10-20 11:38 FittingCircle\FittingCircle\Debug\FittingCircle.vcxprojResolveAssemblyReference.cache
文件 0 2016-10-20 10:57 FittingCircle\FittingCircle\Debug\FittingCircle.write.1.tlog
文件 56553 2016-10-20 14:51 FittingCircle\FittingCircle\Debug\FittingCircleDlg.obj
文件 216 2016-10-20 10:57 FittingCircle\FittingCircle\Debug\FittingCircle_manifest.rc
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
文件 2 2016-10-20 14:58 FittingCircle\FittingCircle\Debug\li
............此处省略47个文件信息
评论
共有 条评论