1

Piston 的图形库提供了在两点之间画一条线的功能,但最多只能画两条线。如何有效地绘制通过许多点的路径,而不必为每个段绘制一条线?

假设我有以下代码:

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

我被推荐到里昂图书馆,但我不知道如何将它与活塞一起使用。

4

1 回答 1

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

您可以考虑向 Piston 项目提出功能请求或 PR。

于 2017-09-26T14:58:43.483 回答