7个版本
0.8.7 | 2022年10月4日 |
---|---|
0.8.3 | 2021年7月2日 |
0.8.2 | 2021年2月10日 |
0.8.1 | 2020年4月29日 |
0.1.0 | 2020年2月21日 |
#831 in 游戏开发
4,721 每月下载量
用于 14 个包 (5 个直接使用)
72KB
2K SLoC
bracket-geometry
此包为Point3D
、Rect
),支持函数和距离计算。它还包括Bresenham的线算法、向量线算法和Bresenham的圆算法。
它使用UltraViolet进行快速处理,并包括与原生UltraViolet类型的转换函数。
使用bracket-geometry
您可以通过在您的Cargo.toml
文件中添加以下内容来将其包含到您的项目中
[dependencies]
bracket-geometry = "~0.8"
Point2D
一个基本的2D(整数)点。您可以使用以下方式创建点
new
:使用任何与整数兼容的类型创建一个点(它将内部使用i32
,但使用TryFrom
)。zero
:一个(0,0)
点。from_tuple
:接受一个(i32, i32)
元组。
它还提供与其他类型的转换
to_index
用于简单的数组步进(使用bracket-algorithm-traits
包以获得更好的实现)。to_tuple
将转换为(i32, i32)
元组。to_unsigned_tuple
将转换为(usize, usize)
元组。to_vec2
将转换为UltraVioletVec2
。to_vec2i
将转换为UltraVioletVec2i
。
From
也为这些实现了。
Point3D
一个基本的3D(整数)点。您可以使用以下方式创建点
new
:从任何与整数兼容的类型(x/y/z)创建一个点。from_tuple
:从一个(i32,i32,i32)
元组创建一个点。
它还提供了转换到 UltraViolet 的 Vec3
和 Vec3i
类型。
矩形(《Rect》)
表示二维空间中的矩形。你可以通过以下方式创建矩形:
with_size
:提供 X/Y 和宽度/高度。with_exact
:提供所有四个坐标。zero
:一个为零的矩形。
它提供了一些辅助函数
intersect
- 这个矩形与另一个矩形相交吗?center
- 矩形的中心点。point_in_rect
- 一个点是否在矩形内(包括边缘)?for_each
- 对于矩形的每个点调用传递的 lambda/callback。point_set
- 返回矩形内所有点的HashSet
。width
和height
返回矩形的当前尺寸。
线绘图
线绘图使用 Bresenham 和矢量算法提供。你可以返回线上的点,作为一个 Point
对象的向量,或者一个迭代器。
例如,将线作为一个向量返回
use bracket_geometry::prelude::*;
let bresenham_line = line2d(LineAlg::Bresenham, Point::new(1,1), Point::new(5,5));
println!("{:?}", bresenham_line);
或者遍历点
use bracket_geometry::prelude::*;
for point in Bresenham::new(Point::new(1,1), Point::new(5,5)) {
println!("{:?}", point);
}
你可以将 LineAlg::Bresenham
替换为 LineAlg::Vector
来使用简单的基于矢量的投影(在某些系统上更快)。
圆绘图
还包括 Bresenham 的圆算法。例如
use bracket_geometry::prelude::*;
for point in BresenhamCircle::new(Point::new(10,10), 5) {
println!("{:?}", point);
}
距离启发式算法
提供了一套完整的距离算法
use bracket_geometry::prelude::*;
println!("{:?}", DistanceAlg::Pythagoras.distance2d(Point::new(0,0), Point::new(5,5)));
println!("{:?}", DistanceAlg::PythagorasSquared.distance2d(Point::new(0,0), Point::new(5,5)));
println!("{:?}", DistanceAlg::Manhattan.distance2d(Point::new(0,0), Point::new(5,5)));
println!("{:?}", DistanceAlg::Chebyshev.distance2d(Point::new(0,0), Point::new(5,5)));
功能标志
如果你启用 serde
,它提供通过 Serde
库对 Point
、Point3D
和 Rect
类型进行序列化和反序列化的支持。
示例
以下示例包括在内;它们使用 crossterm
打印到你的终端。使用 cargo run --example <name>
bresenham_circle
- 绘制一个圆。bresenham_line
- 绘制一条线。vector_line
- 使用不平滑角落的算法绘制一条线。distance
- 使用所有支持的算法计算两点之间的距离并输出。
依赖项
~2–20MB
~250K SLoC