最小二乘法可根据坐标点的信息拟合出一条最优直线,y=bx+a,保证每个坐标点到直线的距离之和达到最小值。
前提条件是先筛选出有效的坐标点,再进行算法处理。
代码如下:(实测可用)
/****************声明定义*************************/
float[] distance = new float[271];
float length;
float[] ArrPoint_X = new float[270];
float[] ArrPoint_Y = new float[270];
ArrayList pointX = new ArrayList();
ArrayList pointY = new ArrayList();
float lengthX;
float lengthY;
float theta;
float dis_length;
float dis_theta;
/****************函数实现*************************//最小二乘法,拟合直线
int ArrPoint_Count = 0;
for (int i = (135 - 23 * 3); i <= (135 + 23 * 3); i++) //边缘检测
{
length = distance[i];
if ((length > 100) && (length < User_length))
{
theta = (float)((i / 3) + 45); //极坐标系往直角坐标系转换
lengthX = length * (float)(Math.Cos(Math.PI * theta / 180));
lengthY = length * (float)(Math.Sin(Math.PI * theta / 180));
pointX.Add(lengthX);
pointY.Add(lengthY);
ArrPoint_X[ArrPoint_Count] = lengthX;
ArrPoint_Y[ArrPoint_Count] = lengthY;
ArrPoint_Count++;
}
}
float averagex = 0, averagey = 0;
foreach (float i in pointX)
{
averagex += i;
}
foreach (float j in pointY)
{
averagey += j;
}
averagex /= pointX.Count; // 取X坐标的平均数
averagey /= pointY.Count; // 取Y坐标的平均数
//经验回归系数的分子与分母
float numerator = 0;
float denominator = 0;
for (int i = 0; i < pointX.Count; i++)
{
numerator += (ArrPoint_X[i] - averagex) * (ArrPoint_Y[i] - averagey);
denominator += (ArrPoint_X[i] - averagex) * (ArrPoint_X[i] - averagex);
}
//回归系数b(Regression Coefficient) y = bx + a ;
float RCB = numerator / denominator;
//回归系数a
float RCA = averagey - RCB * averagex;