Skip to content
qwt_scale_map.cpp 5.48 KiB
Newer Older
pixhawk's avatar
pixhawk committed
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
pixhawk's avatar
pixhawk committed
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#include "qwt_scale_map.h"
Bryant's avatar
Bryant committed
#include "qwt_math.h"
#include <qrect.h>
#include <qdebug.h>
pixhawk's avatar
pixhawk committed

/*!
  \brief Constructor

  The scale and paint device intervals are both set to [0,1].
*/
QwtScaleMap::QwtScaleMap():
Bryant's avatar
Bryant committed
    d_s1( 0.0 ),
    d_s2( 1.0 ),
    d_p1( 0.0 ),
    d_p2( 1.0 ),
    d_cnv( 1.0 ),
    d_ts1( 0.0 ),
    d_transform( NULL )
pixhawk's avatar
pixhawk committed
{
}

Bryant's avatar
Bryant committed
//! Copy constructor
QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ):
    d_s1( other.d_s1 ),
    d_s2( other.d_s2 ),
    d_p1( other.d_p1 ),
    d_p2( other.d_p2 ),
    d_cnv( other.d_cnv ),
    d_ts1( other.d_ts1 ),
    d_transform( NULL )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    if ( other.d_transform )
        d_transform = other.d_transform->copy();
pixhawk's avatar
pixhawk committed
}

/*!
  Destructor
*/
QwtScaleMap::~QwtScaleMap()
{
Bryant's avatar
Bryant committed
    delete d_transform;
pixhawk's avatar
pixhawk committed
}

Bryant's avatar
Bryant committed
//! Assignment operator
QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other )
pixhawk's avatar
pixhawk committed
{
    d_s1 = other.d_s1;
    d_s2 = other.d_s2;
    d_p1 = other.d_p1;
    d_p2 = other.d_p2;
    d_cnv = other.d_cnv;
Bryant's avatar
Bryant committed
    d_ts1 = other.d_ts1;
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    delete d_transform;
    d_transform = NULL;

    if ( other.d_transform )
        d_transform = other.d_transform->copy();
pixhawk's avatar
pixhawk committed

    return *this;
}

/*!
   Initialize the map with a transformation
*/
Bryant's avatar
Bryant committed
void QwtScaleMap::setTransformation( QwtTransform *transform )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    if ( transform != d_transform )
    {
        delete d_transform;
        d_transform = transform;
    }
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
    setScaleInterval( d_s1, d_s2 );
pixhawk's avatar
pixhawk committed
}

//! Get the transformation
Bryant's avatar
Bryant committed
const QwtTransform *QwtScaleMap::transformation() const
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    return d_transform;
pixhawk's avatar
pixhawk committed
}

/*!
  \brief Specify the borders of the scale interval
  \param s1 first border
  \param s2 second border
Bryant's avatar
Bryant committed
  \warning scales might be aligned to 
           transformation depending boundaries
pixhawk's avatar
pixhawk committed
*/
Bryant's avatar
Bryant committed
void QwtScaleMap::setScaleInterval( double s1, double s2 )
pixhawk's avatar
pixhawk committed
{
    d_s1 = s1;
    d_s2 = s2;

Bryant's avatar
Bryant committed
    if ( d_transform )
    {
        d_s1 = d_transform->bounded( d_s1 );
        d_s2 = d_transform->bounded( d_s2 );
    }

    updateFactor();
pixhawk's avatar
pixhawk committed
}

/*!
  \brief Specify the borders of the paint device interval
  \param p1 first border
  \param p2 second border
*/
Bryant's avatar
Bryant committed
void QwtScaleMap::setPaintInterval( double p1, double p2 )
pixhawk's avatar
pixhawk committed
{
    d_p1 = p1;
    d_p2 = p2;

Bryant's avatar
Bryant committed
    updateFactor();
}

