rust
use crate::{Point, Rectangle, Vector};
use std::f32::consts::{FRAC_PI_2, PI};
use std::fmt::Display;
use std::ops::{Add, AddAssign, Div, Mul, RangeInclusive, Rem, Sub, SubAssign};
这段代码定义了两个用于表示角度的新类型包装结构体 :Degrees(度)和 Radians(弧度)。下面详细解释每个部分:
📦 导入部分
Point、Rectangle、Vector- 可能来自其他模块的几何图元FRAC_PI_2(π/2)和PI- 来自std::f32::consts的数学常数- 各种运算符 trait(
Add、Mul等)- 用于重载运算符 RangeInclusive- 用于定义范围Display- 用于字符串格式化
📐 Degrees 结构体
一个元组结构体 ,包装了一个 f32 来表示以度为单位的角度。
✨ 主要特性:
- 常量 :
RANGE定义了有效的度数值范围(0 到 360) - 转换 :可以从/转换为
f32、u8、f64和num_traits::FromPrimitive - 比较 :实现了与
Degrees和原始f32的部分相等和排序比较 - 运算 :实现了与
f32的乘法(角度缩放)
📐 Radians 结构体
一个元组结构体 ,包装了一个 f32 来表示以弧度为单位的角度。
✨ 主要特性:
- 常量 :
RANGE:0 到 2π(整个圆)PI:π 弧度(180 度)
🔍 几何方法:
rust
fn to_distance(&self, bounds: &Rectangle) -> (Point, Point)
- 计算从矩形中心出发、按此角度延伸到矩形边界的直线
- 用于绘制从中心到边缘、特定角度的射线/直线
- 使用带有正弦/余弦的向量数学来找到交点
🔄 转换:
- 从
Degrees到Radians(乘以 π/180) - 从/到
f32、u8、f64和num_traits::FromPrimitive的转换
➕ 运算符重载(针对 Radians):
Add、AddAssign、Sub、SubAssign- 基本算术运算Mul- 可以乘以两个弧度,或者弧度乘以 f32Div- 除法运算Rem- 余数/取模运算- 与
Degrees的混合运算(可以将度加到弧度上)
⚖️ 类型比较:
- 实现了与
Radians和原始f32的部分相等和排序比较
📝 显示:
- 格式化为
"X rad"的字符串输出
🎯 设计模式
这使用了新类型模式,目的是:
- 类型安全 - 防止意外混淆度和弧度
- 领域特定方法 - 添加角度相关的实用方法
- 控制运算 - 只允许有意义的数学运算
- 定制行为 - 实现与基础类型不同的行为
这段代码很可能是图形或几何库的一部分,在这些库中,精确的角度处理对于旋转、射线投射或形状操作等计算非常重要。