Bitfield.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "pch.h"
  2. #include "Bitfield.h"
  3. #include <QSlider>
  4. #include <QTimer>
  5. #include <QCursor>
  6. Bitfield::Bitfield(QWidget *parent)
  7. : SearchSpacePlott(parent)
  8. {
  9. setAxisLegend("Position", "#SetBits");
  10. }
  11. Bitfield::~Bitfield()
  12. {
  13. }
  14. void Bitfield::frameGraphInView()
  15. {
  16. setVisibleWindow(0, 1, 0, maxAmountOfSetBits);
  17. window.ZoomOut(0.05);
  18. update();
  19. }
  20. void Bitfield::drawData(QPainter& painter)
  21. {
  22. painter.setPen(Qt::lightGray);
  23. painter.setBrush(Qt::Dense4Pattern);
  24. painter.drawRect(this->getDisplayRect());
  25. painter.setPen(Qt::black);
  26. painter.setBrush(Qt::NoBrush);
  27. painter.fillRect(QRectF(transformGraphToView(QPointF(0, maxAmountOfSetBits)), transformGraphToView(QPointF(1, 0))), Qt::white);
  28. painter.drawRect(QRectF(transformGraphToView(QPointF(0, maxAmountOfSetBits)), transformGraphToView(QPointF(1, 0))));
  29. //Draw Dots
  30. QPen linePen;
  31. QRect graphDisplayRect = getDisplayRect();
  32. QPointF translation(graphDisplayRect.left(), graphDisplayRect.top());
  33. double stregth_factorX = graphDisplayRect.width() / std::abs(window.xMax - window.xMin);
  34. double stregth_factorY = graphDisplayRect.height() / std::abs(window.yMax - window.yMin);
  35. for (const GraphPlottSeries& graphSeries : seriesVec) {
  36. if (!graphSeries.data) {
  37. qDebug() << "Pointer to nothing pls help";
  38. continue;
  39. }
  40. if (graphSeries.data->empty() || graphSeries.hide) continue;
  41. linePen.setWidth(2);
  42. linePen.setColor(Qt::transparent);
  43. painter.setPen(linePen);
  44. for (auto data : *graphSeries.data) {
  45. if (data.orginalPoint->iteration < minIter) {
  46. continue;
  47. }
  48. if (data.orginalPoint->iteration > maxIter) {
  49. break;
  50. }
  51. QColor color = data.color;
  52. color.setAlphaF(this->transparentAlphaValue);
  53. linePen.setColor(Qt::transparent);
  54. painter.setPen(linePen);
  55. painter.setBrush(color);
  56. if (window.inBound(data.toQPointF())) {
  57. painter.drawEllipse(transformGraphToView(data.toQPointF(), stregth_factorX, stregth_factorY, translation), circleSize, circleSize);
  58. }
  59. }
  60. painter.setBrush(Qt::BrushStyle::NoBrush);
  61. }
  62. }
  63. void Bitfield::searchForPointUnderCursor()
  64. {
  65. //check if mouse stayed still
  66. QPoint globalPosition = QCursor::pos();
  67. QPointF pos = this->mapFromGlobal(globalPosition);
  68. if (pos != lastPosition){
  69. return;
  70. }
  71. if (seriesVec.empty() || seriesVec[0].data->empty()) {
  72. return;
  73. }
  74. QRect graphDisplayRect = getDisplayRect();
  75. QPointF translation(graphDisplayRect.left(), graphDisplayRect.top());
  76. double stregth_factorX = graphDisplayRect.width() / std::abs(window.xMax - window.xMin);
  77. double stregth_factorY = graphDisplayRect.height() / std::abs(window.yMax - window.yMin);
  78. const GraphDataPoint* min = &seriesVec[0].data->at(0);
  79. double minSqaredDistance = sqaredDistance(transformGraphToView(min->toQPointF(), stregth_factorX, stregth_factorY, translation), pos);
  80. std::vector<GraphPlottSeries>::iterator actualBestSeries = seriesVec.begin();
  81. for (auto seriesIter = seriesVec.begin(); seriesIter != seriesVec.end(); seriesIter++) {
  82. for (const GraphDataPoint& point : *seriesIter->data) {
  83. if (point.orginalPoint->iteration < minIter) {
  84. continue;
  85. }
  86. if (point.orginalPoint->iteration > maxIter) {
  87. break;
  88. }
  89. double distance = sqaredDistance(transformGraphToView(point.toQPointF(), stregth_factorX, stregth_factorY, translation), pos);
  90. if (distance < minSqaredDistance) {
  91. minSqaredDistance = distance;
  92. min = &point;
  93. actualBestSeries = seriesIter;
  94. }
  95. }
  96. }
  97. //if curser is radius + 3pixel away
  98. if (minSqaredDistance <= circleSize * circleSize + 9) {
  99. QPointF pointInWidget = transformGraphToView(min->toQPointF(), stregth_factorX, stregth_factorY, translation);
  100. QToolTip::showText(this->mapToGlobal(QPoint(pointInWidget.x(), pointInWidget.y())) - QPoint(0, 35), QString::fromStdString(min->orginalPoint->bitstringToStdString()));
  101. }
  102. }
  103. void Bitfield::addPointsInWindowToScratchPad(VisibleWindow& window)
  104. {
  105. if (!pad) {
  106. qDebug() << "NoPad";
  107. return;
  108. }
  109. for (auto seriesIter = seriesVec.begin(); seriesIter != seriesVec.end(); seriesIter++) {
  110. if (seriesIter->hide) continue;
  111. for (const GraphDataPoint& point : *seriesIter->data) {
  112. if (point.orginalPoint->iteration < minIter) {
  113. continue;
  114. }
  115. if (point.orginalPoint->iteration > maxIter) {
  116. break;
  117. }
  118. if (window.inBound(point.toQPointF()) && point.existLink()) {
  119. pad->addPoint(*point.orginalPoint);
  120. }
  121. }
  122. }
  123. }