3个版本 (1个稳定版)
1.0.0 | 2022年3月24日 |
---|---|
0.1.1 | 2022年3月10日 |
0.1.0 | 2022年3月4日 |
#1704 in 算法
每月44次下载
用于 2 crates
32KB
674 行
Bresenham::zip
此库提供了一个包装器,用于同时生成两条线,使用Bresenham线算法。这是使用Bresenham进行三角形光栅化的基本实现。包装器使用line_drawing crate的Bresenham算法。
提供的BresenhamZip迭代器将在指定的轴上同时提供相同值的两个点,同时符合最长可能的线。这样,每个元组都包含三角形内每条水平或垂直线的起始和结束点。
此crate在开发FerruX Canvas期间诞生,用于管理三角形填充函数的点的生成。
用法
使用构建器或辅助宏构建BresenhamZip。您需要指定要导航的轴和三角形的三个点。最后两个点必须根据您使用的BresenhamZip共享相同的X、Y或Z值。
然后使用您选择的方法迭代Zip。每次迭代将生成一个定义水平或垂直线起始和结束点的点对。
/// Rasterizes a 2D triangle with an horizontal base
for (left, right) in Builder::new().axis(bresenham_zip::Axis::Y)
.start_point((50, 50)).first_ending_point((0, 100)).second_ending_point((250, 100)).build()? {
draw_line(top, bottom); // draw_line is a figurative method, use one of your project
assert_eq!(left.1, right.1);
assert!((0..=50).contains(&left.0));
assert!((50..=250).contains(&right.0));
}
/// Rasterizes a 3D triangle using the helper macro
for (a, b) in build_zip!(3D:Z - (50, 50, 50) -> (0, 10, 200), (100, 250, 200))? {
println!("{:?} - {:?}", a, b);
assert_eq!(a.2, b.2);
assert!((0..=50).contains(&a.0));
assert!((10..=50).contains(&a.1));
assert!((50..=100).contains(&b.0));
assert!((50..=250).contains(&b.1));
}
许可证
根据您的选择,许可如下
- Apache License,版本2.0 (LICENSE-APACHE)
- MIT许可证 (LICENSE-MIT)
贡献
除非您明确表示,否则您提交的任何有意包含在作品中的贡献,根据Apache-2.0许可证的定义,将如上所述双重许可,无需任何额外条款或条件。
依赖关系
~190KB