diff options
author | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2021-02-11 07:53:15 +0100 |
---|---|---|
committer | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2021-02-22 07:36:21 +0100 |
commit | 4141533a3fb984fbaefe87b15fceeda7f2082061 (patch) | |
tree | 46b7dc9e659033666cdef2275ec283dd2de8fd96 /chart2/source/tools | |
parent | c40ce0c542b46d45a00561a926953df2fe9a9762 (diff) |
[API CHANGE] tdf#133423 Implement chart:regression-moving-type
Change-Id: Icb967367fbf12e5a1566b7f18ebe5e3d8a3534f0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110748
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
Diffstat (limited to 'chart2/source/tools')
4 files changed, 61 insertions, 13 deletions
diff --git a/chart2/source/tools/LinearRegressionCurveCalculator.cxx b/chart2/source/tools/LinearRegressionCurveCalculator.cxx index 9cf3492d8e8e..811381507cb6 100644 --- a/chart2/source/tools/LinearRegressionCurveCalculator.cxx +++ b/chart2/source/tools/LinearRegressionCurveCalculator.cxx @@ -35,13 +35,15 @@ void LinearRegressionCurveCalculator::setRegressionProperties( sal_Int32 /*aDegree*/, sal_Bool aForceIntercept, double aInterceptValue, - sal_Int32 aPeriod ) + sal_Int32 aPeriod, + sal_Int32 /*nMovingType*/) { PolynomialRegressionCurveCalculator::setRegressionProperties( 1, aForceIntercept, aInterceptValue, - aPeriod); + aPeriod, + 0); } uno::Sequence< geometry::RealPoint2D > SAL_CALL LinearRegressionCurveCalculator::getCurveValues( diff --git a/chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx b/chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx index 7774bec02a4f..bca154047935 100644 --- a/chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx +++ b/chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx @@ -24,7 +24,10 @@ #include <rtl/math.hxx> +#include <com/sun/star/chart2/MovingAverageType.hpp> + using namespace ::com::sun::star; +using namespace ::com::sun::star::chart2; namespace chart { @@ -47,25 +50,59 @@ void SAL_CALL MovingAverageRegressionCurveCalculator::recalculateRegression( aXValues, aYValues, RegressionCalculationHelper::isValid())); - const size_t aSize = aValues.first.size(); - aYList.clear(); aXList.clear(); - for( size_t i = mPeriod - 1; i < aSize; ++i ) + switch (mnMovingType) + { + case MovingAverageType::Central: + { + sal_Int32 nCentralPeriod = (mPeriod % 2 == 0) ? (mPeriod / 2) : ((mPeriod - 1) / 2); + calculateValues(aValues, nCentralPeriod, false); + break; + } + + case MovingAverageType::AveragedAbscissa: + { + calculateValues(aValues, mPeriod, true); + break; + } + case MovingAverageType::Prior: + default: + { + calculateValues(aValues, mPeriod, false); + break; + } + } +} + +void MovingAverageRegressionCurveCalculator::calculateValues( + RegressionCalculationHelper::tDoubleVectorPair aValues, sal_Int32 nPeriod, bool bUseXAvg) +{ + const size_t aSize = aValues.first.size(); + for (size_t i = nPeriod - 1; i < aSize; ++i) { - double yAvg; - yAvg = 0.0; + double xAvg = 0.0; + double yAvg = 0.0; - for (sal_Int32 j = 0; j < mPeriod; j++) + for (sal_Int32 j = 0; j < nPeriod; j++) { + xAvg += aValues.first[i - j]; yAvg += aValues.second[i - j]; } - yAvg /= mPeriod; + yAvg /= nPeriod; + xAvg /= nPeriod; - double x = aValues.first[i]; aYList.push_back(yAvg); - aXList.push_back(x); + if (bUseXAvg) + { + aXList.push_back(xAvg); + } + else + { + double x = aValues.first[i]; + aXList.push_back(x); + } } } diff --git a/chart2/source/tools/RegressionCurveCalculator.cxx b/chart2/source/tools/RegressionCurveCalculator.cxx index ba8a7423c01e..c27a47e502cd 100644 --- a/chart2/source/tools/RegressionCurveCalculator.cxx +++ b/chart2/source/tools/RegressionCurveCalculator.cxx @@ -72,12 +72,14 @@ void RegressionCurveCalculator::setRegressionProperties( sal_Int32 aDegree, sal_Bool aForceIntercept, double aInterceptValue, - sal_Int32 aPeriod ) + sal_Int32 aPeriod, + sal_Int32 nMovingType ) { mDegree = aDegree; mForceIntercept = aForceIntercept; mInterceptValue = aInterceptValue; mPeriod = aPeriod; + mnMovingType = nMovingType; } OUString RegressionCurveCalculator::getFormattedString( diff --git a/chart2/source/tools/RegressionCurveModel.cxx b/chart2/source/tools/RegressionCurveModel.cxx index 649e93e2702f..0fb7662830af 100644 --- a/chart2/source/tools/RegressionCurveModel.cxx +++ b/chart2/source/tools/RegressionCurveModel.cxx @@ -44,7 +44,8 @@ enum PROPERTY_EXTRAPOLATE_BACKWARD, PROPERTY_FORCE_INTERCEPT, PROPERTY_INTERCEPT_VALUE, - PROPERTY_CURVE_NAME + PROPERTY_CURVE_NAME, + PROPERTY_MOVING_AVERAGE_TYPE }; void lcl_AddPropertiesToVector( @@ -62,6 +63,12 @@ void lcl_AddPropertiesToVector( beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT ); + rOutProperties.emplace_back( "MovingAverageType", + PROPERTY_MOVING_AVERAGE_TYPE, + cppu::UnoType<sal_Int32>::get(), + beans::PropertyAttribute::BOUND | + beans::PropertyAttribute::MAYBEDEFAULT ); + rOutProperties.emplace_back( "ExtrapolateForward", PROPERTY_EXTRAPOLATE_FORWARD, cppu::UnoType<double>::get(), |