#include <stdio.h>
#include <math.h>
typedef struct tagPOINT_2 {
double x;
double y;
}POINT_2, *PPOINT_2;
int LineInfo(POINT_2 *pt_input, int ptNumbers, double * k, double * b)
{
int nRet = 0;
double X_aver = 0;
double Y_aver = 0;
double A = 0;
double B = 0;
double _2_XY_av = 0;
double _2_XX_av = 0;
do
{
if (ptNumbers < 2)
{
nRet = -1;
break;
}
for (int loop = 0; loop < ptNumbers; loop++)
{
X_aver += pt_input[loop].x;
Y_aver += pt_input[loop].y;
_2_XY_av += pt_input[loop].x * pt_input[loop].y;
_2_XX_av += pt_input[loop].x * pt_input[loop].x;
}
X_aver /= ptNumbers;
Y_aver /= ptNumbers;
_2_XY_av /= ptNumbers;
_2_XX_av /= ptNumbers;
for (int loop = 0; loop < ptNumbers; loop++)
{
A += fabs((pt_input[loop].x - X_aver) * (pt_input[loop].y - Y_aver));
B += fabs((pt_input[loop].x - X_aver) * (pt_input[loop].x - X_aver));
}
if (B < 0.000001)
{
nRet = -2;
break;
}
//方式一
//*k = A / B;
//*b = Y_aver - *k * X_aver;
//方式二
*k = (_2_XY_av - X_aver * Y_aver) / (_2_XX_av - X_aver * X_aver);
*b = Y_aver - (*k) * X_aver;
} while (0);
return nRet;
}
int main()
{
POINT_2 pt[16] = {
{0,0},
{5182,5000},
{10391,10000},
{15628,15000},
{20791,20000},
{26001,25000},
{31228,30000},
{36419,35000},
{41683,40000},
{46846,45000},
{52083,50000},
{57292,55000},
{62263,60000},
{67674,65000},
{72966,70000},
{83375,80000},
};
int ret;
double k = 0, b = 0;
ret = LineInfo(pt, 10, &k, &b);
if(ret == 0)
{
printf("拟合成功,直线为y = %lf * x + %lf\n", k, b);
}
else if(ret == -1)
{
printf("拟合失败,传入的点少于二点\n");
}
else if(ret == -2)
{
printf("拟合失败,传入的点x坐标重合\n");
}
else
{
printf("error\n");
}
return 0;
}