最小二乘法拟合圆公式推导及vc实现[转]

 






 

VC实现的代码:

void  CViewActionImageTool::LeastSquaresFitting()
{
    
if (m_nNum<3)
    
{
        
return;
    }


    
int i=0;

    
double X1=0;
    
double Y1=0;
    
double X2=0;
    
double Y2=0;
    
double X3=0;
    
double Y3=0;
    
double X1Y1=0;
    
double X1Y2=0;
    
double X2Y1=0;

    
for (i=0;i<m_nNum;i++)
    
{
        X1 
= X1 + m_points[i].x;
        Y1 
= Y1 + m_points[i].y;
        X2 
= X2 + m_points[i].x*m_points[i].x;
        Y2 
= Y2 + m_points[i].y*m_points[i].y;
        X3 
= X3 + m_points[i].x*m_points[i].x*m_points[i].x;
        Y3 
= Y3 + m_points[i].y*m_points[i].y*m_points[i].y;
        X1Y1 
= X1Y1 + m_points[i].x*m_points[i].y;
        X1Y2 
= X1Y2 + m_points[i].x*m_points[i].y*m_points[i].y;
        X2Y1 
= X2Y1 + m_points[i].x*m_points[i].x*m_points[i].y;
    }


    
double C,D,E,G,H,N;
    
double a,b,c;
    N 
= m_nNum;
    C 
= N*X2 - X1*X1;
    D 
= N*X1Y1 - X1*Y1;
    E 
= N*X3 + N*X1Y2 - (X2+Y2)*X1;
    G 
= N*Y2 - Y1*Y1;
    H 
= N*X2Y1 + N*Y3 - (X2+Y2)*Y1;
    a 
= (H*D-E*G)/(C*G-D*D);
    b 
= (H*C-E*D)/(D*D-G*C);
    c 
= -(a*X1 + b*Y1 + X2 + Y2)/N;

    
double A,B,R;
    A 
= a/(-2);
    B 
= b/(-2);
    R 
= sqrt(a*a+b*b-4*c)/2;

    m_fCenterX 
= A;
    m_fCenterY 
= B;
    m_fRadius 
= R;

    
return;
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值