13 #include <QtGui/QApplication>
15 #include <QGraphicsView>
16 #include <QGraphicsScene>
19 #include <QGraphicsTextItem>
27 #ifndef UTILS_BAR_CODE_PERSISTENCE_H_
28 #define UTILS_BAR_CODE_PERSISTENCE_H_
30 class Bar_code_persistence {
32 typedef std::vector<std::pair<double, double>> Persistence;
33 Persistence persistence_vector;
38 Bar_code_persistence()
39 : min_birth(std::numeric_limits<double>::quiet_NaN()),
40 max_death(std::numeric_limits<double>::quiet_NaN()) { }
42 void insert(
double birth,
double death) {
43 persistence_vector.push_back(std::make_pair(birth, death));
44 if (std::isfinite(birth)) {
45 if ((birth < min_birth) || (std::isnan(min_birth)))
47 if ((birth > max_death) || (std::isnan(max_death)))
50 if (std::isfinite(death))
51 if ((death > max_death) || (std::isnan(max_death)))
55 void show(
const std::string& window_title) {
57 QGraphicsView * view =
new QGraphicsView();
58 QGraphicsScene * scene =
new QGraphicsScene();
59 view->setScene(scene);
60 double ratio = 600.0 / (max_death - min_birth);
63 double height = 0.0, birth = 0.0, death = 0.0;
65 for (
auto& persistence : persistence_vector) {
66 height = 5.0 * pers_num;
68 if (std::isfinite(persistence.first))
69 birth = ((persistence.first - min_birth) * ratio) + 50.0;
73 if (std::isfinite(persistence.second))
74 death = ((persistence.second - min_birth) * ratio) + 50.0;
78 scene->addLine(birth, height, death, height, QPen(Qt::blue, 2));
83 scene->addLine(0, height, 700.0, height, QPen(Qt::black, 1));
85 for (
double scale = 50.0; scale < 700.0; scale += 50.0) {
88 scene->addLine(scale, height - 3.0, scale, height + 3.0, QPen(Qt::black, 1));
90 QString scale_value = QString::number(((scale - 50.0) / ratio) + min_birth);
91 QGraphicsTextItem* dimText = scene->addText(scale_value, QFont(
"Helvetica", 8));
92 dimText->setPos(scale - (3.0 * scale_value.size()), height + 9.0 * (modulo % 2));
94 view->setWindowTitle(window_title.c_str());