график рассеяния, не учитывающий адаптивную выборку со стилем рассеяния ssDot - PullRequest
0 голосов
/ 09 декабря 2018

Для оценки производительности я строил одни и те же данные с QCPScatterStyle::ssCircle и QCPScatterStyle::ssDot, оба с отключенной адаптивной выборкой.График с ssCircle выглядит хорошо, и он немного ленив, но это было ожидаемо, в то время как график с ssDot быстрее, что также ожидалось, но график выглядит слишком тонким (не ожидаемым), и данные изменяютсяВнешний вид при изменении размера (не ожидается).

enter image description here

Правильные изображения после минимального изменения ширины.В верхней части используется ssDot, в нижней - ssCircle.Как видно, между двумя верхними графиками есть видимая разница.

Я что-то не так делаю, это ошибка или, возможно, это даже предполагаемое поведение?

Это использует QCustomPlot 2.0.1 с MSVC 2017 на Win10.

#include <random>

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>

#include <qcustomplot.h>

int
main( int argc, char *argv[] ) {
  QApplication app( argc, argv );
  QMainWindow wnd;

  auto *customPlot = new QCustomPlot();
  customPlot->addGraph();

  std::normal_distribution<> d{5, 2};
  std::random_device rd{};
  std::mt19937 gen{rd()};

  int const num = 100000;

  QVector<double> x0, y0;
  x0.resize( num );
  y0.resize( num );

  for( int n = 0; n < num; ++n ) {
    x0[n] = d( gen );
    y0[n] = d( gen );
  };

  customPlot->graph( 0 )->setScatterStyle(
      QCPScatterStyle( QCPScatterStyle::ssCircle, 1 ) );
  //      QCPScatterStyle( QCPScatterStyle::ssDot, 1 ) );
  customPlot->graph( 0 )->setLineStyle( QCPGraph::lsNone );
  customPlot->graph( 0 )->setAdaptiveSampling( false );
  customPlot->graph( 0 )->setData( x0, y0 );

  customPlot->xAxis->setRange( -5, 15.0 );
  customPlot->yAxis->setRange( -5, 15.0 );

  wnd.setCentralWidget( customPlot );
  wnd.resize( 400, 300 );
  wnd.show();

  return app.exec();
}

1 Ответ

0 голосов
/ 09 декабря 2018

Кажется, я выяснил причину проблемы.Для меня это выглядит как ошибка.Я изменил это, чтобы работать так, как я ожидаю, переключившись с drawLine на drawPoint

void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const
{
    ...
    case ssDot:
    {
      //painter->drawLine(QPointF(x, y), QPointF(x+0.0001, y));
      painter->drawPoint(QPointF(x, y));
      break;
    }
    ...
}
...