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 等領域中需要處理二維矩形的場景。