[Libreoffice-commits] core.git: chart2/source

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Wed Apr 29 07:14:23 PDT 2015


 chart2/source/controller/dialogs/res_Trendline.cxx           |    4 +-
 chart2/source/tools/ExponentialRegressionCurveCalculator.cxx |   22 ++++++++---
 2 files changed, 20 insertions(+), 6 deletions(-)

New commits:
commit fec037e68f0dea164915fbfe1db4699a3861adf4
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Wed Apr 15 23:50:58 2015 +0200

    tdf#72361 Forced intercept for exponentiial trendline
    
    Change-Id: I252a4994d2ee981018d07d6fac7ffe639f065d3e
    Reviewed-on: https://gerrit.libreoffice.org/15334
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Norbert Thiebaud <nthiebaud at gmail.com>

diff --git a/chart2/source/controller/dialogs/res_Trendline.cxx b/chart2/source/controller/dialogs/res_Trendline.cxx
index 8586e674..74ea1b2 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 c5fcdac..3738d68 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 )


More information about the Libreoffice-commits mailing list