void QwtScaleMap::updateFactor()
{
    d_ts1 = d_s1;
    double ts2 = d_s2;

    if ( d_transform )
    {
        d_ts1 = d_transform->transform( d_ts1 );
        ts2 = d_transform->transform( ts2 );
    }

    d_cnv = 1.0;
    if ( d_ts1 != ts2 )
        d_cnv = ( d_p2 - d_p1 ) / ( ts2 - d_ts1 );
pixhawk's avatar
pixhawk committed
}

/*!
Bryant's avatar
Bryant committed
   Transform a rectangle from scale to paint coordinates

   \param xMap X map
   \param yMap Y map
   \param rect Rectangle in scale coordinates
   \return Rectangle in paint coordinates

   \sa invTransform()
pixhawk's avatar
pixhawk committed
*/
Bryant's avatar
Bryant committed
QRectF QwtScaleMap::transform( const QwtScaleMap &xMap,
    const QwtScaleMap &yMap, const QRectF &rect )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    double x1 = xMap.transform( rect.left() );
    double x2 = xMap.transform( rect.right() );
    double y1 = yMap.transform( rect.top() );
    double y2 = yMap.transform( rect.bottom() );

    if ( x2 < x1 )
        qSwap( x1, x2 );
    if ( y2 < y1 )
        qSwap( y1, y2 );

    if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 )
        x1 = 0.0;
    if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 )
        x2 = 0.0;
    if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 )
        y1 = 0.0;
    if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 )
        y2 = 0.0;

    return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 );
}

/*!
   Transform a rectangle from paint to scale coordinates
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
   \param xMap X map
   \param yMap Y map
   \param pos Position in paint coordinates
   \return Position in scale coordinates
   \sa transform()
*/
QPointF QwtScaleMap::invTransform( const QwtScaleMap &xMap,
    const QwtScaleMap &yMap, const QPointF &pos )
{
    return QPointF( 
        xMap.invTransform( pos.x() ), 
        yMap.invTransform( pos.y() ) 
    );
pixhawk's avatar
pixhawk committed
}

/*!
Bryant's avatar
Bryant committed
   Transform a point from scale to paint coordinates

   \param xMap X map
   \param yMap Y map
   \param pos Position in scale coordinates
   \return Position in paint coordinates

   \sa invTransform()
pixhawk's avatar
pixhawk committed
*/
Bryant's avatar
Bryant committed
QPointF QwtScaleMap::transform( const QwtScaleMap &xMap,
    const QwtScaleMap &yMap, const QPointF &pos )
pixhawk's avatar
pixhawk committed
{
Bryant's avatar
Bryant committed
    return QPointF( 
        xMap.transform( pos.x() ), 
        yMap.transform( pos.y() )
    );
}
pixhawk's avatar
pixhawk committed

Bryant's avatar
Bryant committed
/*!
   Transform a rectangle from paint to scale coordinates

   \param xMap X map
   \param yMap Y map
   \param rect Rectangle in paint coordinates
   \return Rectangle in scale coordinates
   \sa transform()
*/
QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap,
    const QwtScaleMap &yMap, const QRectF &rect )
{
    const double x1 = xMap.invTransform( rect.left() );
    const double x2 = xMap.invTransform( rect.right() - 1 );
    const double y1 = yMap.invTransform( rect.top() );
    const double y2 = yMap.invTransform( rect.bottom() - 1 );

    const QRectF r( x1, y1, x2 - x1, y2 - y1 );
    return r.normalized();
pixhawk's avatar
pixhawk committed
}
Bryant's avatar
Bryant committed

#ifndef QT_NO_DEBUG_STREAM

QDebug operator<<( QDebug debug, const QwtScaleMap &map )
{
    debug.nospace() << "QwtScaleMap("
        << map.transformation()
        << ", s:" << map.s1() << "->" << map.s2()
        << ", p:" << map.p1() << "->" << map.p2()
        << ")";

    return debug.space();
}

#endif