gpt4 book ai didi

rust - 使用 Piston 有效绘制路径

转载 作者:行者123 更新时间:2023-11-29 08:18:39 25 4
gpt4 key购买 nike

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库,但我不知道如何将它与 Piston 一起使用。

最佳答案

How do I efficiently draw a path through many points without having to draw a line for every segment?

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

您可以考虑制作一个 feature request或 Piston 项目的 PR。

关于rust - 使用 Piston 有效绘制路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46397847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com