void DlgSettingsCurveProperties::drawLine (bool isRelation, const LineStyle &lineStyle) { const double Z_LINE = -1.0; // Looks nicer if line goes under the points, so points are unobscured // Line between points. Start with function connection QPainterPath path; QPointF p0 (POS_LEFT), p1 (POS_CENTER), p2 (POS_RIGHT); if (isRelation) { // Relation connection p1 = POS_RIGHT; p2 = POS_CENTER; } // Draw straight or smooth if (lineStyle.curveConnectAs() == CONNECT_AS_FUNCTION_SMOOTH || lineStyle.curveConnectAs() == CONNECT_AS_RELATION_SMOOTH) { vector<double> t; vector<SplinePair> xy; t.push_back(0); t.push_back(1); t.push_back(2); xy.push_back (SplinePair (p0.x(), p0.y())); xy.push_back (SplinePair (p1.x(), p1.y())); xy.push_back (SplinePair (p2.x(), p2.y())); Spline spline (t, xy); path.moveTo (p0); path.cubicTo (QPointF (spline.p1(0).x(), spline.p1(0).y()), QPointF (spline.p2(0).x(), spline.p2(0).y()), p1); path.cubicTo (QPointF (spline.p1(1).x(), spline.p1(1).y()), QPointF (spline.p2(1).x(), spline.p2(1).y()), p2); } else { path.moveTo (p0); path.lineTo (p1); path.lineTo (p2); } QGraphicsPathItem *line = new QGraphicsPathItem (path); line->setPen (QPen (QBrush (ColorPaletteToQColor (lineStyle.paletteColor())), lineStyle.width())); line->setZValue (Z_LINE); m_scenePreview->addItem (line); }
QPainterPath GraphicsLinesForCurve::drawLinesSmooth () { LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurve::drawLinesSmooth" << " curve=" << m_curveName.toLatin1().data(); QPainterPath path; // Prepare spline inputs. Note that the ordinal values may not start at 0 vector<double> t; vector<SplinePair> xy; OrdinalToGraphicsPoint::const_iterator itr; for (itr = m_graphicsPoints.begin(); itr != m_graphicsPoints.end(); itr++) { double ordinal = itr.key(); const GraphicsPoint *point = itr.value(); t.push_back (ordinal); xy.push_back (SplinePair (point->pos ().x(), point->pos ().y())); } // Spline through points Spline spline (t, xy); // Drawing from point i-1 to this point i uses the control points from point i-1 int segmentEndingAtPointI = 0; // Create QPainterPath through the points bool isFirst = true; for (itr = m_graphicsPoints.begin(); itr != m_graphicsPoints.end(); itr++) { const GraphicsPoint *point = itr.value(); if (isFirst) { isFirst = false; path.moveTo (point->pos()); } else { QPointF p1 (spline.p1 (segmentEndingAtPointI).x(), spline.p1 (segmentEndingAtPointI).y()); QPointF p2 (spline.p2 (segmentEndingAtPointI).x(), spline.p2 (segmentEndingAtPointI).y()); path.cubicTo (p1, p2, point->pos ()); ++segmentEndingAtPointI; } } return path; }
QPainterPath GraphicsLinesForCurve::drawLinesSmooth (const OrdinalToPointIdentifier &ordinalToPointIdentifier) { LOG4CPP_INFO_S ((*mainCat)) << "GraphicsLinesForCurve::drawLinesSmooth"; QPainterPath path; // Prepare spline inputs. Note that the ordinal values may not start at 0 vector<double> t; vector<SplinePair> xy; OrdinalToPointIdentifier::const_iterator itr; for (itr = ordinalToPointIdentifier.begin(); itr != ordinalToPointIdentifier.end(); itr++) { const QString pointIdentifier = itr.value(); const Point &point = m_graphicsPoints [pointIdentifier]; t.push_back (point.ordinal ()); xy.push_back (SplinePair (point.posScreen ().x(), point.posScreen ().y())); } // Spline through points Spline spline (t, xy); // Drawing from point i-1 to this point i uses the control points from point i-1 int segmentEndingAtPointI = 0; // Create QPainterPath through the points bool isFirst = true; for (itr = ordinalToPointIdentifier.begin(); itr != ordinalToPointIdentifier.end(); itr++) { const QString pointIdentifier = itr.value(); const Point &point = m_graphicsPoints [pointIdentifier]; if (isFirst) { isFirst = false; path.moveTo (point.posScreen()); } else { QPointF p1 (spline.p1 (segmentEndingAtPointI).x(), spline.p1 (segmentEndingAtPointI).y()); QPointF p2 (spline.p2 (segmentEndingAtPointI).x(), spline.p2 (segmentEndingAtPointI).y()); path.cubicTo (p1, p2, point.posScreen()); ++segmentEndingAtPointI; } } return path; }