用于散点图的排序浮点矢量(C ++ / QCustomPlot)

时间:2018-04-09 20:12:34

标签: c++ qt qcustomplot

问题:

1 - 以相同的顺序对多个浮点矢量进行排序(保持对应)

2 - QCustomPlot(QCP)仅绘制散点图的外边界。

(回答这两个问题中的任何一个都可以解决我的问题)

情况:

我有3个用于绘图的向量:

std::vector<float> x, y;
std::vector<int> hits;

结果图是点击或未命中散点图。得到的图由QCustomPlot曲线使用,曲线最终为圆形&#34;涂鸦。&#34;它只需要看起来像一个没有&#34;涂鸦&#34;内。我需要这个情节覆盖另一个情节。

我无法控制xyhits的初始订单。

xy按传统网格索引进行排序:

x = -8, -8, -8, -8, -8,  -4, -4, -4, -4, -4, ... 8
y = -8, -4,  0,  4,  8,  -8, -4,  0,  4,  8, ... 8

hits是基于更好的(让我们只说弓箭手的箭头)根据快速目标的射程和速度成功命中(让我们说一下鸟)。

结果图是基于鸟类作为中心参考的命中外部。

数据向量可能非常大。

方法1:我可以计算范围和角度。然后对浮动向量进行排序:按顺序对角度进行排序,以便在QCustomPlot绘制外边界时不用“涂鸦”。内。但是,我需要知道如何保留相应的x&amp; y根据对angle的排序,将// Make range and angle vectors for sorting std::vector<float> range, angle; for(int i = 0; i < x.size(); ++i { float r = sqrt(x[i]*x[i] + y[i]*y[i]); range.push_back(r); float a = 0; if(y < 0) a = -acos(x[i]/r); else a = acos(x[i]/r); angle.push_back(a); } // Sort all vectors by ascending angle vector. /* Do stuff here! */ // Set up boundary plot data QVector<float> plot_x, plot_y; for(int i = 0; i < x.size(); ++i { if(hits[i]) { plot_x.push_back(x[i]); plot_y.push_back(y[i]); } } // curve is a QCPCurve object already existing. curve->addData(plot_x, plot_y); // Already sorted QVectors 值组合在一起。

QCustomPlot

方法2:curve->addData(x, y) hits成员仅绘制&#34;周边线&#34;散点图的QCPScatterStyle。我尝试过使用.setCustomPathpicture-url,但未成功。

提前谢谢! -John

1 个答案:

答案 0 :(得分:1)

如果你想使用某些标准订购几个向量,并且所有索引都对应创建一个新的向量作为索引,并对其进行排序,那么使用这些索引来创建新向量:

#include <cmath>
#include <QDebug>

static float calc_angle(float x, float y){
    float r = sqrt(x*x + y*y);
    float angle = acos(x/r);
    return  y<0 ? -angle : angle;
}

int main(int argc, char *argv[])
{
    std::vector<int> hits{0, 1, 2, 1, 0, 1, 2, 1, 0, 1};
    std::vector<float> x{-8, -8, -8, -8, -8,  -4, -4, -4, -4, -4};
    std::vector<float> y{-8, -4,  0,  4,  8,  -8, -4,  0,  4,  8};

    Q_ASSERT(x.size() == y.size() && y.size() == hits.size());
    std::vector<int> indexes(x.size());
    std::iota(indexes.begin(), indexes.end(), 0);

    std::sort(indexes.begin(), indexes.end(), [&](const int & i, const int & j) -> bool{
        return calc_angle(x[i], y[i]) < calc_angle(x[j], y[i]);
    });
    QVector<float> plot_x, plot_y;
    QVector<int> new_hits;
    for(const int & index : indexes){
        plot_x<<x[index];
        plot_y<<y[index];
        new_hits<<hits[index];
    }

    qDebug()<<indexes;
    qDebug()<< plot_x;
    qDebug()<<plot_y;
    qDebug()<<new_hits;

    return 0;//a.exec();
}

输出:

std::vector(8, 0, 1, 2, 3, 4, 5, 6, 7, 9)
QVector(-4, -8, -8, -8, -8, -8, -4, -4, -4, -4)
QVector(4, -8, -4, 0, 4, 8, -8, -4, 0, 8)
QVector(0, 0, 1, 2, 1, 0, 1, 2, 1, 1)