Question

J'ai un graphique fait dynamiquement avec un objet polyligne. Elle produit quelque chose d'intéressant, mais je voudrais ne conserver que les 10 dernières coordonnées et une fois que nous avons atteindre la 10ème position, tous les coordonnées se déplacerait vers la gauche par pixel X et la nouvelle valeur sera ajoutée à la fin.

Dans la fonction Ajouter de ma classe de dessin j'ai essayé ce genre de code:

        if (points.Count > 10)
        {
            myPolyline.Points.RemoveAt(0);

            foreach(Point p in myPolyline.Points)
            {
                p.X = p.X - 50;//Move all coord back to have a place for the new one
            }   
        }

Cela ne fonctionne pas parce que nous ne pouvons pas modifier une variable de la collection dans une boucle foreach. Quelle est la meilleure façon de le faire dans WPF / C #?

Plus d'infos

Je peux le faire en faisant ceci:

            for (int i = 0; i < this.myPolyline.Points.Count; i++)
            {
                this.myPolyline.Points[i] = new Point(this.myPolyline.Points[i].X - 50, this.myPolyline.Points[i].Y);
            }

Mais je voudrais un moyen plus propre de le faire sans avoir à créer un point objet temps très.

Était-ce utile?

La solution

Eh bien, la Point est un struct, de sorte que les frais généraux de la création de nouvelles ne devrait pas être mauvais. Faire ce qui suit ...

Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;

... serait vraiment pas différent, tout simplement parce que struct sont passés autour de la valeur.

Vous êtes un peu coincé avec une boucle de for et réaffectant à myPolyline.Points[i], compte tenu des circonstances:

  1. Vous devez modifier le Point avec une autre valeur X.
  2. Vous ne pouvez pas modifier la variable d'une boucle de foreach, vous devez donc utiliser une boucle de for.
  3. myPolyline.Points[i].X -= 50 ne fonctionnera pas à cause de la façon dont le struct Point est récupéré à partir du tableau et puis ne pas réaffecté automatiquement.

Si vous vouliez simplement déplacer l'ensemble PolyLine, j'aurais suggéré un LayoutTransform ou RenderTransform, mais vous vous déplacez un sous-ensemble de Points et ajoutera d'autres.

Modifier Si vous voulez vraiment factoriser cette opération, vous pouvez créer une méthode d'extension sur PointCollection pour la boucle de for et peaufinage point comme ceci:

static public void ChangePoints( this PointCollection pc, Vector v ) {
    for (int i = 0; i < pc.Count; i++ ) {
        pc[i] += v;
        // the above works on the indexer because you're doing an operation on the
        // Point rather than on one of the Point's members.
    }
}

Utilisation:

myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );

Il vous reste à changer les Points de la même manière, mais il est refactorisé ailleurs pour que l'utilisation est plus lisible. Et l'utilisation de Vector le rend plus lisible aussi.

Autres conseils

Déplacer toute la toile à gauche au lieu et d'augmenter le PointInsertion pour les nouveaux points tout le temps.

Si vous avez des tonnes d'articles ce sera aussi améliorer les performances de rendu (surtout si vous animez le mouvement).

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