2017-09-25 1 views
1

La bibliothèque graphique de Piston offre une fonction permettant de tracer une ligne entre deux points, mais rien pour plus de deux. Comment puis-je dessiner efficacement un chemin à travers plusieurs points sans devoir tracer une ligne pour chaque segment?Dessiner efficacement des trajectoires à l'aide d'un piston

Disons que j'ai le code suivant:

extern crate piston_window; 

use piston_window::*; 

fn main() { 
    let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480]) 
     .exit_on_esc(true).build().unwrap(); 
    while let Some(e) = window.next() { 
     window.draw_2d(&e, |c, g| { 
      clear([1.0; 4], g); 
      let points = [ 
       [100., 100.], 
       [200., 200.], 
       [150., 350.], 
       //... 
      ]; 

      let mut prev = points[0]; 
      for pt in points[1..].iter() { 
       line([0., 0., 0., 255.], 1., [ 
        prev[0], prev[1], pt[0], pt[1] 
       ], c.transform, g); 
       prev = *pt; 
      } 
     }); 
    } 
} 

Est-il possible de le transformer en quelque chose comme ça?

extern crate piston_window; 

use piston_window::*; 

fn main() { 
    let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480]) 
     .exit_on_esc(true).build().unwrap(); 
    while let Some(e) = window.next() { 
     window.draw_2d(&e, |c, g| { 
      clear([1.0; 4], g); 
      let points = [ 
       [100., 100.], 
       [200., 200.], 
       [150., 350.], 
       //... 
      ]; 
      path([0., 0., 0., 255.], 1., &points, c.transform, g); 
     }); 
    } 
} 

m'a renvoyé à la bibliothèque lyon mais je ne sais pas comment l'utiliser avec le piston.

+1

Comment pouvez-vous dessiner un tracé sans dessiner chaque segment? Et qu'est-ce qui est inefficace dans votre boucle for? – interjay

+0

Je cherche quelque chose qui dessinerait tous les segments en continu sans avoir à envoyer une commande de dessin pour chaque segment individuel. –

Répondre

1

Comment dessiner efficacement un chemin à travers plusieurs points sans avoir à dessiner une ligne pour chaque segment?

Je ne suis pas extrêmement familier avec piston, mais je voudrais remettre en question votre hypothèse que line() a certains frais généraux qui le rend inefficace pour appeler à plusieurs reprises. En fin de compte, si vous dessinez beaucoup de lignes ou une fonction de bibliothèque les attire, ils seront attirés et il ne devrait pas y avoir beaucoup de différence dans les performances.

Il ne semble pas qu'il existe actuellement une méthode pour dessiner une séquence de lignes entre les points, mais il devrait juste s'agir de les boucler comme vous le faisiez déjà. L'utilisation Vec::windows est un peu plus agréable cependant, que vous ne avez pas besoin de variables mutables temporaires:

pub fn path<G>(color: Color, radius: Radius, points: &[[Scalar; 2]], transform: Matrix2d, g: &mut G) 
where 
    G: Graphics, 
{ 
    for w in points.windows(2) { 
     line(
      color, 
      radius, 
      [w[0][0], w[0][1], w[1][0], w[1][1]], 
      transform, 
      g, 
     ); 
    } 
} 

Vous pourriez envisager de faire un feature request ou un PR au projet de piston.

+0

Salut, j'ai déjà déposé [un problème sur les graphiques de piston] (https://github.com/PistonDevelopers/graphics/issues/1089). Ils m'ont recommandé d'utiliser lyon (voir ma question) mais je n'ai pas encore compris comment le faire. Je dessine déjà chaque ligne dans une boucle serrée comme vous l'avez décrit. La surcharge se produit lorsque je commence à dessiner environ 200 lignes. J'ai l'intention de dessiner encore plus à l'avenir, donc je dois accélérer cela avec un chemin ou quelque chose d'autre. –

+0

@SunjayVarma Je ne pense pas que vous ayez le point de "En fin de compte, si vous dessinez beaucoup de lignes ou si une fonction de bibliothèque les dessine, elles seront dessinées et il ne devrait pas y avoir beaucoup de différence de performance." Qu'est-ce qui vous rend si sûr que le ralentissement que vous rencontrez est dû à la surcharge de l'appel 'line'? L'avez-vous profilé? – trentcl

+0

Oui, je l'ai profilé. C'est comme ça que je sais. J'ai chronométré seulement la boucle avec les appels de ligne et juste l'exécution qui me fera tomber une image parce que cela prend tant que j'ajoute plus de lignes. –