summaryrefslogtreecommitdiff
path: root/chart2/source/tools
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>2021-02-11 07:53:15 +0100
committerSamuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>2021-02-22 07:36:21 +0100
commit4141533a3fb984fbaefe87b15fceeda7f2082061 (patch)
tree46b7dc9e659033666cdef2275ec283dd2de8fd96 /chart2/source/tools
parentc40ce0c542b46d45a00561a926953df2fe9a9762 (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')
-rw-r--r--chart2/source/tools/LinearRegressionCurveCalculator.cxx6
-rw-r--r--chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx55
-rw-r--r--chart2/source/tools/RegressionCurveCalculator.cxx4
-rw-r--r--chart2/source/tools/RegressionCurveModel.cxx9
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(),