diff options
author | Laurent Balland-Poirier <laurent.balland-poirier@laposte.net> | 2015-04-15 23:50:58 +0200 |
---|---|---|
committer | Norbert Thiebaud <nthiebaud@gmail.com> | 2015-04-29 14:14:01 +0000 |
commit | fec037e68f0dea164915fbfe1db4699a3861adf4 (patch) | |
tree | 30c68ab3cad09c94b6ca50de0f7a5d51037aeacb /chart2 | |
parent | 4d045be758885a09daa4fe3324984174d6f7c4f2 (diff) |
tdf#72361 Forced intercept for exponentiial trendline
Change-Id: I252a4994d2ee981018d07d6fac7ffe639f065d3e
Reviewed-on: https://gerrit.libreoffice.org/15334
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Norbert Thiebaud <nthiebaud@gmail.com>
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/controller/dialogs/res_Trendline.cxx | 4 | ||||
-rw-r--r-- | chart2/source/tools/ExponentialRegressionCurveCalculator.cxx | 22 |
2 files changed, 20 insertions, 6 deletions
diff --git a/chart2/source/controller/dialogs/res_Trendline.cxx b/chart2/source/controller/dialogs/res_Trendline.cxx index 8586e674d0ad..74ea1b2656c1 100644 --- a/chart2/source/controller/dialogs/res_Trendline.cxx +++ b/chart2/source/controller/dialogs/res_Trendline.cxx @@ -302,7 +302,9 @@ void TrendlineResources::UpdateControlStates() m_pNF_Period->SetMax( m_nNbPoints - 1 ); } bool bMovingAverage = ( m_eTrendLineType == CHREGRESS_MOVING_AVERAGE ); - bool bInterceptAvailable = ( m_eTrendLineType == CHREGRESS_LINEAR ) || ( m_eTrendLineType == CHREGRESS_POLYNOMIAL ); + bool bInterceptAvailable = ( m_eTrendLineType == CHREGRESS_LINEAR ) + || ( m_eTrendLineType == CHREGRESS_POLYNOMIAL ) + || ( m_eTrendLineType == CHREGRESS_EXP ); m_pFmtFld_ExtrapolateForward->Enable( !bMovingAverage ); m_pFmtFld_ExtrapolateBackward->Enable( !bMovingAverage ); m_pCB_SetIntercept->Enable( bInterceptAvailable ); diff --git a/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx b/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx index c5fcdac023ec..3738d686f683 100644 --- a/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx +++ b/chart2/source/tools/ExponentialRegressionCurveCalculator.cxx @@ -61,11 +61,24 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( } double fAverageX = 0.0, fAverageY = 0.0; + double fLogIntercept = mForceIntercept ? log(mInterceptValue) : 0.0; + std::vector<double> yVector; + yVector.resize(nMax, 0.0); + size_t i = 0; for( i = 0; i < nMax; ++i ) { - fAverageX += aValues.first[i]; - fAverageY += log( aValues.second[i] ); + double yValue = log(aValues.second[i]); + if (mForceIntercept) + { + yValue -= fLogIntercept; + } + else + { + fAverageX += aValues.first[i]; + fAverageY += yValue; + } + yVector[i] = yValue; } const double fN = static_cast< double >( nMax ); @@ -76,7 +89,7 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( for( i = 0; i < nMax; ++i ) { double fDeltaX = aValues.first[i] - fAverageX; - double fDeltaY = log( aValues.second[i] ) - fAverageY; + double fDeltaY = yVector[i] - fAverageY; fQx += fDeltaX * fDeltaX; fQy += fDeltaY * fDeltaY; @@ -84,9 +97,8 @@ void SAL_CALL ExponentialRegressionCurveCalculator::recalculateRegression( } m_fLogSlope = fQxy / fQx; - m_fLogIntercept = fAverageY - m_fLogSlope * fAverageX; + m_fLogIntercept = mForceIntercept ? fLogIntercept : fAverageY - m_fLogSlope * fAverageX; m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy ); - } double SAL_CALL ExponentialRegressionCurveCalculator::getCurveValue( double x ) |