void MainWindow::genItemTracer() { resetPlot(); customPlot->addGraph(); QVector<double> x(50), y(50); for (int i=0; i<50; ++i) { x[i] = -0.4+1.8*i/49.0; y[i] = qSin(x[i]*M_PI*0.9)*0.4+0.4; } customPlot->graph()->setData(x, y); customPlot->graph()->setPen(QPen(Qt::red)); QCPItemTracer *tracer = new QCPItemTracer(customPlot); customPlot->addItem(tracer); tracer->setStyle(QCPItemTracer::tsCrosshair); tracer->setGraph(customPlot->graph()); tracer->setGraphKey(0.8); labelItemAnchors(tracer, 8, true, false); customPlot->savePng(dir.filePath("QCPItemTracer.png"), 230, 160); }
//----------------------------------------------------------------------------------------------- // Plots the case //----------------------------------------------------------------------------------------------- void Plot::addToPlot(Case *c, bool replot) { m_plotted_cases.push_back(c); // finding what to plot double value; double max_real_var = c->numberOfRealVariables(); double max_int_var = max_real_var + c->numberOfIntegerVariables(); double max_bin_var = max_int_var + c->numberOfBinaryVariables(); int index = p_series->itemData(p_series->currentIndex()).toInt(); if(index == 0) value = c->objectiveValue(); // objective else if(index <= max_real_var) // real variable { value = c->realVariableValue(index-1); } else if(index <= max_int_var) // int variable { value = c->integerVariableValue(index - max_real_var -1); } else if(index <= max_bin_var) // bin variable { value = c->binaryVariableValue(index - max_int_var -1); } else // constraint { value = c->constraintValue(index - max_bin_var -1); } // adding to plot m_custom_plot.graph(0)->addData(m_plotted_cases.size(), value); // adding point to graph 1 if infeasible if(!p_mainwindow->runner()->isFeasible(c)) m_custom_plot.graph(1)->addData(m_plotted_cases.size(), value); // x axis range if(m_cases.size() >= 5) m_custom_plot.xAxis->setRange(m_plotted_cases.size() - p_sld_xaxis->value(), m_plotted_cases.size() + 1); // y axis range if(m_plotted_cases.size() == 1) { m_min = value*0.9; m_max = value*1.1; } else { if(value < m_min) m_min = value; if(value > m_max) m_max = value; } double padding = (m_max - m_min)*0.1; m_custom_plot.yAxis->setRange(m_min - padding, m_max + padding); // adding tracer QCPItemTracer *tracer = new QCPItemTracer(&m_custom_plot); tracer->setGraph(m_custom_plot.graph(0)); tracer->setGraphKey(m_plotted_cases.size()); tracer->setStyle(QCPItemTracer::tsPlus); tracer->setSize(20); QPen pen(Qt::blue); pen.setWidth(0); pen.setStyle(Qt::NoPen); tracer->setPen(pen); QPen pen_sel(Qt::green); pen_sel.setWidth(1); tracer->setSelectedPen(pen_sel); tracer->setSelectable(true); m_custom_plot.addItem(tracer); // updating the slider max p_sld_xaxis->setMaximum(m_plotted_cases.size()); if(!m_user_changed_slider) p_sld_xaxis->setValue(m_plotted_cases.size()); else { if(m_plotted_cases.size() > 5) m_custom_plot.xAxis->setRange(m_plotted_cases.size() - p_sld_xaxis->value(), m_plotted_cases.size() + 1); // checking if the x-axis tick step must change if(p_sld_xaxis->value() > 10) { int tick = p_sld_xaxis->value() / 10; m_custom_plot.xAxis->setTickStep(tick); } if(replot) m_custom_plot.replot(); } // m_custom_plot.replot(); }
void MainWindow::setupItemTracerTest(QCustomPlot *customPlot) { QCPItemTracer *tracer1 = new QCPItemTracer(customPlot); customPlot->addItem(tracer1); tracer1->position->setCoords(1, 3); tracer1->setStyle(QCPItemTracer::tsCircle); tracer1->setSize(20); QCPItemTracer *tracer2 = new QCPItemTracer(customPlot); customPlot->addItem(tracer2); tracer2->position->setCoords(2, 2.5); tracer2->setStyle(QCPItemTracer::tsCrosshair); QCPItemTracer *tracer3 = new QCPItemTracer(customPlot); customPlot->addItem(tracer3); tracer3->position->setCoords(3, 2); tracer3->setStyle(QCPItemTracer::tsPlus); tracer3->setSize(20); QCPItemTracer *tracer4 = new QCPItemTracer(customPlot); customPlot->addItem(tracer4); tracer4->position->setCoords(4, 1.5); tracer4->setStyle(QCPItemTracer::tsSquare); tracer4->setSize(20); QCPGraph *graph = customPlot->addGraph(); int n = 20; QVector<double> x(n), y(n); for (int i=0; i<n; ++i) { x[i] = 0.5+i/(double)n*4; y[i] = qSin(x[i])+1.5; } graph->setData(x, y); QCPItemTracer *graphTracer = new QCPItemTracer(customPlot); customPlot->addItem(graphTracer); graphTracer->setGraph(graph); graphTracer->setGraphKey(2.3); graphTracer->setStyle(QCPItemTracer::tsNone); graphTracer->setInterpolating(true); tracerTestTracer = graphTracer; connect(customPlot, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(tracerTestMouseMove(QMouseEvent*))); graphTracer->setStyle(QCPItemTracer::tsSquare); QCPItemText *text = new QCPItemText(customPlot); customPlot->addItem(text); text->setText("Tracer"); text->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter); text->position->setType(QCPItemPosition::ptAxisRectRatio); text->position->setCoords(0.5, 0.05); text->setPen(QPen()); QCPItemCurve *curve = new QCPItemCurve(customPlot); customPlot->addItem(curve); curve->start->setParentAnchor(text->bottom); curve->startDir->setParentAnchor(curve->start); curve->startDir->setCoords(0, 100); curve->end->setParentAnchor(tracerTestTracer->position); curve->end->setCoords(0, -5); curve->endDir->setParentAnchor(curve->end); curve->endDir->setCoords(0, -100); curve->setHead(QCPLineEnding::esSpikeArrow); }