diff options
author | Muthu Subramanian <sumuthu@suse.com> | 2013-04-30 10:14:54 +0530 |
---|---|---|
committer | Jan Holesovsky <kendy@suse.cz> | 2013-06-05 11:50:29 +0200 |
commit | 4d19f82c97694db258c18959313f2b4f1842a5b5 (patch) | |
tree | d3bd088839bd2ebb9efacf40fb58f4a36d0570d1 /chart2 | |
parent | e0413e9da0687d381bac4a7275c56c529f6552cd (diff) |
n#816939: Improved label overlap detection.
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/axes/VCartesianAxis.cxx | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/chart2/source/view/axes/VCartesianAxis.cxx b/chart2/source/view/axes/VCartesianAxis.cxx index 40b48862d7c1..261b23ecf4f6 100644 --- a/chart2/source/view/axes/VCartesianAxis.cxx +++ b/chart2/source/view/axes/VCartesianAxis.cxx @@ -43,6 +43,11 @@ #include <algorithm> #include <boost/scoped_ptr.hpp> +#include <basegfx/polygon/b2dpolygon.hxx> +#include <basegfx/polygon/b2dpolypolygon.hxx> +#include <basegfx/polygon/b2dpolygontools.hxx> +#include <basegfx/polygon/b2dpolygonclipper.hxx> +#include <basegfx/matrix/b2dhommatrix.hxx> //............................................................................. namespace chart @@ -52,6 +57,8 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; using namespace ::rtl::math; using ::com::sun::star::uno::Reference; +using ::basegfx::B2DPolygon; +using ::basegfx::B2DPolyPolygon; //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -137,14 +144,22 @@ bool doesOverlap( const Reference< drawing::XShape >& xShape1 if( !xShape1.is() || !xShape2.is() ) return false; - sal_Int32 nAngle = abs(fRotationAngleDegree); + ::basegfx::B2DRectangle aRect1( BaseGFXHelper::makeRectangle( xShape1->getPosition(), ShapeFactory::getSizeAfterRotation( xShape1, 0 ) )); + ::basegfx::B2DRectangle aRect2( BaseGFXHelper::makeRectangle( xShape2->getPosition(), ShapeFactory::getSizeAfterRotation( xShape2, 0 ) )); - if( ( nAngle >= 45 && nAngle <= 135 ) || ( nAngle >= 225 && nAngle <= 315 ) ) - return false; + B2DPolygon aPoly1 = basegfx::tools::createPolygonFromRect( aRect1 ); + B2DPolygon aPoly2 = basegfx::tools::createPolygonFromRect( aRect2 ); + ::basegfx::B2DHomMatrix aMatrix; + aMatrix.rotate( fRotationAngleDegree ); + aPoly1.transform( aMatrix ); + aPoly2.transform( aMatrix ); + + B2DPolyPolygon aPolyPoly1, aPolyPoly2; + aPolyPoly1.append( aPoly1 ); + aPolyPoly2.append( aPoly2 ); + B2DPolyPolygon overlapPoly = ::basegfx::tools::clipPolyPolygonOnPolyPolygon( aPolyPoly1, aPolyPoly2, true, false ); - ::basegfx::B2IRectangle aRect1( BaseGFXHelper::makeRectangle(xShape1->getPosition(),ShapeFactory::getSizeAfterRotation( xShape1, fRotationAngleDegree ))); - ::basegfx::B2IRectangle aRect2( BaseGFXHelper::makeRectangle(xShape2->getPosition(),ShapeFactory::getSizeAfterRotation( xShape2, fRotationAngleDegree ))); - return aRect1.overlaps(aRect2); + return (overlapPoly.count() > 0); } void removeShapesAtWrongRhythm( TickIter& rIter @@ -786,6 +801,7 @@ bool VCartesianAxis::createTextShapes( { rAxisLabelProperties.fRotationAngleDegree = 45; rAxisLabelProperties.bLineBreakAllowed = false; + rAxisLabelProperties.eStaggering = SIDE_BY_SIDE; m_aAxisLabelProperties.fRotationAngleDegree = rAxisLabelProperties.fRotationAngleDegree; removeTextShapesFromTicks(); return false; |