KissCount/lib/libkdchart/src/KDChartAbstractGrid.cpp

121 lines
3.6 KiB
C++

/****************************************************************************
** Copyright (C) 2001-2011 Klaralvdalens Datakonsult AB. All rights reserved.
**
** This file is part of the KD Chart library.
**
** Licensees holding valid commercial KD Chart licenses may use this file in
** accordance with the KD Chart Commercial License Agreement provided with
** the Software.
**
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 and version 3 as published by the
** Free Software Foundation and appearing in the file LICENSE.GPL.txt included.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** Contact info@kdab.com if any conditions of this licensing are not
** clear to you.
**
**********************************************************************/
#include "KDChartAbstractGrid.h"
#include "KDChartPaintContext.h"
#include <qglobal.h>
#include <KDABLibFakes>
using namespace KDChart;
using namespace std;
static qreal _trunc( qreal v )
{
return (( v > 0.0 ) ? floor( v ) : ceil( v ));
}
AbstractGrid::AbstractGrid ()
: mPlane( 0 )
{
//this bloc left empty intentionally
}
AbstractGrid::~AbstractGrid()
{
//this bloc left empty intentionally
}
void AbstractGrid::setNeedRecalculate()
{
mCachedRawDataDimensions.clear();
}
DataDimensionsList AbstractGrid::updateData( AbstractCoordinatePlane* plane )
{
if( plane ){
const DataDimensionsList rawDataDimensions( plane->getDataDimensionsList() );
if( mCachedRawDataDimensions.empty() || (rawDataDimensions != mCachedRawDataDimensions) ){
mCachedRawDataDimensions = rawDataDimensions;
mPlane = plane;
mData = calculateGrid( rawDataDimensions );
//qDebug("AbstractGrid::updateData() returns mData.first().start: %f mData.first().end: %f mData.first().stepWidth: %f", mData.first().start, mData.first().end, mData.first().stepWidth);
}
}
return mData;
}
bool AbstractGrid::isBoundariesValid(const QRectF& r )
{
return isBoundariesValid(
QPair<QPointF,QPointF>(r.topLeft(), r.bottomRight()) );
}
bool AbstractGrid::isBoundariesValid(const QPair<QPointF,QPointF>& b )
{
return isValueValid( b.first.x() ) && isValueValid( b.first.y() ) &&
isValueValid( b.second.x() ) && isValueValid( b.second.y() );
}
bool AbstractGrid::isBoundariesValid(const DataDimensionsList& l )
{
for (int i = 0; i < l.size(); ++i)
if ( ! isValueValid( l.at(i).start ) || ! isValueValid( l.at(i).end ) )
return false;
return true;
}
bool AbstractGrid::isValueValid(const qreal& r )
{
return !(ISNAN(r) || ISINF(r));
}
void AbstractGrid::adjustLowerUpperRange(
qreal& start, qreal& end,
qreal stepWidth,
bool adjustLower, bool adjustUpper )
{
const qreal startAdjust = ( start >= 0.0 ) ? 0.0 : -1.0;
const qreal endAdjust = ( end >= 0.0 ) ? 1.0 : 0.0;
if ( adjustLower && (fmod( start, stepWidth ) != 0.0) )
start = stepWidth * (_trunc( start / stepWidth ) + startAdjust);
if ( adjustUpper && (fmod( end, stepWidth ) != 0.0) )
end = stepWidth * (_trunc( end / stepWidth ) + endAdjust);
}
const DataDimension AbstractGrid::adjustedLowerUpperRange(
const DataDimension& dim,
bool adjustLower, bool adjustUpper )
{
DataDimension result( dim );
adjustLowerUpperRange(
result.start, result.end,
result.stepWidth,
adjustLower, adjustUpper );
return result;
}