#2d-graphics #svg #tessellation #graphics #2d

lyon

使用 libtess2 的 lyon 的附加路径网格生成器

9个版本 (破坏性更新)

0.17.1 2021年1月4日
0.16.0 2020年8月3日
0.15.0 2019年12月26日
0.14.0 2019年7月22日
0.10.0 2018年3月1日

#9 in #tessellation

每月下载量 38

MIT/Apache

1MB
30K SLoC

使用 libtess2 的替代填充网格生成器实现。

Lyon libtess2 包装器

此crate提供了一个作为 libtess2 C库包装器的替代路径填充网格生成器。

此crate的目的是提供对 lyon_tessellation::FillTessellator 在功能或健壮性方面不足的潜在情况的替代方案,并可以与之进行比较。

lyon_tessellation::FillTessellator 的比较

优势

  • 支持 NonZero 填充规则。
  • 当路径有很多非常接近的自交点时,对精度错误的鲁棒性更强。

劣势

  • 比 lyon_tessellation 的填充网格生成器慢约两倍。
  • 不支持计算顶点法线。
  • 包装在C库周围(而不是纯Rust,没有不安全代码)。

API

为了避免任何开销,此crate引入了 FlattenedPath 类型,该类型在内存布局中存储已平坦化的路径,该布局符合libtess2的预期。与 lyon_tessellation 中的网格生成器一样使用 GeometryBuilder,此网格生成器使用一个 GeometryReceiver 特性,该特性对应于libtess2公开其输出的方式。

示例

extern crate lyon_tess2 as tess2;
use tess2::{FillTessellator, FillOptions};
use tess2::math::{Point, point};
use tess2::path::Path;
use tess2::path::builder::*;
use tess2::geometry_builder::*;

fn main() {
    // Create a simple path.
    let mut path_builder = Path::builder();
    path_builder.begin(point(0.0, 0.0));
    path_builder.line_to(point(1.0, 2.0));
    path_builder.line_to(point(2.0, 0.0));
    path_builder.line_to(point(1.0, 1.0));
    path_builder.end(true);
    let path = path_builder.build();

    // Create the destination vertex and index buffers.
    let mut buffers: VertexBuffers<Point, u16> = VertexBuffers::new();

    {
        // Create the tessellator.
        let mut tessellator = FillTessellator::new();

        // Compute the tessellation.
        let result = tessellator.tessellate(
            &path,
            &FillOptions::default(),
            &mut BuffersBuilder::new(&mut buffers, Positions)
        );
        assert!(result.is_ok());
    }
    println!("The generated vertices are: {:?}.", &buffers.vertices[..]);
    println!("The generated indices are: {:?}.", &buffers.indices[..]);

}

依赖关系

~1.5MB
~35K SLoC