#geometry #circle #distance #bresenham #gamedev #graphics

bracket-geometry

几何工具。矩形、线、圆、距离计算。Bracket-lib家族的一部分。

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 游戏开发

Download history 980/week @ 2024-03-13 1455/week @ 2024-03-20 1328/week @ 2024-03-27 1673/week @ 2024-04-03 1443/week @ 2024-04-10 1363/week @ 2024-04-17 1388/week @ 2024-04-24 1212/week @ 2024-05-01 1288/week @ 2024-05-08 1250/week @ 2024-05-15 1412/week @ 2024-05-22 1456/week @ 2024-05-29 1274/week @ 2024-06-05 974/week @ 2024-06-12 1130/week @ 2024-06-19 1111/week @ 2024-06-26

4,721 每月下载量
用于 14 个包 (5 个直接使用)

MIT 协议

72KB
2K SLoC

bracket-geometry

此包为PointPoint3DRect),支持函数和距离计算。它还包括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将转换为UltraViolet Vec2
  • to_vec2i将转换为UltraViolet Vec2i

From也为这些实现了。

Point3D

一个基本的3D(整数)点。您可以使用以下方式创建点

  • new:从任何与整数兼容的类型(x/y/z)创建一个点。
  • from_tuple:从一个 (i32,i32,i32) 元组创建一个点。

它还提供了转换到 UltraViolet 的 Vec3Vec3i 类型。

矩形(《Rect》)

表示二维空间中的矩形。你可以通过以下方式创建矩形:

  • with_size:提供 X/Y 和宽度/高度。
  • with_exact:提供所有四个坐标。
  • zero:一个为零的矩形。

它提供了一些辅助函数

  • intersect - 这个矩形与另一个矩形相交吗?
  • center - 矩形的中心点。
  • point_in_rect - 一个点是否在矩形内(包括边缘)?
  • for_each - 对于矩形的每个点调用传递的 lambda/callback。
  • point_set - 返回矩形内所有点的 HashSet
  • widthheight 返回矩形的当前尺寸。

线绘图

线绘图使用 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 库对 PointPoint3DRect 类型进行序列化和反序列化的支持。

示例

以下示例包括在内;它们使用 crossterm 打印到你的终端。使用 cargo run --example <name>

  • bresenham_circle - 绘制一个圆。
  • bresenham_line - 绘制一条线。
  • vector_line - 使用不平滑角落的算法绘制一条线。
  • distance - 使用所有支持的算法计算两点之间的距离并输出。

依赖项

~2–20MB
~250K SLoC