当前位置: 首页 > news >正文

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

相关文章:

  • 《背影》再读:时光深处的温暖与感触
  • 深度学习框架中动态图和静态图是什么意思,如何通过keras和estmator实现?
  • Linux centos 7 vsftp本地部署脚本
  • 【软件架构论文范文:价值驱动的云原生架构在电商订单系统中的实践】
  • vue3 ts 请求封装后端接口
  • #C8# UVM中的factory机制 #S8.1.4# 约束的重载
  • Spring JDBC Template与事务管理:基于XML与注解的实战指南
  • 软件设计师-进制转换
  • 在 Linux 中使用 Vim 和 C++ 实现一个基本 Shell
  • C语言三大程序结构 单分支语句
  • 【开源宝藏】30天学会CSS - DAY6 第六课 流光文字动画
  • 组合模式 (Composite Pattern)
  • XSS-Labs 靶场 Level 0-10关卡 WriteUp
  • 第九章 | Solidity 设计模式与 Gas 优化实战
  • 生活电子常识-deepseek-r1本地化部署+ui界面搭建
  • 如何在百度搜索上删除与自己名字相关的资料
  • 一文详解Softmax与Sigmoid函数
  • 【MySQL】用户管理
  • 突破传统:探索函数命名的新视角
  • C语言-适配器模式详解与实践
  • 上海市税务局:收到对刘某某存在涉税问题的举报,正依法依规办理
  • “大型翻车现场”科技满满,黄骅打造现代化港口和沿海新城典范
  • 北京警方:海淀发生小客车刮碰行人事故4人受伤,肇事司机已被查获
  • 讲武谈兵|视距外的狙杀:从印巴空战谈谈超视距空战
  • 国务院办公厅印发《国务院2025年度立法工作计划》
  • 湛江霞山通报渔船火灾:起火船舶共8艘,无人员伤亡或被困