mirror of
https://github.com/bkaradzic/bx.git
synced 2026-02-20 13:53:15 +01:00
Added calcLinearFit.
This commit is contained in:
@@ -833,6 +833,82 @@ namespace bx
|
||||
_result[3] = -vec3Dot(normal, _va);
|
||||
}
|
||||
|
||||
inline void calcLinearFit2D(float _result[2], const void* _points, uint32_t _stride, uint32_t _numPoints)
|
||||
{
|
||||
float sumX = 0.0f;
|
||||
float sumY = 0.0f;
|
||||
float sumXX = 0.0f;
|
||||
float sumXY = 0.0f;
|
||||
|
||||
const uint8_t* ptr = (const uint8_t*)_points;
|
||||
for (uint32_t ii = 0; ii < _numPoints; ++ii, ptr += _stride)
|
||||
{
|
||||
const float* point = (const float*)ptr;
|
||||
float xx = point[0];
|
||||
float yy = point[1];
|
||||
sumX += xx;
|
||||
sumY += yy;
|
||||
sumXX += xx*xx;
|
||||
sumXY += xx*yy;
|
||||
}
|
||||
|
||||
// [ sum(x^2) sum(x) ] [ A ] = [ sum(x*y) ]
|
||||
// [ sum(x) numPoints ] [ B ] [ sum(y) ]
|
||||
|
||||
float det = (sumXX*_numPoints - sumX*sumX);
|
||||
float invDet = 1.0f/det;
|
||||
|
||||
_result[0] = (-sumX * sumY + _numPoints * sumXY) * invDet;
|
||||
_result[1] = (sumXX * sumY - sumX * sumXY) * invDet;
|
||||
}
|
||||
|
||||
inline void calcLinearFit3D(float _result[3], const void* _points, uint32_t _stride, uint32_t _numPoints)
|
||||
{
|
||||
float sumX = 0.0f;
|
||||
float sumY = 0.0f;
|
||||
float sumZ = 0.0f;
|
||||
float sumXX = 0.0f;
|
||||
float sumXY = 0.0f;
|
||||
float sumXZ = 0.0f;
|
||||
float sumYY = 0.0f;
|
||||
float sumYZ = 0.0f;
|
||||
|
||||
const uint8_t* ptr = (const uint8_t*)_points;
|
||||
for (uint32_t ii = 0; ii < _numPoints; ++ii, ptr += _stride)
|
||||
{
|
||||
const float* point = (const float*)ptr;
|
||||
float xx = point[0];
|
||||
float yy = point[1];
|
||||
float zz = point[2];
|
||||
|
||||
sumX += xx;
|
||||
sumY += yy;
|
||||
sumZ += zz;
|
||||
sumXX += xx*xx;
|
||||
sumXY += xx*yy;
|
||||
sumXZ += xx*zz;
|
||||
sumYY += yy*yy;
|
||||
sumYZ += yy*zz;
|
||||
}
|
||||
|
||||
// [ sum(x^2) sum(x*y) sum(x) ] [ A ] [ sum(x*z) ]
|
||||
// [ sum(x*y) sum(y^2) sum(y) ] [ B ] = [ sum(y*z) ]
|
||||
// [ sum(x) sum(y) numPoints ] [ C ] [ sum(z) ]
|
||||
|
||||
float mtx[9] =
|
||||
{
|
||||
sumXX, sumXY, sumX,
|
||||
sumXY, sumYY, sumY,
|
||||
sumX, sumY, float(_numPoints),
|
||||
};
|
||||
float invMtx[9];
|
||||
bx::mtx3Inverse(invMtx, mtx);
|
||||
|
||||
_result[0] = invMtx[0]*sumXZ + invMtx[1]*sumYZ + invMtx[2]*sumZ;
|
||||
_result[1] = invMtx[3]*sumXZ + invMtx[4]*sumYZ + invMtx[5]*sumZ;
|
||||
_result[2] = invMtx[6]*sumXZ + invMtx[7]*sumYZ + invMtx[8]*sumZ;
|
||||
}
|
||||
|
||||
inline void rgbToHsv(float _hsv[3], const float _rgb[3])
|
||||
{
|
||||
const float rr = _rgb[0];
|
||||
|
||||
Reference in New Issue
Block a user