#triangle #bresenham #rasterization #drawing #graphics

bresenham_zip

迭代器,用于同时执行三角形的两条边的Bresenham算法,以进行三角形光栅化

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

MIT/Apache

32KB
674

Crates.io docs.rs

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-2.0许可证的定义,将如上所述双重许可,无需任何额外条款或条件。

依赖关系

~190KB