Skip to content
Snippets Groups Projects
qwt_scale_map.cpp 5.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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