【euclid】20 2D包围盒模块(box2d.rs)

box2d.rs文件定义了一个二维轴对齐矩形(Box2D),使用最小和最大坐标来表示。矩形在坐标类型(T)和单位(U)上是泛型的。代码提供了多种方法来操作和查询矩形,包括求交集、并集、平移、缩放等。

主要特性与方法:

  1. 表示方式:
  • 矩形由两个点表示:min(左下角)和 max(右上角)。

  • 这种表示方式比使用原点加大小的方式更高效,尤其是在计算交集和并集时,且不易溢出。

  1. 构造函数:
  • 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,原点为零。

  1. 属性:
  • is_negative():如果矩形面积为负(即 min.x > max.x 或 min.y > max.y),返回 true。

  • is_empty():如果矩形为空(面积为零、负面积或包含 NaN),返回 true。

  • size():返回矩形的尺寸(Size2D)。

  • width() 和 height():分别返回矩形的宽度和高度。

  1. 操作:
  • 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。

  1. 实用方法:
  • to_rect():将 Box2D 转换为 Rect(由原点坐标和大小表示)。

  • cast<NewT: NumCast>():将矩形转换为不同的数值类型。

  • round()、round_in()、round_out():以不同方式将矩形坐标四舍五入为整数值。

  1. Serde 和 Bytemuck 支持:
  • 如果启用了 serde 特性,该结构体可以通过 Serde 进行序列化和反序列化。

  • 如果启用了 bytemuck 特性,可以使用 bytemuck 进行零拷贝类型转换。

  1. 测试:
  • 代码包含全面的测试,确保实现的正确性。测试涵盖了交集、并集、平移、缩放等操作。

示例用法:

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 等领域中需要处理二维矩形的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuyuan77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值