static inline void qwtDrawPixmapSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QSize size = symbol.size(); if ( size.isEmpty() ) size = symbol.pixmap().size(); const QTransform transform = painter->transform(); if ( transform.isScaling() ) { const QRect r( 0, 0, size.width(), size.height() ); size = transform.mapRect( r ).size(); } QPixmap pm = symbol.pixmap(); if ( pm.size() != size ) pm = pm.scaled( size ); QPointF pinPoint( 0.5 * size.width(), 0.5 * size.height() ); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); painter->resetTransform(); for ( int i = 0; i < numPoints; i++ ) { const QPointF pos = transform.map( points[i] ) - pinPoint; QwtPainter::drawPixmap( painter, QRect( pos.toPoint(), pm.size() ), pm ); } }
void PolymerizationProcess::pinStep(double* currX, double *fixedDcm, double* currDcm, double* resDcm) { double nextDcm[9]; double nextX[3]; dcmXdcm( fixedDcm, currDcm, nextDcm ); nextX[0] = currX[0] + theMonomerLength*nextDcm[0]; nextX[1] = currX[1] + theMonomerLength*nextDcm[1]; nextX[2] = currX[2] + theMonomerLength*nextDcm[2]; pinPoint( currX, nextX, 'e', theRadius, (theMaxX-theMinX)/2, nextDcm); dcmXdcmt( nextDcm, currDcm, resDcm ); double ypr[3]; dcm2ypr(resDcm, ypr); ypr2dcm(ypr, resDcm); }
/*! Calculate the bounding rectangle for a symbol at position (0,0). \return Bounding rectangle */ QRect QwtSymbol::boundingRect() const { QRectF rect; bool pinPointTranslation = false; switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Hexagon: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( pw, pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::XCross: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star1: case QwtSymbol::Star2: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( 2 * pw, 2 * pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::Path: { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } rect = qwtScaledBoundingRect( d_data->path.graphic, d_data->size ); pinPointTranslation = true; break; } case QwtSymbol::Pixmap: { if ( d_data->size.isEmpty() ) rect.setSize( d_data->pixmap.pixmap.size() ); else rect.setSize( d_data->size ); pinPointTranslation = true; break; } case QwtSymbol::Graphic: { rect = qwtScaledBoundingRect( d_data->graphic.graphic, d_data->size ); pinPointTranslation = true; break; } #ifndef QWT_NO_SVG case QwtSymbol::SvgDocument: { if ( d_data->svg.renderer ) rect = d_data->svg.renderer->viewBoxF(); if ( d_data->size.isValid() && !rect.isEmpty() ) { QSizeF sz = rect.size(); const double sx = d_data->size.width() / sz.width(); const double sy = d_data->size.height() / sz.height(); QTransform transform; transform.scale( sx, sy ); rect = transform.mapRect( rect ); } pinPointTranslation = true; break; } #endif default: { rect.setSize( d_data->size ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); } } if ( pinPointTranslation ) { QPointF pinPoint( 0.0, 0.0 ); if ( d_data->isPinPointEnabled ) pinPoint = rect.center() - d_data->pinPoint; rect.moveCenter( pinPoint ); } QRect r; r.setLeft( qFloor( rect.left() ) ); r.setTop( qFloor( rect.top() ) ); r.setRight( qCeil( rect.right() ) ); r.setBottom( qCeil( rect.bottom() ) ); if ( d_data->style != QwtSymbol::Pixmap ) r.adjust( -1, -1, 1, 1 ); // for antialiasing return r; }
MySymbol( QwtSymbol::Style style, const QBrush &brush ) { QPen pen( Qt::black, 0 ); pen.setJoinStyle( Qt::MiterJoin ); pen.setCosmetic( true ); QPainterPath path = createArrow( QSize( 16, 24 ) ); const QSizeF pathSize = path.boundingRect().size(); setSize( 0.8 * pathSize.toSize() ); setPinPoint( QPointF( 0.0, 0.0 ) ); switch( style ) { case QwtSymbol::Pixmap: { const QSize sz = size(); const double ratio = qMin( sz.width() / pathSize.width(), sz.height() / pathSize.height() ); QTransform transform; transform.scale( ratio, ratio ); path = transform.map( path ); if ( isPinPointEnabled() ) { QPointF pos = transform.map( pinPoint() ); setPinPoint( pos ); } const QRectF br = path.boundingRect(); int m = 2 + qCeil( pen.widthF() ); QPixmap pm( sz + QSize( 2 * m, 2 * m ) ); pm.fill( Qt::transparent ); QPainter painter( &pm ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.translate( m, m ); painter.translate( -br.left(), br.top() ); painter.drawPath( path ); setPixmap( pm ); setSize( pm.size() ); if ( isPinPointEnabled() ) setPinPoint( pinPoint() + QPointF( m, m ) ); break; } case QwtSymbol::Graphic: { QwtGraphic graphic; graphic.setRenderHint( QwtGraphic::RenderPensUnscaled ); QPainter painter( &graphic ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); setGraphic( graphic ); break; } case QwtSymbol::SvgDocument: { QBuffer buf; QSvgGenerator generator; generator.setOutputDevice( &buf ); QPainter painter( &generator ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); setSvgDocument( buf.data() ); break; } case QwtSymbol::Path: default: { setPen( pen ); setBrush( brush ); setPath( path ); } } }