void QxrdImagePlot::recalculateDisplayedRange() { QxrdImagePlotSettingsPtr set(m_ImagePlotSettings); if (set && m_DataRaster) { double mindis, maxdis; if (set->get_DisplayScalingMode() == PercentageMode) { double minv = m_DataRaster->minValue(); double maxv = m_DataRaster->maxValue(); double del = maxv-minv; mindis = minv+del*set->get_DisplayMinimumPct()/100.0; maxdis = minv+del*set->get_DisplayMaximumPct()/100.0; } else if (set->get_DisplayScalingMode() == PercentileMode) { QwtInterval range = m_DataRaster->percentileRange(set->get_DisplayMinimumPctle(), set->get_DisplayMaximumPctle()); mindis = range.minValue(); maxdis = range.maxValue(); } else { mindis = set->get_DisplayMinimumVal(); maxdis = set->get_DisplayMaximumVal(); } m_DataRaster->setDisplayedRange(mindis, maxdis); replotImage(); } }
double QwtPlotRescaler::pixelDist( int axis, const QSize &size ) const { const QwtInterval intv = intervalHint( axis ); double dist = 0.0; if ( !intv.isNull() ) { if ( axis == referenceAxis() ) dist = intv.width(); else { const double r = aspectRatio( axis ); if ( r > 0.0 ) dist = intv.width() * r; } } if ( dist > 0.0 ) { if ( orientation( axis ) == Qt::Horizontal ) dist /= size.width(); else dist /= size.height(); } return dist; }
/*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLinearScaleEngine::align( const QwtInterval &interval, double stepSize ) const { double x1 = interval.minValue(); double x2 = interval.maxValue(); // when there is no rounding beside some effect, when // calculating with doubles, we keep the original value const double eps = 0.000000000001; // since Qt 4.8: qFuzzyIsNull if ( -DBL_MAX + stepSize <= x1 ) { const double x = QwtScaleArithmetic::floorEps( x1, stepSize ); if ( qAbs(x) <= eps || !qFuzzyCompare( x1, x ) ) x1 = x; } if ( DBL_MAX - stepSize >= x2 ) { const double x = QwtScaleArithmetic::ceilEps( x2, stepSize ); if ( qAbs(x) <= eps || !qFuzzyCompare( x2, x ) ) x2 = x; } return QwtInterval( x1, x2 ); }
/*! Synchronize an axis scale according to the scale of the reference axis \param axis Axis index ( see QwtPlot::AxisId ) \param reference Interval of the reference axis \param size Size of the canvas \return New interval for axis */ QwtInterval QwtPlotRescaler::syncScale( int axis, const QwtInterval& reference, const QSize &size ) const { double dist; if ( orientation( referenceAxis() ) == Qt::Horizontal ) dist = reference.width() / size.width(); else dist = reference.width() / size.height(); if ( orientation( axis ) == Qt::Horizontal ) dist *= size.width(); else dist *= size.height(); dist /= aspectRatio( axis ); QwtInterval intv; if ( rescalePolicy() == Fitting ) intv = intervalHint( axis ); else intv = interval( axis ); intv = expandInterval( intv, dist, expandingDirection( axis ) ); return intv; }
/*! \return Bounding rectangle of the data \sa QwtPlotRasterItem::interval() */ QRectF QwtPlotRasterItem::boundingRect() const { const QwtInterval intervalX = interval( Qt::XAxis ); const QwtInterval intervalY = interval( Qt::YAxis ); if ( !intervalX.isValid() && !intervalY.isValid() ) return QRectF(); // no bounding rect QRectF r; if ( intervalX.isValid() ) { r.setLeft( intervalX.minValue() ); r.setRight( intervalX.maxValue() ); } else { r.setLeft(-0.5 * FLT_MAX); r.setWidth(FLT_MAX); } if ( intervalY.isValid() ) { r.setTop( intervalY.minValue() ); r.setBottom( intervalY.maxValue() ); } else { r.setTop(-0.5 * FLT_MAX); r.setHeight(FLT_MAX); } return r.normalized(); }
void fill(Plot* plot) { plot->setAxisTitle(axis, donor->axisTitle(axis)); const QwtInterval interval = donor->axisInterval(axis); plot->setAxisScale(axis, interval.minValue(), interval.maxValue(), donor->axisStep(QwtPlot::Axis(axis))); plot->replot(); }
/*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. */ QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); if ( interval.width() <= 0 ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = QwtScaleArithmetic::divideInterval( interval.width(), maxMajorSteps, base() ); } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList<double> ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; }
/*! Draw a sample \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param boundingInterval Bounding interval of sample values \param index Index of the sample to be painted \param sample Sample value \sa drawSeries() */ void QwtPlotMultiBarChart::drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QwtSetSample& sample ) const { if ( sample.set.size() <= 0 ) return; double sampleW; if ( orientation() == Qt::Horizontal ) { sampleW = sampleWidth( yMap, canvasRect.height(), boundingInterval.width(), sample.value ); } else { sampleW = sampleWidth( xMap, canvasRect.width(), boundingInterval.width(), sample.value ); } if ( d_data->style == Stacked ) { drawStackedBars( painter, xMap, yMap, canvasRect, index, sampleW, sample ); } else { drawGroupedBars( painter, xMap, yMap, canvasRect, index, sampleW, sample ); } }
/*! Redraw the canvas items. \param painter Painter used for drawing \param azimuthMap Maps azimuth values to values related to 0.0, M_2PI \param radialMap Maps radius values into painter coordinates. \param pole Position of the pole in painter coordinates \param radius Radius of the complete plot area in painter coordinates \param canvasRect Contents rect of the canvas in painter coordinates */ void QwtPolarPlot::drawItems( QPainter *painter, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double radius, const QRectF &canvasRect ) const { const QRectF pr = plotRect( canvasRect ); const QwtPolarItemList& itmList = itemList(); for ( QwtPolarItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPolarItem *item = *it; if ( item && item->isVisible() ) { painter->save(); // Unfortunately circular clipping slows down // painting a lot. So we better try to avoid it. bool doClipping = false; if ( item->rtti() != QwtPolarItem::Rtti_PolarGrid ) { const QwtInterval intv = item->boundingInterval( QwtPolar::Radius ); if ( !intv.isValid() ) doClipping = true; else { if ( radialMap.s1() < radialMap.s2() ) doClipping = intv.maxValue() > radialMap.s2(); else doClipping = intv.minValue() < radialMap.s2(); } } if ( doClipping ) { const int margin = item->marginHint(); const QRectF clipRect = pr.adjusted( -margin, -margin, margin, margin ); if ( !clipRect.contains( canvasRect ) ) { QRegion clipRegion( clipRect.toRect(), QRegion::Ellipse ); painter->setClipRegion( clipRegion, Qt::IntersectClip ); } } painter->setRenderHint( QPainter::Antialiasing, item->testRenderHint( QwtPolarItem::RenderAntialiased ) ); item->draw( painter, azimuthMap, radialMap, pole, radius, canvasRect ); painter->restore(); } } }
void SweepInspector::loadSweep(int index) { //load in new sweep values from data if (data == NULL) return; if ( (index < 0) || (index >= data->getNumSweeps())) return; //remove old data and get new if (d_curve) d_curve->attach(NULL); detachItems(); fsweep sweep = data->getSweep(index); d_curve = new QwtPlotCurve( data->timestampFromIndex(index) ); //Qwt will delete() this when its done with it d_curve->setRenderHint( QwtPlotItem::RenderAntialiased ); d_curve->setStyle( QwtPlotCurve::Lines ); d_curve->setPen( QColor( Qt::yellow ), 2, Qt::SolidLine ); d_curve->setSamples( sweep ); d_curve->attach(this); QwtInterval frange = data->limits(FREQ); //setAxisScale(QwtPlot::xBottom, frange.minValue(), frange.maxValue(), (frange.maxValue() - frange.minValue())/ 5.0); //setAxisScale(QwtPlot::yLeft, -135, 20, 10.0); setTitle( QString("RF Sweep @ %1").arg(data->timestampFromIndex(index)) ); //set maximum zoom out zoomer->setZoomBase(QRectF(QPointF(frange.minValue(), 40), QPointF(frange.maxValue(), -135))); zoomer->zoomBase(); //find max, min, and average values and drop it on plot as well double max = sweep.first().y(), min = sweep.first().y(), avg=0; for(int i=0; i < sweep.size(); i++) { max = std::max(max, sweep.at(i).y()); min = std::min(min, sweep.at(i).y()); avg += sweep.at(i).y(); } avg /= sweep.size(); //add markers onto the plot QwtPlotMarker *one = new QwtPlotMarker(), *two = new QwtPlotMarker(); one->attach(this); one->setAxes(QwtPlot::xTop, QwtPlot::yRight); two->attach(this); two->setAxes(QwtPlot::xTop, QwtPlot::yRight); QwtText tone = QwtText(QString("Max: %1 dBm\nMin: %2 dBm\nAvg: %3 dBm").arg(max).arg(min).arg(avg)); tone.setFont( QFont( "Helvetica", 10, QFont::Bold ) ); tone.setColor( Qt::green ); tone.setRenderFlags(Qt::AlignTop | Qt::AlignLeft); one->setLabel(tone); one->setValue(0, 10); one->setLabelAlignment(Qt::AlignBottom | Qt::AlignRight); QwtText ttwo(data->plotText()); ttwo.setFont( QFont( "Helvetica", 10, QFont::Bold ) ); ttwo.setColor( Qt::white ); ttwo.setRenderFlags(Qt::AlignBottom | Qt::AlignRight); two->setLabel(ttwo); two->setValue(10, 10); two->setLabelAlignment(Qt::AlignBottom | Qt::AlignLeft); replot(); repaint(); }
static inline long double qwtIntervalWidthL( const QwtInterval &interval ) { if ( !interval.isValid() ) return 0.0; return static_cast<long double>( interval.maxValue() ) - static_cast<long double>( interval.minValue() ); }
/*! Construct a scale division \param interval Interval \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval, QList<double> ticks[NTickTypes] ): d_lowerBound( interval.minValue() ), d_upperBound( interval.maxValue() ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; }
/*! \brief Calculate a scale division for an interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. \return Calculated scale division */ QwtScaleDiv QwtLogScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() <= 0 ) return QwtScaleDiv(); const double logBase = base(); if ( interval.maxValue() / interval.minValue() < logBase ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); if ( stepSize != 0.0 ) { if ( stepSize < 0.0 ) stepSize = -qPow( logBase, -stepSize ); else stepSize = qPow( logBase, stepSize ); } return linearScaler.divideScale( x1, x2, maxMajorSteps, maxMinorSteps, stepSize ); } stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = divideInterval( qwtLogInterval( logBase, interval ).width(), maxMajorSteps ); if ( stepSize < 1.0 ) stepSize = 1.0; // major step must be >= 1 decade } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList<double> ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; }
Plot::Plot( QWidget *parent ): QwtPlot( parent ), d_formatType( 0 ), d_alpha(255) { d_spectrogram = new QwtPlotSpectrogram(); d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count d_spectrogram->setCachePolicy( QwtPlotRasterItem::PaintCache ); QList<double> contourLevels; for ( double level = 0.5; level < 10.0; level += 1.0 ) contourLevels += level; d_spectrogram->setContourLevels( contourLevels ); d_spectrogram->setData( new SpectrogramData() ); d_spectrogram->attach( this ); const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis ); // A color bar on the right axis QwtScaleWidget *rightAxis = axisWidget( QwtPlot::yRight ); rightAxis->setTitle( "Intensity" ); rightAxis->setColorBarEnabled( true ); setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() ); enableAxis( QwtPlot::yRight ); plotLayout()->setAlignCanvasToScales( true ); setColorMap( Plot::RGBMap ); // LeftButton for the zooming // MidButton for the panning // RightButton: zoom out by 1 // Ctrl+RighButton: zoom out to full size QwtPlotZoomer* zoomer = new MyZoomer( canvas() ); zoomer->setMousePattern( QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier ); zoomer->setMousePattern( QwtEventPattern::MouseSelect3, Qt::RightButton ); QwtPlotPanner *panner = new QwtPlotPanner( canvas() ); panner->setAxisEnabled( QwtPlot::yRight, false ); panner->setMouseButton( Qt::MidButton ); // Avoid jumping when labels with more/less digits // appear/disappear when scrolling vertically const QFontMetrics fm( axisWidget( QwtPlot::yLeft )->font() ); QwtScaleDraw *sd = axisScaleDraw( QwtPlot::yLeft ); sd->setMinimumExtent( fm.width( "100.00" ) ); const QColor c( Qt::darkBlue ); zoomer->setRubberBandPen( c ); zoomer->setTrackerPen( c ); }
static inline bool qwtIsSampleInside( const QwtOHLCSample &sample, double tMin, double tMax, double vMin, double vMax ) { const double t = sample.time; const QwtInterval interval = sample.boundingInterval(); const bool isOffScreen = ( t < tMin ) || ( t > tMax ) || ( interval.maxValue() < vMin ) || ( interval.minValue() > vMax ); return !isOffScreen; }
void matrixofpixels::PixPlotSpect(int TypeOfSpec,QwtMatrixRasterData *rasterpixdata) { changeitems(); MapPlot->setData(rasterpixdata); MapPlot->setRenderThreadCount(0); setAxisAutoScale(this->xTop); setAxisAutoScale(this->xBottom); switch (TypeOfSpec) { case 1: MapPlot->setColorMap(new ColorMap(BLUERED)); break; case 2: MapPlot->setColorMap(new ColorMap(BLACKWHITE)); break; default: MapPlot->setColorMap(new ColorMap(BLUERED)); } MapPlot->attach(/*MainPlot*/this); const QwtInterval zInterval = MapPlot->data()->interval(Qt::ZAxis); setAxisScale(QwtPlot::xBottom, 0, Npix); setAxisMaxMinor(QwtPlot::xBottom, 0); setAxisScale(QwtPlot::yLeft, 0, Npix); setAxisMaxMinor(QwtPlot::yLeft, 0); //rightAxis = new QwtScaleWidget(); QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); //rightAxis = axisWidget(QwtPlot::yRight); rightAxis->setColorBarEnabled(true); rightAxis->setColorBarWidth(20); rightAxis->setColorMap(zInterval, new ColorMap(TypeOfSpec) ); //ColorMap(TypeOfSpec); plotLayout()->setAlignCanvasToScales(true); setAxisScale(QwtPlot::yRight,zInterval.minValue(),zInterval.maxValue()); enableAxis(QwtPlot::yRight); replot(); setAutoFillBackground(true); /** setAutoFillBackground(true); - autozapolnenie, ctobi isklyuchit' nalozjeniya graphikov */ }
/*! Calculate the new scale interval of a plot axis \param axis Axis index ( see QwtPlot::AxisId ) \param oldSize Previous size of the canvas \param newSize New size of the canvas \return Calculated new interval for the axis */ QwtInterval QwtPlotRescaler::expandScale( int axis, const QSize &oldSize, const QSize &newSize ) const { const QwtInterval oldInterval = interval( axis ); QwtInterval expanded = oldInterval; switch ( rescalePolicy() ) { case Fixed: { break; // do nothing } case Expanding: { if ( !oldSize.isEmpty() ) { double width = oldInterval.width(); if ( orientation( axis ) == Qt::Horizontal ) width *= double( newSize.width() ) / oldSize.width(); else width *= double( newSize.height() ) / oldSize.height(); expanded = expandInterval( oldInterval, width, expandingDirection( axis ) ); } break; } case Fitting: { double dist = 0.0; for ( int ax = 0; ax < QwtPlot::axisCnt; ax++ ) { const double d = pixelDist( ax, newSize ); if ( d > dist ) dist = d; } if ( dist > 0.0 ) { double width; if ( orientation( axis ) == Qt::Horizontal ) width = newSize.width() * dist; else width = newSize.height() * dist; expanded = expandInterval( intervalHint( axis ), width, expandingDirection( axis ) ); } break; } } return expanded; }
/*! Build and return a color map of 256 colors The color table is needed for rendering indexed images in combination with using colorIndex(). \param interval Range for the values \return A color table, that can be used for a QImage */ QVector<QRgb> QwtColorMap::colorTable( const QwtInterval &interval ) const { QVector<QRgb> table( 256 ); if ( interval.isValid() ) { const double step = interval.width() / ( table.size() - 1 ); for ( int i = 0; i < table.size(); i++ ) table[i] = rgb( interval, interval.minValue() + step * i ); } return table; }
/*! Check if an interval "contains" a value \param interval Interval \param value Value \return True, when the value is inside the interval */ bool QwtScaleEngine::contains( const QwtInterval &interval, double value ) const { if ( !interval.isValid() ) return false; if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 ) return false; if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 ) return false; return true; }
/*! Map a value of a given interval into a rgb value \param interval Range for all values \param value Value to map into a rgb value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); }
void QwtPolarPlot::updateScale( int scaleId ) { if ( scaleId < 0 || scaleId >= QwtPolar::ScaleCount ) return; ScaleData &d = d_data->scaleData[scaleId]; double minValue = d.minValue; double maxValue = d.maxValue; double stepSize = d.stepSize; if ( scaleId == QwtPolar::ScaleRadius && d.doAutoScale ) { QwtInterval interval; const QwtPolarItemList& itmList = itemList(); for ( QwtPolarItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPolarItem *item = *it; if ( item->testItemAttribute( QwtPolarItem::AutoScale ) ) interval |= item->boundingInterval( scaleId ); } minValue = interval.minValue(); maxValue = interval.maxValue(); d.scaleEngine->autoScale( d.maxMajor, minValue, maxValue, stepSize ); d.scaleDiv.invalidate(); } if ( !d.scaleDiv.isValid() ) { d.scaleDiv = d.scaleEngine->divideScale( minValue, maxValue, d.maxMajor, d.maxMinor, stepSize ); } const QwtInterval interval = visibleInterval(); const QwtPolarItemList& itmList = itemList(); for ( QwtPolarItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPolarItem *item = *it; item->updateScaleDiv( *scaleDiv( QwtPolar::Azimuth ), *scaleDiv( QwtPolar::Radius ), interval ); } }
/*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList<double> QwtLinearScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { int numTicks = qRound( interval.width() / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; QList<double> ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += interval.minValue() + i * stepSize; ticks += interval.maxValue(); return ticks; }
/*! \brief Map a value of a given interval into a alpha value alpha := (value - interval.minValue()) / interval.width(); \param interval Range for all values \param value Value to map into a rgb value \return rgb value, with an alpha value */ QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( !qIsNaN(value) && width >= 0.0 ) { const double ratio = ( value - interval.minValue() ) / width; int alpha = qRound( 255 * ratio ); if ( alpha < 0 ) alpha = 0; if ( alpha > 255 ) alpha = 255; return d_data->rgb | ( alpha << 24 ); } return d_data->rgb; }
/*! Draw a sample \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param boundingInterval Bounding interval of sample values \param index Index of the sample \param sample Value of the sample \sa drawSeries() */ void QwtPlotBarChart::drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QPointF &sample ) const { QwtColumnRect barRect; if ( orientation() == Qt::Horizontal ) { const double barHeight = sampleWidth( yMap, canvasRect.height(), boundingInterval.width(), sample.y() ); const double x1 = xMap.transform( baseline() ); const double x2 = xMap.transform( sample.y() ); const double y = yMap.transform( sample.x() ); const double y1 = y - 0.5 * barHeight; const double y2 = y + 0.5 * barHeight; barRect.direction = ( x1 < x2 ) ? QwtColumnRect::LeftToRight : QwtColumnRect::RightToLeft; barRect.hInterval = QwtInterval( x1, x2 ).normalized(); barRect.vInterval = QwtInterval( y1, y2 ); } else { const double barWidth = sampleWidth( xMap, canvasRect.width(), boundingInterval.width(), sample.y() ); const double x = xMap.transform( sample.x() ); const double x1 = x - 0.5 * barWidth; const double x2 = x + 0.5 * barWidth; const double y1 = yMap.transform( baseline() ); const double y2 = yMap.transform( sample.y() ); barRect.direction = ( y1 < y2 ) ? QwtColumnRect::TopToBottom : QwtColumnRect::BottomToTop; barRect.hInterval = QwtInterval( x1, x2 ); barRect.vInterval = QwtInterval( y1, y2 ).normalized(); } drawBar( painter, index, sample, barRect ); }
QwtInterval QwtPlotScaleItem::PrivateData::scaleInterval( const QRectF &canvasRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { QwtInterval interval; if ( scaleDraw->orientation() == Qt::Horizontal ) { interval.setMinValue( xMap.invTransform( canvasRect.left() ) ); interval.setMaxValue( xMap.invTransform( canvasRect.right() - 1 ) ); } else { interval.setMinValue( yMap.invTransform( canvasRect.bottom() - 1 ) ); interval.setMaxValue( yMap.invTransform( canvasRect.top() ) ); } return interval; }
void Spectrogramplot::setZAxisScale(double zMin, double zMax) { zMin_ = zMin; zMax_ = zMax; data_->setInterval( Qt::ZAxis, QwtInterval( zMin_, zMax_ ) ); //Set up the intensity bar on the right const QwtInterval zInterval = spectrogram_->data()->interval( Qt::ZAxis ); QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); rightAxis->setColorBarEnabled(true); rightAxis->setColorMap( zInterval, new ColorMap()); setAxisScale(QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() ); enableAxis(QwtPlot::yRight); plotLayout()->setAlignCanvasToScales(true); replot(); }
void SaxsviewImage::setFrame(SaxsviewFrame *frame) { if (p->frame) p->frame->detach(); p->frame = frame; frame->attach(this); if (frame->data()) { const QwtInterval range = p->frame->data()->interval(Qt::ZAxis); axisWidget(QwtPlot::yRight)->setColorBarInterval(range); setAxisScale(QwtPlot::yRight, range.minValue(), range.maxValue()); } setZoomBase(p->frame->boundingRect()); replot(); }
/*! \brief Render a tile of an image. Rendering in tiles can be used to composite an image in parallel threads. \param xMap X-Scale Map \param yMap Y-Scale Map \param tile Geometry of the tile in image coordinates \param image Image to be rendered */ void QwtPlotSpectrogram::renderTile( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &tile, QImage *image ) const { const QwtInterval range = d_data->data->interval( Qt::ZAxis ); if ( !range.isValid() ) return; if ( d_data->colorMap->format() == QwtColorMap::RGB ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); QRgb *line = reinterpret_cast<QRgb *>( image->scanLine( y ) ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->rgb( range, d_data->data->value( tx, ty ) ); } } } else if ( d_data->colorMap->format() == QwtColorMap::Indexed ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); unsigned char *line = image->scanLine( y ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->colorIndex( range, d_data->data->value( tx, ty ) ); } } } }
/*! Draw the spectrogram \param painter Painter \param azimuthMap Maps azimuth values to values related to 0.0, M_2PI \param radialMap Maps radius values into painter coordinates. \param pole Position of the pole in painter coordinates \param radius Radius of the complete plot area in painter coordinates \param canvasRect Contents rect of the canvas in painter coordinates */ void QwtPolarSpectrogram::draw( QPainter *painter, const QwtScaleMap &azimuthMap, const QwtScaleMap &radialMap, const QPointF &pole, double, const QRectF &canvasRect ) const { const QRectF plotRect = plot()->plotRect( canvasRect.toRect() ); QRegion clipRegion( canvasRect.toRect() ); if ( qwtNeedsClipping( plotRect, canvasRect ) ) { // For large plotRects the ellipse becomes a huge polygon. // So we better clip only, when we really need to. clipRegion &= QRegion( plotRect.toRect(), QRegion::Ellipse ); } QRect imageRect = canvasRect.toRect(); if ( painter->hasClipping() ) imageRect &= painter->clipRegion().boundingRect(); const QwtInterval radialInterval = boundingInterval( QwtPolar::ScaleRadius ); if ( radialInterval.isValid() ) { const double radius = radialMap.transform( radialInterval.maxValue() ) - radialMap.transform( radialInterval.minValue() ); QRectF r( 0, 0, 2 * radius, 2 * radius ); r.moveCenter( pole ); clipRegion &= QRegion( r.toRect(), QRegion::Ellipse );; imageRect &= r.toRect(); } const QImage image = renderImage( azimuthMap, radialMap, pole, imageRect ); painter->save(); painter->setClipRegion( clipRegion ); painter->drawImage( imageRect, image ); painter->restore(); }
Plot::Plot( QWidget *parent ): QwtPlot( parent ) { QwtPlotCanvas *canvas = new QwtPlotCanvas(); canvas->setBorderRadius( 10 ); setCanvas( canvas ); #if 0 QwtPlotGrid *grid = new QwtPlotGrid(); grid->setPen( Qt::DotLine ); grid->attach( this ); #endif d_spectrogram = new QwtPlotSpectrogram(); d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count d_spectrogram->setColorMap( new ColorMap() ); d_spectrogram->setData( new RasterData() ); d_spectrogram->attach( this ); const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis ); // A color bar on the right axis QwtScaleWidget *rightAxis = axisWidget( QwtPlot::yRight ); rightAxis->setColorBarEnabled( true ); rightAxis->setColorBarWidth( 40 ); rightAxis->setColorMap( zInterval, new ColorMap() ); setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() ); enableAxis( QwtPlot::yRight ); plotLayout()->setAlignCanvasToScales( true ); setAxisScale( QwtPlot::xBottom, 0.0, 3.0 ); setAxisMaxMinor( QwtPlot::xBottom, 0 ); setAxisScale( QwtPlot::yLeft, 0.0, 3.0 ); setAxisMaxMinor( QwtPlot::yLeft, 0 ); QwtPlotMagnifier *magnifier = new QwtPlotMagnifier( canvas ); magnifier->setAxisEnabled( QwtPlot::yRight, false ); QwtPlotPanner *panner = new QwtPlotPanner( canvas ); panner->setAxisEnabled( QwtPlot::yRight, false ); }