/*! Zoom in/out the axes scales \param factor A value < 1.0 zooms in, a value > 1.0 zooms out. */ void QwtPlotMagnifier::rescale(double factor) { factor = qwtAbs(factor); if ( factor == 1.0 || factor == 0.0 ) return; bool doReplot = false; QwtPlot* plt = plot(); const bool autoReplot = plt->autoReplot(); plt->setAutoReplot(false); for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { const QwtScaleDiv *scaleDiv = plt->axisScaleDiv(axisId); if ( isAxisEnabled(axisId) && scaleDiv->isValid() ) { const double center = scaleDiv->lowerBound() + scaleDiv->range() / 2; const double width_2 = scaleDiv->range() / 2 * factor; plt->setAxisScale(axisId, center - width_2, center + width_2); doReplot = true; } } plt->setAutoReplot(autoReplot); if ( doReplot ) plt->replot(); }
/*! Adjust the enabled axes according to dx/dy \param dx Pixel offset in x direction \param dy Pixel offset in y direction \sa QwtPanner::panned() */ void QwtPlotPanner::moveCanvas( int dx, int dy ) { if ( dx == 0 && dy == 0 ) return; QwtPlot *plot = this->plot(); if ( plot == NULL ) return; const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); for ( int axisPos = 0; axisPos < QwtAxis::PosCount; axisPos++ ) { const int axesCount = plot->axesCount( axisPos ); for ( int i = 0; i < axesCount; i++ ) { const QwtAxisId axisId( axisPos, i ); if ( !isAxisEnabled( axisId ) ) continue; const QwtScaleMap map = plot->canvasMap( axisId ); const double p1 = map.transform( plot->axisScaleDiv( axisId ).lowerBound() ); const double p2 = map.transform( plot->axisScaleDiv( axisId ).upperBound() ); double d1, d2; if ( QwtAxis::isXAxis( axisPos ) ) { d1 = map.invTransform( p1 - dx ); d2 = map.invTransform( p2 - dx ); } else { d1 = map.invTransform( p1 - dy ); d2 = map.invTransform( p2 - dy ); } plot->setAxisScale( axisId, d1, d2 ); } } plot->setAutoReplot( doAutoReplot ); plot->replot(); }
void PlotMagnifier::rescale( double factor, AxisMode axis ) { factor = qAbs( 1.0/factor ); QwtPlot* plt = plot(); if ( plt == nullptr || factor == 1.0 ){ return; } bool doReplot = false; const bool autoReplot = plt->autoReplot(); plt->setAutoReplot( false ); const int axis_list[2] = {QwtPlot::xBottom, QwtPlot::yLeft}; QRectF new_rect; for ( int i = 0; i <2; i++ ) { double temp_factor = factor; if( i==1 && axis == X_AXIS) { temp_factor = 1.0; } if( i==0 && axis == Y_AXIS) { temp_factor = 1.0; } int axisId = axis_list[i]; if ( isAxisEnabled( axisId ) ) { const QwtScaleMap scaleMap = plt->canvasMap( axisId ); double v1 = scaleMap.s1(); double v2 = scaleMap.s2(); double center = _mouse_position.x(); if( axisId == QwtPlot::yLeft){ center = _mouse_position.y(); } if ( scaleMap.transformation() ) { // the coordinate system of the paint device is always linear v1 = scaleMap.transform( v1 ); // scaleMap.p1() v2 = scaleMap.transform( v2 ); // scaleMap.p2() } const double width = ( v2 - v1 ); const double ratio = (v2-center)/ (width); v1 = center - width*temp_factor*(1-ratio); v2 = center + width*temp_factor*(ratio); if( v1 > v2 ) std::swap( v1, v2 ); if ( scaleMap.transformation() ) { v1 = scaleMap.invTransform( v1 ); v2 = scaleMap.invTransform( v2 ); } if( v1 < _lower_bounds[axisId]) v1 = _lower_bounds[axisId]; if( v2 > _upper_bounds[axisId]) v2 = _upper_bounds[axisId]; plt->setAxisScale( axisId, v1, v2 ); if( axisId == QwtPlot::xBottom) { new_rect.setLeft( v1 ); new_rect.setRight( v2 ); } else{ new_rect.setBottom( v1 ); new_rect.setTop( v2 ); } doReplot = true; } } plt->setAutoReplot( autoReplot ); if ( doReplot ){ emit rescaled( new_rect ); } }