inline void QwtPolygonClipperF::addPoint(QwtPolygonF &pa, uint pos, const QwtDoublePoint &point) const { if ( uint(pa.size()) <= pos ) pa.resize(pos + 5); pa[(int)pos] = point; }
void QwtPolygonClipperF::clipEdge(Edge edge, const QwtPolygonF &pa, QwtPolygonF &cpa) const { if ( pa.count() == 0 ) { cpa.resize(0); return; } unsigned int count = 0; QwtDoublePoint p1 = pa[0]; if ( insideEdge(p1, edge) ) addPoint(cpa, count++, p1); const uint nPoints = pa.size(); for ( uint i = 1; i < nPoints; i++ ) { const QwtDoublePoint p2 = pa[(int)i]; if ( insideEdge(p2, edge) ) { if ( insideEdge(p1, edge) ) addPoint(cpa, count++, p2); else { addPoint(cpa, count++, intersectEdge(p1, p2, edge)); addPoint(cpa, count++, p2); } } else { if ( insideEdge(p1, edge) ) addPoint(cpa, count++, intersectEdge(p1, p2, edge)); } p1 = p2; } cpa.resize(count); }
/*! \brief Complete a polygon to be a closed polygon including the area between the original polygon and the baseline. \param xMap X map \param yMap Y map \param pa Polygon to be completed */ void QwtPlotCurve::closePolyline( const QwtScaleMap &xMap, const QwtScaleMap &yMap, QwtPolygonF &pa) const { const int sz = pa.size(); if ( sz < 2 ) return; pa.resize(sz + 2); if ( d_data->curveType == QwtPlotCurve::Xfy ) { pa[sz] = QPointF(xMap.transform(d_data->reference), pa[sz - 1].y()); pa[sz + 1] = QPointF(xMap.transform(d_data->reference), pa[0].y()); } else { pa[sz] = QPointF(pa[sz - 1].x(), yMap.transform(d_data->reference)); pa[pa.size() - 1] = QPointF(pa[0].x(), yMap.transform(d_data->reference)); } }
/*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { const QRect window = painter->window(); if ( window.isEmpty() ) return; const bool doFill = d_data->brush.style() != Qt::NoBrush; QwtPolygonF polyline; if ( doFill ) polyline.resize(to - from + 1); if ( to > from && d_data->paintAttributes & PaintFiltered ) { if ( doFill ) { QPointF pp( xMap.xTransform(x(from)), yMap.xTransform(y(from)) ); QwtPainter::drawPoint(painter, pp.x(), pp.y()); polyline[0] = pp; int count = 1; for (int i = from + 1; i <= to; i++) { const QPointF pi(xMap.xTransform(x(i)), yMap.xTransform(y(i))); if ( pi != pp ) { QwtPainter::drawPoint(painter, pi.x(), pi.y()); polyline[count] = pi; count++; pp = pi; } } if ( int(polyline.size()) != count ) polyline.resize(count); } else { // if we don't need to fill, we can sort out // duplicates independent from the order PrivateData::PixelMatrix pixelMatrix(window); for (int i = from; i <= to; i++) { const QPointF p( xMap.xTransform(x(i)), yMap.xTransform(y(i)) ); if ( pixelMatrix.testPixel(p.toPoint()) ) QwtPainter::drawPoint(painter, p.x(), p.y()); } } } else { for (int i = from; i <= to; i++) { const double xi = xMap.xTransform(x(i)); const double yi = yMap.xTransform(y(i)); QwtPainter::drawPoint(painter, xi, yi); if ( doFill ) polyline[i - from] = QPointF(xi, yi); } } if ( doFill ) { if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygonF(painter->window(), polyline); fillCurve(painter, xMap, yMap, polyline); } }
// modified by Ion Vasilief in order to use floating point coordinates void QwtPlotCurve::drawLines(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { int size = to - from + 1; if ( size <= 0 ) return; QwtPolygonF polyline; if ( ( d_data->attributes & Fitted ) && d_data->curveFitter ) { // Transform x and y values to window coordinates // to avoid a distinction between linear and // logarithmic scales. QPolygonF points(size); for (int i = from; i <= to; i++) { QwtDoublePoint &p = points[i]; p.setX( xMap.xTransform(x(i)) ); p.setY( yMap.xTransform(y(i)) ); } points = d_data->curveFitter->fitCurve(points); size = points.size(); if ( size == 0 ) return; // Round QwtDoublePoints to QPoints // When Qwt support for Qt3 has been dropped (Qwt 6.x) // we will use a doubles for painting and the following // step will be obsolete. polyline.resize(size); const QwtDoublePoint *p = points.data(); QPointF *pl = polyline.data(); if ( d_data->paintAttributes & PaintFiltered ) { QPointF pp(p[0].x(), p[0].y()); pl[0] = pp; int count = 1; for (int i = 1; i < size; i++) { const QPointF pi(p[i].x(), p[i].y()); if ( pi != pp ) { pl[count++] = pi; pp = pi; } } if ( count != size ) polyline.resize(count); } else { for ( int i = 0; i < size; i++ ) { pl[i].setX( p[i].x() ); pl[i].setY( p[i].y() ); } } } else { polyline.resize(size); if ( d_data->paintAttributes & PaintFiltered ) { QPointF pp( xMap.xTransform(x(from)), yMap.xTransform(y(from)) ); polyline[0] = pp; int count = 1; for (int i = from + 1; i <= to; i++) { const QPointF pi(xMap.xTransform(x(i)), yMap.xTransform(y(i))); if ( pi != pp ) { polyline[count] = pi; count++; pp = pi; } } if ( count != size ) polyline.resize(count); } else { for (int i = from; i <= to; i++) { const QPointF pi(xMap.xTransform(x(i)), yMap.xTransform(y(i))); polyline[i - from] = pi; } } } if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygonF(painter->window(), polyline); QwtPainter::drawPolyline(painter, polyline); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve(painter, xMap, yMap, polyline); }