1de7b3f82SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3de7b3f82SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4de7b3f82SAndrew Rist * or more contributor license agreements. See the NOTICE file 5de7b3f82SAndrew Rist * distributed with this work for additional information 6de7b3f82SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7de7b3f82SAndrew Rist * to you under the Apache License, Version 2.0 (the 8de7b3f82SAndrew Rist * "License"); you may not use this file except in compliance 9de7b3f82SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11de7b3f82SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13de7b3f82SAndrew Rist * Unless required by applicable law or agreed to in writing, 14de7b3f82SAndrew Rist * software distributed under the License is distributed on an 15de7b3f82SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16de7b3f82SAndrew Rist * KIND, either express or implied. See the License for the 17de7b3f82SAndrew Rist * specific language governing permissions and limitations 18de7b3f82SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20de7b3f82SAndrew Rist *************************************************************/ 21de7b3f82SAndrew Rist 22de7b3f82SAndrew Rist 23cdf0e10cSrcweir #ifndef _CHART2_PLOTTINGPOSITIONHELPER_HXX 24cdf0e10cSrcweir #define _CHART2_PLOTTINGPOSITIONHELPER_HXX 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "LabelAlignment.hxx" 27cdf0e10cSrcweir #include "chartview/ExplicitScaleValues.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <basegfx/range/b2drectangle.hxx> 30cdf0e10cSrcweir #include <rtl/math.hxx> 31cdf0e10cSrcweir #include <com/sun/star/chart2/XTransformation.hpp> 32cdf0e10cSrcweir #include <com/sun/star/drawing/Direction3D.hpp> 33cdf0e10cSrcweir #include <com/sun/star/drawing/HomogenMatrix.hpp> 34cdf0e10cSrcweir #include <com/sun/star/drawing/PolyPolygonShape3D.hpp> 35cdf0e10cSrcweir #include <com/sun/star/drawing/Position3D.hpp> 36cdf0e10cSrcweir #include <com/sun/star/drawing/XShapes.hpp> 37cdf0e10cSrcweir #include <basegfx/matrix/b3dhommatrix.hxx> 38cdf0e10cSrcweir 39cdf0e10cSrcweir /* 40cdf0e10cSrcweir //for WeakImplHelper1 41cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 42cdf0e10cSrcweir */ 43cdf0e10cSrcweir //............................................................................. 44cdf0e10cSrcweir namespace chart 45cdf0e10cSrcweir { 46cdf0e10cSrcweir //............................................................................. 47cdf0e10cSrcweir 48cdf0e10cSrcweir class ShapeFactory; 49cdf0e10cSrcweir 50cdf0e10cSrcweir //----------------------------------------------------------------------------- 51cdf0e10cSrcweir /** 52cdf0e10cSrcweir */ 53cdf0e10cSrcweir 54cdf0e10cSrcweir class PlottingPositionHelper 55cdf0e10cSrcweir { 56cdf0e10cSrcweir public: 57cdf0e10cSrcweir PlottingPositionHelper(); 58cdf0e10cSrcweir PlottingPositionHelper( const PlottingPositionHelper& rSource ); 59cdf0e10cSrcweir virtual ~PlottingPositionHelper(); 60cdf0e10cSrcweir 61cdf0e10cSrcweir virtual PlottingPositionHelper* clone() const; 62cdf0e10cSrcweir virtual PlottingPositionHelper* createSecondaryPosHelper( const ExplicitScaleData& rSecondaryScale ); 63cdf0e10cSrcweir 64cdf0e10cSrcweir virtual void setTransformationSceneToScreen( const ::com::sun::star::drawing::HomogenMatrix& rMatrix); 65cdf0e10cSrcweir 66cdf0e10cSrcweir virtual void setScales( const ::std::vector< ExplicitScaleData >& rScales, bool bSwapXAndYAxis ); 67cdf0e10cSrcweir const ::std::vector< ExplicitScaleData >& getScales() const; 68cdf0e10cSrcweir 69cdf0e10cSrcweir //better performance for big data 70cdf0e10cSrcweir inline void setCoordinateSystemResolution( const ::com::sun::star::uno::Sequence< sal_Int32 >& rCoordinateSystemResolution ); 71cdf0e10cSrcweir inline bool isSameForGivenResolution( double fX, double fY, double fZ 72cdf0e10cSrcweir , double fX2, double fY2, double fZ2 ); 73cdf0e10cSrcweir 74cdf0e10cSrcweir inline bool isStrongLowerRequested( sal_Int32 nDimensionIndex ) const; 75cdf0e10cSrcweir inline bool isLogicVisible( double fX, double fY, double fZ ) const; 76cdf0e10cSrcweir inline void doLogicScaling( double* pX, double* pY, double* pZ, bool bClip=false ) const; 77cdf0e10cSrcweir inline void doUnshiftedLogicScaling( double* pX, double* pY, double* pZ, bool bClip=false ) const; 78cdf0e10cSrcweir inline void clipLogicValues( double* pX, double* pY, double* pZ ) const; 79cdf0e10cSrcweir void clipScaledLogicValues( double* pX, double* pY, double* pZ ) const; 80cdf0e10cSrcweir inline bool clipYRange( double& rMin, double& rMax ) const; 81cdf0e10cSrcweir 82cdf0e10cSrcweir inline void doLogicScaling( ::com::sun::star::drawing::Position3D& rPos, bool bClip=false ) const; 83cdf0e10cSrcweir 84cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTransformation > 85cdf0e10cSrcweir getTransformationScaledLogicToScene() const; 86cdf0e10cSrcweir 87cdf0e10cSrcweir virtual ::com::sun::star::drawing::Position3D 88cdf0e10cSrcweir transformLogicToScene( double fX, double fY, double fZ, bool bClip ) const; 89cdf0e10cSrcweir 90cdf0e10cSrcweir virtual ::com::sun::star::drawing::Position3D 91cdf0e10cSrcweir transformScaledLogicToScene( double fX, double fY, double fZ, bool bClip ) const; 92cdf0e10cSrcweir 93cdf0e10cSrcweir void transformScaledLogicToScene( ::com::sun::star::drawing::PolyPolygonShape3D& rPoly ) const; 94cdf0e10cSrcweir 95cdf0e10cSrcweir static com::sun::star::awt::Point transformSceneToScreenPosition( 96cdf0e10cSrcweir const com::sun::star::drawing::Position3D& rScenePosition3D 97cdf0e10cSrcweir , const com::sun::star::uno::Reference< com::sun::star::drawing::XShapes >& xSceneTarget 98cdf0e10cSrcweir , ShapeFactory* pShapeFactory, sal_Int32 nDimensionCount ); 99cdf0e10cSrcweir 100cdf0e10cSrcweir inline double getLogicMinX() const; 101cdf0e10cSrcweir inline double getLogicMinY() const; 102cdf0e10cSrcweir inline double getLogicMinZ() const; 103cdf0e10cSrcweir inline double getLogicMaxX() const; 104cdf0e10cSrcweir inline double getLogicMaxY() const; 105cdf0e10cSrcweir inline double getLogicMaxZ() const; 106cdf0e10cSrcweir 107cdf0e10cSrcweir inline bool isMathematicalOrientationX() const; 108cdf0e10cSrcweir inline bool isMathematicalOrientationY() const; 109cdf0e10cSrcweir inline bool isMathematicalOrientationZ() const; 110cdf0e10cSrcweir 111cdf0e10cSrcweir ::basegfx::B2DRectangle getScaledLogicClipDoubleRect() const; 112cdf0e10cSrcweir ::com::sun::star::drawing::Direction3D getScaledLogicWidth() const; 113cdf0e10cSrcweir 114cdf0e10cSrcweir inline bool isSwapXAndY() const; 115cdf0e10cSrcweir 116cdf0e10cSrcweir bool isPercentY() const; 117cdf0e10cSrcweir 118cdf0e10cSrcweir double getBaseValueY() const; 119cdf0e10cSrcweir 120cdf0e10cSrcweir inline bool maySkipPointsInRegressionCalculation() const; 121cdf0e10cSrcweir 122cdf0e10cSrcweir void setTimeResolution( long nTimeResolution, const Date& rNullDate ); 123cdf0e10cSrcweir virtual void setScaledCategoryWidth( double fScaledCategoryWidth ); 124cdf0e10cSrcweir void AllowShiftXAxisPos( bool bAllowShift ); 125cdf0e10cSrcweir void AllowShiftZAxisPos( bool bAllowShift ); 126cdf0e10cSrcweir 127cdf0e10cSrcweir protected: //member 128cdf0e10cSrcweir ::std::vector< ExplicitScaleData > m_aScales; 129cdf0e10cSrcweir ::basegfx::B3DHomMatrix m_aMatrixScreenToScene; 130cdf0e10cSrcweir 131cdf0e10cSrcweir //this is calculated based on m_aScales and m_aMatrixScreenToScene 132cdf0e10cSrcweir mutable ::com::sun::star::uno::Reference< 133cdf0e10cSrcweir ::com::sun::star::chart2::XTransformation > m_xTransformationLogicToScene; 134cdf0e10cSrcweir 135cdf0e10cSrcweir bool m_bSwapXAndY;//e.g. true for bar chart and false for column chart 136cdf0e10cSrcweir 137cdf0e10cSrcweir sal_Int32 m_nXResolution; 138cdf0e10cSrcweir sal_Int32 m_nYResolution; 139cdf0e10cSrcweir sal_Int32 m_nZResolution; 140cdf0e10cSrcweir 141cdf0e10cSrcweir bool m_bMaySkipPointsInRegressionCalculation; 142cdf0e10cSrcweir 143cdf0e10cSrcweir bool m_bDateAxis; 144cdf0e10cSrcweir long m_nTimeResolution; 145cdf0e10cSrcweir Date m_aNullDate; 146cdf0e10cSrcweir 147cdf0e10cSrcweir double m_fScaledCategoryWidth; 148cdf0e10cSrcweir bool m_bAllowShiftXAxisPos; 149cdf0e10cSrcweir bool m_bAllowShiftZAxisPos; 150cdf0e10cSrcweir }; 151cdf0e10cSrcweir 152*30acf5e8Spfg //describes which axis of the drawinglayer scene or sreen axis are the normal axis 153cdf0e10cSrcweir enum NormalAxis 154cdf0e10cSrcweir { 155cdf0e10cSrcweir NormalAxis_X 156cdf0e10cSrcweir , NormalAxis_Y 157cdf0e10cSrcweir , NormalAxis_Z 158cdf0e10cSrcweir }; 159cdf0e10cSrcweir 160cdf0e10cSrcweir class PolarPlottingPositionHelper : public PlottingPositionHelper 161cdf0e10cSrcweir /* 162cdf0e10cSrcweir , public ::cppu::WeakImplHelper1< 163cdf0e10cSrcweir ::com::sun::star::chart2::XTransformation > 164cdf0e10cSrcweir */ 165cdf0e10cSrcweir { 166cdf0e10cSrcweir public: 167cdf0e10cSrcweir PolarPlottingPositionHelper( NormalAxis eNormalAxis=NormalAxis_Z ); 168cdf0e10cSrcweir PolarPlottingPositionHelper( const PolarPlottingPositionHelper& rSource ); 169cdf0e10cSrcweir virtual ~PolarPlottingPositionHelper(); 170cdf0e10cSrcweir 171cdf0e10cSrcweir virtual PlottingPositionHelper* clone() const; 172cdf0e10cSrcweir 173cdf0e10cSrcweir virtual void setTransformationSceneToScreen( const ::com::sun::star::drawing::HomogenMatrix& rMatrix); 174cdf0e10cSrcweir virtual void setScales( const std::vector< ExplicitScaleData >& rScales, bool bSwapXAndYAxis ); 175cdf0e10cSrcweir 176cdf0e10cSrcweir ::basegfx::B3DHomMatrix getUnitCartesianToScene() const; 177cdf0e10cSrcweir 178cdf0e10cSrcweir virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XTransformation > 179cdf0e10cSrcweir getTransformationScaledLogicToScene() const; 180cdf0e10cSrcweir 181cdf0e10cSrcweir //the resulting values should be used for input to the transformation 182cdf0e10cSrcweir //received with 'getTransformationScaledLogicToScene' 183cdf0e10cSrcweir double transformToRadius( double fLogicValueOnRadiusAxis, bool bDoScaling=true ) const; 184cdf0e10cSrcweir double transformToAngleDegree( double fLogicValueOnAngleAxis, bool bDoScaling=true ) const; 185cdf0e10cSrcweir double getWidthAngleDegree( double& fStartLogicValueOnAngleAxis, double& fEndLogicValueOnAngleAxis ) const; 186cdf0e10cSrcweir // 187cdf0e10cSrcweir 188cdf0e10cSrcweir virtual ::com::sun::star::drawing::Position3D 189cdf0e10cSrcweir transformLogicToScene( double fX, double fY, double fZ, bool bClip ) const; 190cdf0e10cSrcweir virtual ::com::sun::star::drawing::Position3D 191cdf0e10cSrcweir transformScaledLogicToScene( double fX, double fY, double fZ, bool bClip ) const; 192cdf0e10cSrcweir ::com::sun::star::drawing::Position3D 193cdf0e10cSrcweir transformAngleRadiusToScene( double fLogicValueOnAngleAxis, double fLogicValueOnRadiusAxis, double fLogicZ, bool bDoScaling=true ) const; 194cdf0e10cSrcweir ::com::sun::star::drawing::Position3D 195cdf0e10cSrcweir transformUnitCircleToScene( double fUnitAngleDegree, double fUnitRadius, double fLogicZ, bool bDoScaling=true ) const; 196cdf0e10cSrcweir 197cdf0e10cSrcweir using PlottingPositionHelper::transformScaledLogicToScene; 198cdf0e10cSrcweir 199cdf0e10cSrcweir #ifdef NOTYET 200cdf0e10cSrcweir double getInnerLogicRadius() const; 201cdf0e10cSrcweir #endif 202cdf0e10cSrcweir double getOuterLogicRadius() const; 203cdf0e10cSrcweir 204cdf0e10cSrcweir inline bool isMathematicalOrientationAngle() const; 205cdf0e10cSrcweir inline bool isMathematicalOrientationRadius() const; 206cdf0e10cSrcweir 207cdf0e10cSrcweir /* 208cdf0e10cSrcweir // ____ XTransformation ____ 209cdf0e10cSrcweir /// @see ::com::sun::star::chart2::XTransformation 210cdf0e10cSrcweir virtual ::com::sun::star::uno::Sequence< double > SAL_CALL transform( 211cdf0e10cSrcweir const ::com::sun::star::uno::Sequence< double >& rSourceValues ) 212cdf0e10cSrcweir throw (::com::sun::star::lang::IllegalArgumentException, 213cdf0e10cSrcweir ::com::sun::star::uno::RuntimeException); 214cdf0e10cSrcweir /// @see ::com::sun::star::chart2::XTransformation 215cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getSourceDimension() 216cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 217cdf0e10cSrcweir /// @see ::com::sun::star::chart2::XTransformation 218cdf0e10cSrcweir virtual sal_Int32 SAL_CALL getTargetDimension() 219cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException); 220cdf0e10cSrcweir */ 221cdf0e10cSrcweir public: 222cdf0e10cSrcweir //Offset for radius axis in absolute logic scaled values (1.0 == 1 category) 223cdf0e10cSrcweir double m_fRadiusOffset; 224cdf0e10cSrcweir //Offset for angle axis in real degree 225cdf0e10cSrcweir double m_fAngleDegreeOffset; 226cdf0e10cSrcweir 227cdf0e10cSrcweir private: 228cdf0e10cSrcweir ::basegfx::B3DHomMatrix m_aUnitCartesianToScene; 229cdf0e10cSrcweir NormalAxis m_eNormalAxis; 230cdf0e10cSrcweir 231cdf0e10cSrcweir ::basegfx::B3DHomMatrix impl_calculateMatrixUnitCartesianToScene( const ::basegfx::B3DHomMatrix& rMatrixScreenToScene ) const; 232cdf0e10cSrcweir }; 233cdf0e10cSrcweir 234cdf0e10cSrcweir bool PolarPlottingPositionHelper::isMathematicalOrientationAngle() const 235cdf0e10cSrcweir { 236cdf0e10cSrcweir const ExplicitScaleData& rScale = m_bSwapXAndY ? m_aScales[1] : m_aScales[2]; 237cdf0e10cSrcweir if( ::com::sun::star::chart2::AxisOrientation_MATHEMATICAL==rScale.Orientation ) 238cdf0e10cSrcweir return true; 239cdf0e10cSrcweir return false; 240cdf0e10cSrcweir } 241cdf0e10cSrcweir bool PolarPlottingPositionHelper::isMathematicalOrientationRadius() const 242cdf0e10cSrcweir { 243cdf0e10cSrcweir const ExplicitScaleData& rScale = m_bSwapXAndY ? m_aScales[0] : m_aScales[1]; 244cdf0e10cSrcweir if( ::com::sun::star::chart2::AxisOrientation_MATHEMATICAL==rScale.Orientation ) 245cdf0e10cSrcweir return true; 246cdf0e10cSrcweir return false; 247cdf0e10cSrcweir } 248cdf0e10cSrcweir 249cdf0e10cSrcweir //better performance for big data 250cdf0e10cSrcweir void PlottingPositionHelper::setCoordinateSystemResolution( const ::com::sun::star::uno::Sequence< sal_Int32 >& rCoordinateSystemResolution ) 251cdf0e10cSrcweir { 252cdf0e10cSrcweir m_nXResolution = 1000; 253cdf0e10cSrcweir m_nYResolution = 1000; 254cdf0e10cSrcweir m_nZResolution = 1000; 255cdf0e10cSrcweir if( rCoordinateSystemResolution.getLength() > 0 ) 256cdf0e10cSrcweir m_nXResolution = rCoordinateSystemResolution[0]; 257cdf0e10cSrcweir if( rCoordinateSystemResolution.getLength() > 1 ) 258cdf0e10cSrcweir m_nYResolution = rCoordinateSystemResolution[1]; 259cdf0e10cSrcweir if( rCoordinateSystemResolution.getLength() > 2 ) 260cdf0e10cSrcweir m_nZResolution = rCoordinateSystemResolution[2]; 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir bool PlottingPositionHelper::isSameForGivenResolution( double fX, double fY, double fZ 264cdf0e10cSrcweir , double fX2, double fY2, double fZ2 /*these values are all expected tp be scaled already*/ ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir if( !::rtl::math::isFinite(fX) || !::rtl::math::isFinite(fY) || !::rtl::math::isFinite(fZ) 267cdf0e10cSrcweir || !::rtl::math::isFinite(fX2) || !::rtl::math::isFinite(fY2) || !::rtl::math::isFinite(fZ2) ) 268cdf0e10cSrcweir return false; 269cdf0e10cSrcweir 270cdf0e10cSrcweir double fScaledMinX = getLogicMinX(); 271cdf0e10cSrcweir double fScaledMinY = getLogicMinY(); 272cdf0e10cSrcweir double fScaledMinZ = getLogicMinZ(); 273cdf0e10cSrcweir double fScaledMaxX = getLogicMaxX(); 274cdf0e10cSrcweir double fScaledMaxY = getLogicMaxY(); 275cdf0e10cSrcweir double fScaledMaxZ = getLogicMaxZ(); 276cdf0e10cSrcweir 277cdf0e10cSrcweir doLogicScaling( &fScaledMinX, &fScaledMinY, &fScaledMinZ ); 278cdf0e10cSrcweir doLogicScaling( &fScaledMaxX, &fScaledMaxY, &fScaledMaxZ); 279cdf0e10cSrcweir 280cdf0e10cSrcweir bool bSameX = ( static_cast<sal_Int32>(m_nXResolution*(fX - fScaledMinX)/(fScaledMaxX-fScaledMinX)) 281cdf0e10cSrcweir == static_cast<sal_Int32>(m_nXResolution*(fX2 - fScaledMinX)/(fScaledMaxX-fScaledMinX)) ); 282cdf0e10cSrcweir 283cdf0e10cSrcweir bool bSameY = ( static_cast<sal_Int32>(m_nYResolution*(fY - fScaledMinY)/(fScaledMaxY-fScaledMinY)) 284cdf0e10cSrcweir == static_cast<sal_Int32>(m_nYResolution*(fY2 - fScaledMinY)/(fScaledMaxY-fScaledMinY)) ); 285cdf0e10cSrcweir 286cdf0e10cSrcweir bool bSameZ = ( static_cast<sal_Int32>(m_nZResolution*(fZ - fScaledMinZ)/(fScaledMaxZ-fScaledMinZ)) 287cdf0e10cSrcweir == static_cast<sal_Int32>(m_nZResolution*(fZ2 - fScaledMinZ)/(fScaledMaxZ-fScaledMinZ)) ); 288cdf0e10cSrcweir 289cdf0e10cSrcweir return (bSameX && bSameY && bSameZ); 290cdf0e10cSrcweir } 291cdf0e10cSrcweir 292cdf0e10cSrcweir bool PlottingPositionHelper::isStrongLowerRequested( sal_Int32 nDimensionIndex ) const 293cdf0e10cSrcweir { 294cdf0e10cSrcweir if( m_aScales.empty() ) 295cdf0e10cSrcweir return false; 296cdf0e10cSrcweir if( 0==nDimensionIndex ) 297cdf0e10cSrcweir return m_bAllowShiftXAxisPos && m_aScales[nDimensionIndex].ShiftedCategoryPosition; 298cdf0e10cSrcweir else if( 2==nDimensionIndex ) 299cdf0e10cSrcweir return m_bAllowShiftZAxisPos && m_aScales[nDimensionIndex].ShiftedCategoryPosition; 300cdf0e10cSrcweir return false; 301cdf0e10cSrcweir } 302cdf0e10cSrcweir 303cdf0e10cSrcweir bool PlottingPositionHelper::isLogicVisible( 304cdf0e10cSrcweir double fX, double fY, double fZ ) const 305cdf0e10cSrcweir { 306cdf0e10cSrcweir return fX >= m_aScales[0].Minimum && ( isStrongLowerRequested(0) ? fX < m_aScales[0].Maximum : fX <= m_aScales[0].Maximum ) 307cdf0e10cSrcweir && fY >= m_aScales[1].Minimum && fY <= m_aScales[1].Maximum 308cdf0e10cSrcweir && fZ >= m_aScales[2].Minimum && ( isStrongLowerRequested(2) ? fZ < m_aScales[2].Maximum : fZ <= m_aScales[2].Maximum ); 309cdf0e10cSrcweir } 310cdf0e10cSrcweir 311cdf0e10cSrcweir void PlottingPositionHelper::doLogicScaling( double* pX, double* pY, double* pZ, bool bClip ) const 312cdf0e10cSrcweir { 313cdf0e10cSrcweir if(bClip) 314cdf0e10cSrcweir this->clipLogicValues( pX,pY,pZ ); 315cdf0e10cSrcweir 316cdf0e10cSrcweir if(pX) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir if( m_aScales[0].Scaling.is()) 319cdf0e10cSrcweir *pX = m_aScales[0].Scaling->doScaling(*pX); 320cdf0e10cSrcweir if( m_bAllowShiftXAxisPos && m_aScales[0].ShiftedCategoryPosition ) 321cdf0e10cSrcweir (*pX) += m_fScaledCategoryWidth/2.0; 322cdf0e10cSrcweir } 323cdf0e10cSrcweir if(pY && m_aScales[1].Scaling.is()) 324cdf0e10cSrcweir *pY = m_aScales[1].Scaling->doScaling(*pY); 325cdf0e10cSrcweir if(pZ) 326cdf0e10cSrcweir { 327cdf0e10cSrcweir if( m_aScales[2].Scaling.is()) 328cdf0e10cSrcweir *pZ = m_aScales[2].Scaling->doScaling(*pZ); 329cdf0e10cSrcweir if( m_bAllowShiftZAxisPos && m_aScales[2].ShiftedCategoryPosition) 330cdf0e10cSrcweir (*pZ) += 0.5; 331cdf0e10cSrcweir } 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir void PlottingPositionHelper::doUnshiftedLogicScaling( double* pX, double* pY, double* pZ, bool bClip ) const 335cdf0e10cSrcweir { 336cdf0e10cSrcweir if(bClip) 337cdf0e10cSrcweir this->clipLogicValues( pX,pY,pZ ); 338cdf0e10cSrcweir 339cdf0e10cSrcweir if(pX && m_aScales[0].Scaling.is()) 340cdf0e10cSrcweir *pX = m_aScales[0].Scaling->doScaling(*pX); 341cdf0e10cSrcweir if(pY && m_aScales[1].Scaling.is()) 342cdf0e10cSrcweir *pY = m_aScales[1].Scaling->doScaling(*pY); 343cdf0e10cSrcweir if(pZ && m_aScales[2].Scaling.is()) 344cdf0e10cSrcweir *pZ = m_aScales[2].Scaling->doScaling(*pZ); 345cdf0e10cSrcweir } 346cdf0e10cSrcweir 347cdf0e10cSrcweir void PlottingPositionHelper::doLogicScaling( ::com::sun::star::drawing::Position3D& rPos, bool bClip ) const 348cdf0e10cSrcweir { 349cdf0e10cSrcweir doLogicScaling( &rPos.PositionX, &rPos.PositionY, &rPos.PositionZ, bClip ); 350cdf0e10cSrcweir } 351cdf0e10cSrcweir 352cdf0e10cSrcweir void PlottingPositionHelper::clipLogicValues( double* pX, double* pY, double* pZ ) const 353cdf0e10cSrcweir { 354cdf0e10cSrcweir if(pX) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir if( *pX < m_aScales[0].Minimum ) 357cdf0e10cSrcweir *pX = m_aScales[0].Minimum; 358cdf0e10cSrcweir else if( *pX > m_aScales[0].Maximum ) 359cdf0e10cSrcweir *pX = m_aScales[0].Maximum; 360cdf0e10cSrcweir } 361cdf0e10cSrcweir if(pY) 362cdf0e10cSrcweir { 363cdf0e10cSrcweir if( *pY < m_aScales[1].Minimum ) 364cdf0e10cSrcweir *pY = m_aScales[1].Minimum; 365cdf0e10cSrcweir else if( *pY > m_aScales[1].Maximum ) 366cdf0e10cSrcweir *pY = m_aScales[1].Maximum; 367cdf0e10cSrcweir } 368cdf0e10cSrcweir if(pZ) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir if( *pZ < m_aScales[2].Minimum ) 371cdf0e10cSrcweir *pZ = m_aScales[2].Minimum; 372cdf0e10cSrcweir else if( *pZ > m_aScales[2].Maximum ) 373cdf0e10cSrcweir *pZ = m_aScales[2].Maximum; 374cdf0e10cSrcweir } 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir inline bool PlottingPositionHelper::clipYRange( double& rMin, double& rMax ) const 378cdf0e10cSrcweir { 379cdf0e10cSrcweir //returns true if something remains 380cdf0e10cSrcweir if( rMin > rMax ) 381cdf0e10cSrcweir { 382cdf0e10cSrcweir double fHelp = rMin; 383cdf0e10cSrcweir rMin = rMax; 384cdf0e10cSrcweir rMax = fHelp; 385cdf0e10cSrcweir } 386cdf0e10cSrcweir if( rMin > getLogicMaxY() ) 387cdf0e10cSrcweir return false; 388cdf0e10cSrcweir if( rMax < getLogicMinY() ) 389cdf0e10cSrcweir return false; 390cdf0e10cSrcweir if( rMin < getLogicMinY() ) 391cdf0e10cSrcweir rMin = getLogicMinY(); 392cdf0e10cSrcweir if( rMax > getLogicMaxY() ) 393cdf0e10cSrcweir rMax = getLogicMaxY(); 394cdf0e10cSrcweir return true; 395cdf0e10cSrcweir } 396cdf0e10cSrcweir 397cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMinX() const 398cdf0e10cSrcweir { 399cdf0e10cSrcweir return m_aScales[0].Minimum; 400cdf0e10cSrcweir } 401cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMinY() const 402cdf0e10cSrcweir { 403cdf0e10cSrcweir return m_aScales[1].Minimum; 404cdf0e10cSrcweir } 405cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMinZ() const 406cdf0e10cSrcweir { 407cdf0e10cSrcweir return m_aScales[2].Minimum; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMaxX() const 411cdf0e10cSrcweir { 412cdf0e10cSrcweir return m_aScales[0].Maximum; 413cdf0e10cSrcweir } 414cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMaxY() const 415cdf0e10cSrcweir { 416cdf0e10cSrcweir return m_aScales[1].Maximum; 417cdf0e10cSrcweir } 418cdf0e10cSrcweir inline double PlottingPositionHelper::getLogicMaxZ() const 419cdf0e10cSrcweir { 420cdf0e10cSrcweir return m_aScales[2].Maximum; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir inline bool PlottingPositionHelper::isMathematicalOrientationX() const 423cdf0e10cSrcweir { 424cdf0e10cSrcweir return ::com::sun::star::chart2::AxisOrientation_MATHEMATICAL == m_aScales[0].Orientation; 425cdf0e10cSrcweir } 426cdf0e10cSrcweir inline bool PlottingPositionHelper::isMathematicalOrientationY() const 427cdf0e10cSrcweir { 428cdf0e10cSrcweir return ::com::sun::star::chart2::AxisOrientation_MATHEMATICAL == m_aScales[1].Orientation; 429cdf0e10cSrcweir } 430cdf0e10cSrcweir inline bool PlottingPositionHelper::isMathematicalOrientationZ() const 431cdf0e10cSrcweir { 432cdf0e10cSrcweir return ::com::sun::star::chart2::AxisOrientation_MATHEMATICAL == m_aScales[2].Orientation; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir inline bool PlottingPositionHelper::isSwapXAndY() const 435cdf0e10cSrcweir { 436cdf0e10cSrcweir return m_bSwapXAndY; 437cdf0e10cSrcweir } 438cdf0e10cSrcweir inline bool PlottingPositionHelper::maySkipPointsInRegressionCalculation() const 439cdf0e10cSrcweir { 440cdf0e10cSrcweir return m_bMaySkipPointsInRegressionCalculation; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir //............................................................................. 444cdf0e10cSrcweir } //namespace chart 445cdf0e10cSrcweir //............................................................................. 446cdf0e10cSrcweir #endif 447