Question

Je pense à l'aide wxMathPlot pour tracer / certaines données graphiquement arrive en permanence. Je veux dessiner / graphique « en temps réel » utiliser. Est-ce possible?

i.e.. Je ne veux pas seulement un graphique statique d'une seule fois lu d'un fichier - Je veux que les données de transmission en continu tracées et ont continué vers la droite du graphique - (et laisser le côté gauche tombent / défiler hors de la vue)

EDIT

Je n'ai pas encore obtenu une réponse pour cela. Il y a une classe intéressante dans la bibliothèque wxmathPlot appelé mpFXYVector mais qui apparaît juste pour dessiner une parcelle d'un vecteur de données. Ce que je veux est quelque chose qui peut être alimenté un flux et faire défiler le graphique horizontalement (et également redimensionner l'échelle si nécessaire)

Était-ce utile?

La solution

Je pense que mpFXYVector est le chemin à parcourir.

La façon la plus simple de traiter ce pourrait être d'écrire une classe wrapper pour mpFXYVector qui contient une mémoire tampon FIFO de points de données récentes. Chaque fois qu'un nouveau arrive du point de données, ajoutez-le à la mémoire tampon FIFO, qui chutera point le plus ancien, puis chargez mpFXYVector avec le tampon mis à jour. La mpWindow classe wxMathPlot s'occupera le reste de ce que vous avez besoin.

Une approche plus élégante serait une spécialisation de mpFXYVector qui met en oeuvre le tampon FIFO, en utilisant les vecteurs simples mpFXYVector. L'avantage de cette situation serait que vous tenez juste une copie des données d'affichage. À moins que vous affichiez plusieurs milliers de points, je doute l'avantage vaut la peine supplémentaire de héritant de mpFXYVector, plutôt que d'utiliser simplement l'mpFXYVector interface documentée.

Après avoir examiné les détails, le seul peu délicat est de remplacer mpFXYVector :: SetData () pour ajouter des points de données avec une nouvelle méthode Add () à leur arrivée. La nouvelle méthode doit gérer les vecteurs mpFXYVector comme tampons FIFO et de re-mettre en œuvre le code pour mettre à jour la zone de délimitation (qui, malheureusement, n'a pas été écrit avec l'héritage à l'esprit).

Le résultat est que la spécialisation donne une solution avec une plus petite exigence de mémoire et plus de flexibilité que l'utilisation d'une enveloppe.

Autres conseils

Merci Ravenspoint ... !! Je l'ai fait ce que vous avez dit .. Il fonctionne sans faille! voici ma fonction AddData ():

void mpFXYVector::AddData(float x, float y, std::vector<double> &xs, std::vector<double> &ys)
    {
        // Check if the data vectora are of the same size
        if (xs.size() != ys.size()) {
            wxLogError(_("wxMathPlot error: X and Y vector are not of the same length!"));
            return;
        }

        //Delete first point if you need a filo buffer (i dont need it)
        //xs.erase(xs.begin());
        //xy.erase(xy.begin());

        //Add new Data points at the end
        xs.push_back(x);
        ys.push_back(y);


        // Copy the data:
        m_xs = xs;
        m_ys = ys;

        // Update internal variables for the bounding box.
        if (xs.size()>0)
        {
            m_minX  = xs[0];
            m_maxX  = xs[0];
            m_minY  = ys[0];
            m_maxY  = ys[0];

            std::vector<double>::const_iterator  it;

            for (it=xs.begin();it!=xs.end();it++)
            {
                if (*it<m_minX) m_minX=*it;
                if (*it>m_maxX) m_maxX=*it;
            }
            for (it=ys.begin();it!=ys.end();it++)
            {
                if (*it<m_minY) m_minY=*it;
                if (*it>m_maxY) m_maxY=*it;
            }
            m_minX-=0.5f;
            m_minY-=0.5f;
            m_maxX+=0.5f;
            m_maxY+=0.5f;
        }
        else
        {
            m_minX  = -1;
            m_maxX  = 1;
            m_minY  = -1;
            m_maxY  = 1;
        }
    }

dans le Main () il suffit de:

m_Vector->AddData(xPos,yPos,vectorX, vectorY);
m_plot->Fit();

Je sais que c'est un vieux fil, mais je devais tracer un défilement axe X avec wxMathPlot.

Je l'ai fait une simple modification au code de jayjo pour faire fonctionner le défilement de l'axe X.

Je Hoe cette aide.

void mpFXYVector::AddData(float x, float y, std::vector<double> &xs, std::vector<double> &ys)
{
    // Check if the data vectora are of the same size
    if (xs.size() != ys.size()) {
        wxLogError(_("wxMathPlot error: X and Y vector are not of the same length!"));
        return;
    }

    //After a certain number of points implement a FIFO buffer
    //As plotting too many points can cause missing data
    if (x > 300)
    {
        xs.erase(xs.begin());
        ys.erase(ys.begin());
    }



    //Add new Data points at the end
    xs.push_back(x);
    ys.push_back(y);


    // Copy the data:
    m_xs = xs;
    m_ys = ys;

    // Update internal variables for the bounding box.
    if (xs.size()>0)
    {
        m_minX  = xs[0];
        m_maxX  = xs[0];
        m_minY  = ys[0];
        m_maxY  = ys[0];

        std::vector<double>::const_iterator  it;

        for (it=xs.begin();it!=xs.end();it++)
        {
            if (*it<m_minX) m_minX=*it;
            if (*it>m_maxX) m_maxX=*it;
        }
        for (it=ys.begin();it!=ys.end();it++)
        {
            if (*it<m_minY) m_minY=*it;
            if (*it>m_maxY) m_maxY=*it;
        }
        m_minX-=0.5f;
        m_minY-=0.5f;
        m_maxX+=0.5f;
        m_maxY+=0.5f;
    }
    else
    {
        m_minX  = -1;
        m_maxX  = 1;
        m_minY  = -1;
        m_maxY  = 1;
    }
}

Je n'ai aucune expérience personnelle avec wxMathPlot, mais je travaille avec wxWidgets depuis des années et recommande fortement pour la programmation cross plate-forme graphique en C ++, avec cela dit selon le noreferrer wxWiki Page graphiques Numerix Graphics Library peut être utilisé pour les données en temps réel alors peut-être que peut vous aider. Bonne chance.

Peut-être que quelqu'un aura le même problème et besoin ... je avais besoin de traçage très rapide pour montrer les données de l'oscilloscope. Je recevais les données en paquets. J'ai fait quelques changements qui ont fait un code beaucoup de plus rapide. La première chose est de changer l'état si la fonction SetData de if (xs.size()>0) à if (!xs.empty). Ensuite, vous devez d'abord ajouter tous vos paquets de données au vecteur

Vector1_X.push_back(x);
Vector1_Y.push_back(y);

Et après que vous devez monter et régler les données.

Vector1 ->SetData(Vector1_X,Vector1_Y); // add vectors to main vector
MathPlot1-> Fit(); //fit plot to the data
Vector1_X.clear(); //if you want to clear plot after every packet 
Vector1_Y.clear(); //you should use it

Votre code dans la fonction principale sera plus longue, mais la fonction sera plus rapide parce que vous ajoutez toutes les données « à la fois ».

Nous avons fini par utiliser ChartDirector à la place. Il a beaucoup de capacité et est rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top