blob: 096d5f7ab9f2372703b8e9a86175c14c962b3268 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
/*
* Copyright 2015 The Etc2Comp Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "EtcConfig.h"
#include "EtcMath.h"
namespace Etc
{
// ----------------------------------------------------------------------------------------------------
// calculate the line that best fits the set of XY points contained in a_afX[] and a_afY[]
// use a_fSlope and a_fOffset to define that line
//
bool Regression(float a_afX[], float a_afY[], unsigned int a_Points,
float *a_fSlope, float *a_fOffset)
{
float fPoints = (float)a_Points;
float fSumX = 0.0f;
float fSumY = 0.0f;
float fSumXY = 0.0f;
float fSumX2 = 0.0f;
for (unsigned int uiPoint = 0; uiPoint < a_Points; uiPoint++)
{
fSumX += a_afX[uiPoint];
fSumY += a_afY[uiPoint];
fSumXY += a_afX[uiPoint] * a_afY[uiPoint];
fSumX2 += a_afX[uiPoint] * a_afX[uiPoint];
}
float fDivisor = fPoints*fSumX2 - fSumX*fSumX;
// if vertical line
if (fDivisor == 0.0f)
{
*a_fSlope = 0.0f;
*a_fOffset = 0.0f;
return true;
}
*a_fSlope = (fPoints*fSumXY - fSumX*fSumY) / fDivisor;
*a_fOffset = (fSumY - (*a_fSlope)*fSumX) / fPoints;
return false;
}
// ----------------------------------------------------------------------------------------------------
//
} // namespace Etc
|