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);
});
}
}
我被引用到lyon图书馆,但我不知道如何将它与活塞一起使用。
答案 0 :(得分:1)
如何有效地绘制通过多个点的路径,而不必为每个段绘制一条线?
我对Piston并不是很熟悉,但我会质疑你的假设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项目制作feature request或PR。