Kaydet (Commit) 28293399 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl

Linear curve is polyinomial curve with degree = 1

Change-Id: I3785afc7b18ab3f742e4ecc0e299baafc2bd6614
üst 7302c4f6
...@@ -20,44 +20,33 @@ ...@@ -20,44 +20,33 @@
#define CHART2_LINEARREGRESSIONCURVECALCULATOR_HXX #define CHART2_LINEARREGRESSIONCURVECALCULATOR_HXX
#include "RegressionCurveCalculator.hxx" #include "RegressionCurveCalculator.hxx"
#include "PolynomialRegressionCurveCalculator.hxx"
namespace chart namespace chart
{ {
class LinearRegressionCurveCalculator : class LinearRegressionCurveCalculator : public PolynomialRegressionCurveCalculator
public RegressionCurveCalculator
{ {
public: public:
LinearRegressionCurveCalculator(); LinearRegressionCurveCalculator();
virtual ~LinearRegressionCurveCalculator(); virtual ~LinearRegressionCurveCalculator();
protected:
virtual OUString ImplGetRepresentation(
const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xNumFormatter,
::sal_Int32 nNumberFormatKey ) const;
private: private:
// ____ XRegressionCurveCalculator ____ virtual void SAL_CALL setRegressionProperties(
virtual void SAL_CALL recalculateRegression( sal_Int32 aDegree,
const ::com::sun::star::uno::Sequence< double >& aXValues, sal_Bool aForceIntercept,
const ::com::sun::star::uno::Sequence< double >& aYValues ) double aInterceptValue,
throw (::com::sun::star::uno::RuntimeException); sal_Int32 aPeriod);
virtual double SAL_CALL getCurveValue( double x )
throw (::com::sun::star::lang::IllegalArgumentException, virtual com::sun::star::uno::Sequence< com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues(
::com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Sequence< ::com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues(
double min, double min,
double max, double max,
::sal_Int32 nPointCount, sal_Int32 nPointCount,
const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingX, const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingX,
const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XScaling >& xScalingY, const com::sun::star::uno::Reference< com::sun::star::chart2::XScaling >& xScalingY,
::sal_Bool bMaySkipPointsInCalculation ) sal_Bool bMaySkipPointsInCalculation )
throw (::com::sun::star::lang::IllegalArgumentException, throw (com::sun::star::lang::IllegalArgumentException,
::com::sun::star::uno::RuntimeException); com::sun::star::uno::RuntimeException);
// formula is: f(x) = m_fSlope * x + m_fIntercept
double m_fSlope;
double m_fIntercept;
}; };
} // namespace chart } // namespace chart
......
...@@ -36,6 +36,10 @@ protected: ...@@ -36,6 +36,10 @@ protected:
const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter >& xNumFormatter, const com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter >& xNumFormatter,
sal_Int32 nNumberFormatKey ) const; sal_Int32 nNumberFormatKey ) const;
virtual double SAL_CALL getCurveValue( double x )
throw (com::sun::star::lang::IllegalArgumentException,
com::sun::star::uno::RuntimeException);
private: private:
// ____ XRegressionCurveCalculator ____ // ____ XRegressionCurveCalculator ____
virtual void SAL_CALL recalculateRegression( virtual void SAL_CALL recalculateRegression(
...@@ -43,11 +47,7 @@ private: ...@@ -43,11 +47,7 @@ private:
const com::sun::star::uno::Sequence< double >& aYValues ) const com::sun::star::uno::Sequence< double >& aYValues )
throw (com::sun::star::uno::RuntimeException); throw (com::sun::star::uno::RuntimeException);
virtual double SAL_CALL getCurveValue( double x ) virtual com::sun::star::uno::Sequence< com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues(
throw (com::sun::star::lang::IllegalArgumentException,
com::sun::star::uno::RuntimeException);
virtual ::com::sun::star::uno::Sequence< com::sun::star::geometry::RealPoint2D > SAL_CALL getCurveValues(
double min, double min,
double max, double max,
sal_Int32 nPointCount, sal_Int32 nPointCount,
......
...@@ -31,69 +31,23 @@ namespace chart ...@@ -31,69 +31,23 @@ namespace chart
{ {
LinearRegressionCurveCalculator::LinearRegressionCurveCalculator() : LinearRegressionCurveCalculator::LinearRegressionCurveCalculator() :
m_fSlope( 0.0 ), PolynomialRegressionCurveCalculator()
m_fIntercept( 0.0 ) {}
{
::rtl::math::setNan( & m_fSlope );
::rtl::math::setNan( & m_fIntercept );
}
LinearRegressionCurveCalculator::~LinearRegressionCurveCalculator() LinearRegressionCurveCalculator::~LinearRegressionCurveCalculator()
{} {}
// ____ XRegressionCurveCalculator ____ void LinearRegressionCurveCalculator::setRegressionProperties(
void SAL_CALL LinearRegressionCurveCalculator::recalculateRegression( sal_Int32 /*aDegree*/,
const uno::Sequence< double >& aXValues, sal_Bool aForceIntercept,
const uno::Sequence< double >& aYValues ) double aInterceptValue,
throw (uno::RuntimeException) sal_Int32 aPeriod)
{
RegressionCalculationHelper::tDoubleVectorPair aValues(
RegressionCalculationHelper::cleanup(
aXValues, aYValues,
RegressionCalculationHelper::isValid()));
const size_t nMax = aValues.first.size();
if( nMax == 0 )
{
::rtl::math::setNan( & m_fSlope );
::rtl::math::setNan( & m_fIntercept );
::rtl::math::setNan( & m_fCorrelationCoeffitient );
return;
}
const double fN = static_cast< double >( nMax );
double fSumX = 0.0, fSumY = 0.0, fSumXSq = 0.0, fSumYSq = 0.0, fSumXY = 0.0;
for( size_t i = 0; i < nMax; ++i )
{
fSumX += aValues.first[i];
fSumY += aValues.second[i];
fSumXSq += aValues.first[i] * aValues.first[i];
fSumYSq += aValues.second[i] * aValues.second[i];
fSumXY += aValues.first[i] * aValues.second[i];
}
m_fSlope = (fN * fSumXY - fSumX * fSumY) / ( fN * fSumXSq - fSumX * fSumX );
m_fIntercept = (fSumY - m_fSlope * fSumX) / fN;
m_fCorrelationCoeffitient = ( fN * fSumXY - fSumX * fSumY ) /
sqrt( ( fN * fSumXSq - fSumX * fSumX ) *
( fN * fSumYSq - fSumY * fSumY ) );
}
double SAL_CALL LinearRegressionCurveCalculator::getCurveValue( double x )
throw (lang::IllegalArgumentException,
uno::RuntimeException)
{ {
double fResult; PolynomialRegressionCurveCalculator::setRegressionProperties(
::rtl::math::setNan( & fResult ); 1,
aForceIntercept,
if( ! ( ::rtl::math::isNan( m_fSlope ) || aInterceptValue,
::rtl::math::isNan( m_fIntercept ))) aPeriod);
{
fResult = m_fSlope * x + m_fIntercept;
}
return fResult;
} }
uno::Sequence< geometry::RealPoint2D > SAL_CALL LinearRegressionCurveCalculator::getCurveValues( uno::Sequence< geometry::RealPoint2D > SAL_CALL LinearRegressionCurveCalculator::getCurveValues(
...@@ -120,50 +74,6 @@ uno::Sequence< geometry::RealPoint2D > SAL_CALL LinearRegressionCurveCalculator: ...@@ -120,50 +74,6 @@ uno::Sequence< geometry::RealPoint2D > SAL_CALL LinearRegressionCurveCalculator:
return RegressionCurveCalculator::getCurveValues( min, max, nPointCount, xScalingX, xScalingY, bMaySkipPointsInCalculation ); return RegressionCurveCalculator::getCurveValues( min, max, nPointCount, xScalingX, xScalingY, bMaySkipPointsInCalculation );
} }
OUString LinearRegressionCurveCalculator::ImplGetRepresentation(
const uno::Reference< util::XNumberFormatter >& xNumFormatter,
::sal_Int32 nNumberFormatKey ) const
{
OUStringBuffer aBuf( "f(x) = ");
bool bHaveSlope = false;
if( m_fSlope != 0.0 )
{
if( ::rtl::math::approxEqual( fabs( m_fSlope ), 1.0 ))
{
if( m_fSlope < 0 )
aBuf.append( UC_MINUS_SIGN );
}
else
aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fSlope ));
aBuf.append( sal_Unicode( 'x' ));
bHaveSlope = true;
}
if( bHaveSlope )
{
if( m_fIntercept < 0.0 )
{
aBuf.append( UC_SPACE );
aBuf.append( UC_MINUS_SIGN );
aBuf.append( UC_SPACE );
aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fabs( m_fIntercept )));
}
else if( m_fIntercept > 0.0 )
{
aBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( " + " ));
aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fIntercept ));
}
}
else
{
aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fIntercept ));
}
return aBuf.makeStringAndClear();
}
} // namespace chart } // namespace chart
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment