box2d.rs文件定义了一个二维轴对齐矩形(Box2D),使用最小和最大坐标来表示。矩形在坐标类型(T)和单位(U)上是泛型的。代码提供了多种方法来操作和查询矩形,包括求交集、并集、平移、缩放等。
主要特性与方法:
- 表示方式:
-
矩形由两个点表示:min(左下角)和 max(右上角)。
-
这种表示方式比使用原点加大小的方式更高效,尤其是在计算交集和并集时,且不易溢出。
- 构造函数:
-
new(min: Point2D<T, U>, max: Point2D<T, U>):通过两个点创建新的 Box2D。
-
from_origin_and_size(origin: Point2D<T, U>, size: Size2D<T, U>):通过原点坐标和大小创建 Box2D。
-
from_size(size: Size2D<T, U>):通过大小创建 Box2D,原点为零。
- 属性:
-
is_negative():如果矩形面积为负(即 min.x > max.x 或 min.y > max.y),返回 true。
-
is_empty():如果矩形为空(面积为零、负面积或包含 NaN),返回 true。
-
size():返回矩形的尺寸(Size2D)。
-
width() 和 height():分别返回矩形的宽度和高度。
- 操作:
-
intersection(other: &Self):计算两个矩形的交集,如果无交集则返回 None。
-
union(other: &Self):计算两个矩形的并集。
-
translate(by: Vector2D<T, U>):按向量平移矩形。
-
inflate(width: T, height: T):按指定值在每边扩展矩形。
-
contains(p: Point2D<T, U>):如果矩形包含点 p,返回 true。
-
contains_box(other: &Self):如果当前矩形包含另一个矩形的内部,返回 true。
- 实用方法:
-
to_rect():将 Box2D 转换为 Rect(由原点坐标和大小表示)。
-
cast<NewT: NumCast>():将矩形转换为不同的数值类型。
-
round()、round_in()、round_out():以不同方式将矩形坐标四舍五入为整数值。
- Serde 和 Bytemuck 支持:
-
如果启用了 serde 特性,该结构体可以通过 Serde 进行序列化和反序列化。
-
如果启用了 bytemuck 特性,可以使用 bytemuck 进行零拷贝类型转换。
- 测试:
- 代码包含全面的测试,确保实现的正确性。测试涵盖了交集、并集、平移、缩放等操作。
示例用法:
use euclid::default::{Box2D, Point2D, Size2D};fn main() {let box1 = Box2D::new(Point2D::new(0.0, 0.0), Point2D::new(10.0, 10.0));let box2 = Box2D::new(Point2D::new(5.0, 5.0), Point2D::new(15.0, 15.0));let intersection = box1.intersection(&box2).unwrap();println!("交集: {:?}", intersection);let union = box1.union(&box2);println!("并集: {:?}", union);let translated = box1.translate(Point2D::new(2.0, 3.0));println!("平移后: {:?}", translated);
}
总结:
Box2D 结构体是一个高效且通用的二维轴对齐矩形表示,提供了丰富的几何操作方法。它泛型化了坐标类型和单位,适用于图形、UI 等领域中需要处理二维矩形的场景。