2017-09-25 97 views
1

活塞的图形库提供了在两点之间绘制线条的功能,但是没有超过两点的功能。我如何有效地绘制通过许多点的路径,而不必为每个线段绘制线条?使用活塞高效地绘制路径

比方说,我有以下代码:

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; 
      } 
     }); 
    } 
} 

有没有办法把它弄成这个样子?

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); 
     }); 
    } 
} 

我被提到lyon库,但我不知道如何使用它与活塞。

+1

如何绘制一条路径而不绘制每个段?什么是你的循环效率低下? – interjay

+0

我正在寻找能够连续绘制所有分段而不必为每个单独分段发送绘图命令的内容。 –

回答

1

如何有效地绘制通过多个点的路径而不必为每个段绘制一条线?

我对活塞并不是非常熟悉,但是我会质疑你的假设,即line()有一些开销使得重复调用效率低下。最后,无论你画出很多线条还是绘制一个库函数,它们都会被绘制出来,并且在性能上应该没有太大的差别。

它看起来并不像现在有一种方法可以在点之间绘制一系列线条,但它应该只是一个循环遍历它们的问题,就像您已经在做的那样。使用Vec::windows是更好一点,虽然,因为你并不需要临时可变的变量:

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, 
     ); 
    } 
} 

你可能会考虑一个feature request或PR到活塞的项目。

+0

嗨,我已经提交[活塞图形问题](https://github.com/PistonDevelopers/graphics/issues/1089)。他们建议我使用里昂(看我的问题),但我还没有想出如何做到这一点。我已经像你所描述的那样在每一条紧密的循环中绘制每条线。当我开始绘制大约200行时会发生开销。我打算在未来吸引更多的人,所以我需要通过一条道路或其他途径来加速。 –

+0

@SunjayVarma我不认为你有这样一个观点:“最终,无论你画出很多线条还是图书馆功能吸引他们,他们都会被吸引,而且在表现上应该没有太大的差别。”是什么让你如此确信你正在经历的放缓是因为调用'line'的开销?你有分析过吗? – trentcl

+0

是的,我已经分析过它。这就是我所知道的。我只使用线路调用循环,只是执行,这会让我放下一帧,因为只要添加更多线条就需要花费时间。 –