Rust赋能智能土木工程革新
基于Rust语言在智能土木工程领域
以下是基于Rust语言在智能土木工程领域的应用实例,涵盖结构分析、传感器数据处理、自动化施工等多个方向。每个例子均结合了Rust的高性能、安全性和并发特性。
结构健康监测系统
使用Rust处理传感器数据流,实时监测桥梁或建筑物的振动频率、位移等参数。通过FFI调用C库(如OpenSees)进行有限元分析,结果通过WebSocket实时推送至监控端。
// 示例:振动频率分析
use ndarray::Array1;
fn calculate_frequency(sensor_data: &[f64]) -> f64 {let window = hanning_window(sensor_data.len());let fft_result = rfft(&(sensor_data * window));argmax(&fft_result.mapv(|x| x.norm())) as f64 * SAMPLING_RATE / N_FFT
}
混凝土强度预测模型
训练机器学习模型(如XGBoost或线性回归)预测混凝土28天抗压强度。利用Rust的Linfa库处理数据集,特征包括水灰比、骨料类型、养护温度等。
// 示例:线性回归训练
use linfa::traits::Fit;
use linfa_linear::LinearRegression;
let model = LinearRegression::default().fit(&dataset)?;
施工机器人路径规划
基于A或RRT算法实现自动化施工机械的路径规划。使用Rust的rayon库并行计算碰撞检测,输出G代码控制机械臂运动。
// 示例:A*算法实现
fn astar(start: Node, goal: Node) -> Vec<Node> {let mut open_set = BinaryHeap::new();open_set.push(start.with_cost(heuristic(start, goal)));// ... 展开节点
}
地质雷达数据解析
解析GPR(Ground Penetrating Radar)采集的二进制数据,识别地下管线或空洞。使用nom库处理自定义协议,OpenCV-Rust进行图像重建。
// 示例:GPR数据解析
named!(parse_gpr_header<&[u8], GprHeader>, do_parse!(magic: le_u32 >>version: le_u16 >>// ...其他字段)
);
BIM模型轻量化转换
开发BIM模型(如IFC格式)到WebGL轻量化格式的转换工具。使用ifc-rs解析IFC文件,wgpu库生成GLTF输出。
// 示例:IFC墙体提取
if let Entity::IfcWall(wall) = entity {let geometry = wall.geometry(&loader)?;meshes.push(geometry.to_triangle_mesh());
}
无人机航测点云处理
处理LiDAR点云数据,通过Rust-PCL绑定实现地面滤波、建筑物提取。使用KDTree加速最近邻搜索。
// 示例:地面点滤波
let mut filter = StatisticalOutlierRemoval::new();
filter.set_mean_k(50);
filter.set_std_dev_mul_thresh(1.0);
filter.filter(&mut cloud);
有限元并行计算框架
基于MPI或Rayon开发并行有限元求解器,支持分布式内存计算。使用sparse矩阵存储刚度矩阵,BLAS加速运算。
// 示例:刚度矩阵组装
parallel_for_each(element, |e| {let ke = e.stiffness_matrix();assembler.add(ke, e.global_dofs());
});
智能交通流量预测
分析道路传感器历史数据,使用LSTM网络预测未来15分钟流量。Tch-rs调用PyTorch后端训练模型。
// 示例:LSTM模型定义
let lstm = nn::LSTM::new(input_dim, hidden_dim, layers, Default::default());
let output = lstm.seq(&input)?;
钢结构节点优化设计
采用遗传算法优化钢结构节点连接方案。使用rand库生成种群,目标函数评估应力集中系数。
// 示例:适应度函数
fn fitness(design: &Design) -> f64 {let stress = fea_analyze(design);1.0 / (max_stress(stress) + 0.1 * design.material_cost())
}
智能基坑监测预警
整合倾角仪、测斜管数据,通过Kalman滤波预测基坑变形趋势。当位移超阈值时触发短信报警(通过Twilio API)。
// 示例:Kalman滤波更新
fn update(&mut self, measurement: f64) {self.predicted = self.state * self.transition;let residual = measurement - self.predicted;self.state = self.predicted + self.gain * residual;
}
基于 Rust geo-types
库的实例
以下是基于 Rust geo-types
库的实用示例,涵盖常见几何操作和功能实现:
创建基本几何对象
use geo_types::{Point, LineString, Polygon};// 创建点
let point = Point::new(1.0, 2.0);// 创建线
let line = LineString::from(vec![(0.0, 0.0), (1.0, 1.0), (2.0, 0.0)]);// 创建多边形(带孔洞)
let exterior = LineString::from(vec![(0.0, 0.0), (4.0, 0.0), (4.0, 4.0), (0.0, 4.0), (0.0, 0.0)]);
let interiors = vec![LineString::from(vec![(1.0, 1.0), (3.0, 1.0), (3.0, 3.0), (1.0, 3.0), (1.0, 1.0)])];
let polygon = Polygon::new(exterior, interiors);
几何计算
use geo_types::Point;
use geo::algorithm::euclidean_distance::EuclideanDistance;// 计算两点距离
let p1 = Point::new(0.0, 0.0);
let p2 = Point::new(3.0, 4.0);
let distance = p1.euclidean_distance(&p2); // 5.0
几何变换
use geo_types::Point;
use geo::algorithm::affine_ops::AffineTransform;// 平移点
let point = Point::new(1.0, 2.0);
let translated = point.affine_transform(&geo::AffineOps::translate(2.0, 3.0));
几何关系判断
use geo_types::{Point, Polygon};
use geo::algorithm::contains::Contains;// 判断点是否在多边形内
let polygon = Polygon::new(LineString::from(vec![(0.0, 0.0), (4.0, 0.0), (4.0, 4.0), (0.0, 4.0), (0.0, 0.0)]), vec![]);
let point = Point::new(2.0, 2.0);
let is_inside = polygon.contains(&point); // true
集合操作
use geo_types::{Polygon, LineString};
use geo::algorithm::boolean_ops::BooleanOps;// 多边形交集
let poly1 = Polygon::new(LineString::from(vec![(0.0, 0.0), (2.0, 0.0), (2.0, 2.0), (0.0, 2.0), (0.0, 0.0)]), vec![]);
let poly2 = Polygon::new(LineString::from(vec![(1.0, 1.0), (3.0, 1.0), (3.0, 3.0), (1.0, 3.0), (1.0, 1.0)]), vec![]);
let intersection = poly1.intersection(&poly2);
几何序列化
use geo_types::Point;
use serde_json;// 序列化为JSON
let point = Point::new(1.0, 2.0);
let json = serde_json::to_string(&point).unwrap(); // {"type":"Point","coordinates":[1.0,2.0]}
几何算法
use geo_types::LineString;
use geo::algorithm::simplify::Simplify;// 简化线
let line = LineString::from(vec![(0.0, 0.0), (1.0, 0.1), (2.0, -0.1), (3.0, 5.0)]);
let simplified = line.simplify(&1.0);
多边形面积计算原理
多边形面积计算公式基于鞋带公式(Shoelace Formula),适用于简单多边形(不自交)。对于顶点按顺时针或逆时针顺序排列的多边形,公式如下:
[ \text{Area} = \frac{1}{2} \left| \sum_{i=1}^{n} (x_i y_{i+1} - x_{i+1} y_i) \right| ]
其中,( x_{n+1} = x_1 ) 且 ( y_{n+1} = y_1 )。
Rust 实现代码框架
fn polygon_area(vertices: &[(f64, f64)]) -> f64 {let mut area = 0.0;let n = vertices.len();for i in 0..n {let j = (i + 1) % n;area += vertices[i].0 * vertices[j].1;area -= vertices[j].0 * vertices[i].1;}area.abs() / 2.0
}
以下是一些基于Rust计算最小外接矩形的实例代码和实现方法,涵盖不同场景和库的使用。
使用 geo
库计算最小外接矩形
geo
是Rust中处理地理空间数据的常用库,支持最小外接矩形(Minimum Bounding Rectangle, MBR)的计算。
use geo::algorithm::bounding_rect::BoundingRect;
use geo::{LineString, Point};fn main() {let points = vec![Point::new(0.0, 0.0),Point::new(1.0, 1.0),Point::new(2.0, 0.0),Point::new(1.0, -1.0),];let line_string = LineString::from(points);let mbr = line_string.bounding_rect().unwrap();println!("Min: {:?}", mbr.min());println!("Max: {:?}", mbr.max());
}
使用 nalgebra
库计算点集的最小外接矩形
nalgebra
是一个线性代数库,适合处理几何变换和点集的最小外接矩形计算。
use nalgebra::Point2;
use std::f32::{INFINITY, NEG_INFINITY};fn main() {let points = vec![Point2::new(0.0, 0.0),Point2::new(1.0, 1.0),Point2::new(2.0, 0.0),Point2::new(1.0, -1.0),];let (mut min_x, mut min_y) = (INFINITY, INFINITY);let (mut max_x, mut max_y) = (NEG_INFINITY, NEG_INFINITY);for point in points {min_x = min_x.min(point.x);min_y = min_y.min(point.y);max_x = max_x.max(point.x);max_y = max_y.max(point.y);}println!("Min: ({}, {})", min_x, min_y);println!("Max: ({}, {})", max_x, max_y);
}
使用 cgmath
库计算3D点集的最小外接矩形
cgmath
适用于3D几何计算,以下是一个3D点集的最小外接矩形示例。
use cgmath::Point3;
use std::f32::{INFINITY, NEG_INFINITY};fn main() {let points = vec![Point3::new(0.0, 0.0, 0.0),Point3::new(1.0, 1.0, 1.0),Point3::new(2.0, 0.0, -1.0),];let (mut min_x, mut min_y, mut min_z) = (INFINITY, INFINITY, INFINITY);let (mut max_x, mut max_y, mut max_z) = (NEG_INFINITY, NEG_INFINITY, NEG_INFINITY);for point in points {min_x = min_x.min(point.x);min_y = min_y.min(point.y);min_z = min_z.min(point.z);max_x = max_x.max(point.x);max_y = max_y.max(point.y);max_z = max_z.max(point.z);}println!("Min: ({}, {}, {})", min_x, min_y, min_z);println!("Max: ({}, {}, {})", max_x, max_y, max_z);
}
使用 rstar
库进行空间索引和最小外接矩形计算
rstar
是一个R-tree实现库,适合高效计算空间数据的最小外接矩形。
use rstar::{RTree, AABB};
use rstar::primitives::PointWithData;fn main() {let points = vec![PointWithData::new((0.0, 0.0), 1),PointWithData::new((1.0, 1.0), 2),PointWithData::new((2.0, 0.0), 3),];let tree = RTree::bulk_load(points);let mbr = tree.root().envelope();println!("MBR Min: {:?}", mbr.lower());println!("MBR Max: {:?}", mbr.upper());
}
使用 imageproc
计算图像中轮廓的最小外接矩形
imageproc
是图像处理库,可用于计算图像中轮廓的最小外接矩形。
use imageproc::contours::find_contours;
use imageproc::rect::Rect;
use image::{GrayImage, Luma};fn main() {let mut image = GrayImage::new(100, 100);image.put_pixel(10, 10, Luma([255]));image.put_pixel(20, 20, Luma([255]));let contours = find_contours::<u8>(&image);for contour in contours {let points: Vec<_> = contour.points.iter().map(|p| (p.x as f32, p.y as f32)).collect();let mbr = Rect::at_bounding_rect(&points).unwrap();println!("MBR: {:?}", mbr);}
}
使用 lyon
计算路径的最小外接矩形
lyon
是一个2D图形库,支持路径的最小外接矩形计算。
use lyon::math::point;
use lyon::path::Path;
use lyon::algorithms::aabb::bounding_rect;fn main() {let mut builder = Path::builder();builder.begin(point(0.0, 0.0));builder.line_to(point(1.0, 1.0));builder.line_to(point(2.0, 0.0));builder.close();let path = builder.build();let mbr = bounding_rect(&path);println!("MBR: {:?}", mbr);
}
使用 vek
计算点集的最小外接矩形
vek
是一个向量和矩阵库,适合高效计算几何图形的最小外接矩形。
use vek::Vec2;fn main() {let points = vec![Vec2::new(0.0, 0.0),Vec2::new(1.0, 1.0),Vec2::new(2.0, 0.0),];let min = points.iter().fold(Vec2::broadcast(f32::INFINITY), |a, &b| a.min(b));let max = points.iter().fold(Vec2::broadcast(f32::NEG_INFINITY), |a, &b| a.max(b));println!("Min: {:?}", min);println!("Max: {:?}", max);
}
使用 ordered-float
处理浮点数的边界情况
在计算最小外接矩形时,浮点数的比较可能存在问题,ordered-float
可以解决这一问题。
use ordered_float::OrderedFloat;
use std::f32::{INFINITY, NEG_INFINITY};fn main() {let points = vec![(OrderedFloat(0.0), OrderedFloat(0.0)),(OrderedFloat(1.0), OrderedFloat(1.0)),(OrderedFloat(2.0), OrderedFloat(0.0)),];let (min_x, min_y) = points.iter().fold((OrderedFloat(INFINITY), OrderedFloat(INFINITY)),|(a, b), &(x, y)| (a.min(x), b.min(y)),);let (max_x, max_y) = points.iter().fold((OrderedFloat(NEG_INFINITY), OrderedFloat(NEG_INFINITY)),|(a, b), &(x, y)| (a.max(x), b.max(y)),);println!("Min: ({}, {})", min_x, min_y);println!("Max: ({}, {})", max_x, max_y);
}
使用 rayon
并行计算点集的最小外接矩形
对于大规模点集,可以使用 rayon
进行并行计算以提高性能。
use rayon::prelude::*;
use std::f32::{INFINITY, NEG_INFINITY};fn main() {let points = vec![(0.0, 0.0),(1.0, 1.0),(2.0, 0.0),];let (min_x, min_y) = points.par_iter().fold(|| (INFINITY, INFINITY),|(a, b), &(x, y)| (a.min(x), b.min(y)),).reduce(|| (INFINITY, INFINITY),|(a, b), (c, d)| (a.min(c), b.min(d)),);let (max_x, max_y) = points.par_iter().fold(|| (NEG_INFINITY, NEG_INFINITY),|(a, b), &(x, y)| (a.max(x), b.max(y)),).reduce(|| (NEG_INFINITY, NEG_INFINITY),|(a, b), (c, d)| (a.max(c), b.max(d)),);println!("Min: ({}, {})", min_x, min_y);println!("Max: ({}, {})", max_x, max_y);
}
以上示例涵盖了不同场景和库的使用,包括2D/3D点集、图像处理、并行计算等。根据具体需求选择合适的库和方法即可。
30个多边形实例
示例1-10:规则多边形
-
三角形:
[(0.0, 0.0), (4.0, 0.0), (0.0, 3.0)]
面积:6.0(直角边4和3)。 -
正方形:
[(0.0, 0.0), (2.0, 0.0), (2.0, 2.0), (0.0, 2.0)]
面积:4.0。 -
五边形:
[(0.0, 0.0), (2.0, 0.0), (3.0, 1.5), (2.0, 3.0), (0.0, 3.0)]
面积:6.75。 -
六边形:
[(0.0, 0.0), (1.0, 0.0), (1.5, 0.87), (1.0, 1.73), (0.0, 1.73), (-0.5, 0.87)]
面积:2.598(正六边形边长1)。 -
矩形:
[(0.0, 0.0), (5.0, 0.0), (5.0, 2.0), (0.0, 2.0)]
面积:10.0。 -
平行四边形:
[(0.0, 0.0), (4.0, 0.0), (5.0, 2.0), (1.0, 2.0)]
面积:8.0。 -
梯形:
[(0.0, 0.0), (4.0, 0.0), (3.0, 2.0), (1.0, 2.0)]
面积:6.0。 -
菱形:
[(0.0, 0.0), (2.0, 1.0), (0.0, 2.0), (-2.0, 1.0)]
面积:4.0。 -
凹多边形:
[(0.0, 0.0), (3.0, 0.0), (1.5, 1.5), (3.0, 3.0), (0.0, 3.0)]
面积:4.5。 -
星形:
[(0.0, 0.0), (1.0, 2.0), (3.0, 2.0), (1.0, 4.0), (2.0, 6.0), (0.0, 5.0), (-2.0, 6.0), (-1.0, 4.0), (-3.0, 2.0), (-1.0, 2.0)]
面积:12.0。
示例11-20:不规则多边形
-
L形:
[(0.0, 0.0), (2.0, 0.0), (2.0, 1.0), (1.0, 1.0), (1.0, 2.0), (0.0, 2.0)]
面积:3.0。 -
T形:
[(0.0, 0.0), (3.0, 0.0), (3.0, 1.0), (2.0, 1.0), (2.0, 3.0), (1.0, 3.0), (1.0, 1.0), (0.0, 1.0)]
面积:5.0。 -
十字形:
[(1.0, 0.0), (2.0, 0.0), (2.0, 1.0), (3.0, 1.0), (3.0, 2.0), (2.0, 2.0), (2.0, 3.0), (1.0, 3.0), (1.0, 2.0), (0.0, 2.0), (0.0, 1.0), (1.0, 1.0)]
面积:5.0。 -
随机四边形:
[(0.0, 0.0), (1.5, 0.5), (1.0, 2.0), (-0.5, 1.0)]
面积:2.125。 -
复杂凹多边形:
[(0.0, 0.0), (2.0, 0.0), (2.0, 1.0), (1.0, 1.0), (1.0, 2.0), (0.0, 2.0)]
面积:3.0。 -
五角星:
[(0.0, 0.5), (0.5, 0.5), (0.25, 0.0), (0.5, -0.5), (0.0, -0.25), (-0.5, -0.5), (-0.25, 0.0), (-0.5, 0.5)]
面积:0.5。 -
锯齿形:
[(0.0, 0.0), (1.0, 1.0), (2.0, 0.0), (3.0, 1.0), (4.0, 0.0)]
面积:2.0。 -
阶梯形:
[(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (2.0, 1.0), (2.0, 2.0), (0.0, 2.0)]
面积:3.0。 -
凹四边形:
[(0.0, 0.0), (2.0, 0.0), (1.0, 1.0), (0.0, 2.0)]
面积:2.0。 -
随机点集:
[(0.0, 0.0), (1.0, 0.5), (0.5, 1.5), (-0.5, 1.0)]
面积:1.25。
示例21-30:特殊场景
-
单点:
[(0.0, 0.0)]
面积:0.0(退化情况)。 -
线段:
[(0.0, 0.0), (1.0, 1.0)]
面积:0.0(退化情况)。 -
重复点:
[(0.0, 0.0), (0.0, 0.0), (1.0, 1.0)]
面积:0.0(无效多边形)。 -
自相交多边形:
[(0.0, 0.0), (2.0, 2.0), (0.0, 2.0), (2.0, 0.0)]
面积:0.0(鞋带公式不适用)。 -
浮点数精度测试:
[(0.0, 0.0), (1e10, 0.0), (1e10, 1e-10), (0.0, 1e-10)]
面积:1.0(注意浮点误差)。 -
大数测试:
[(0.0, 0.0), (1e15, 0.0), (1e15, 1e15), (0.0, 1e15)]
面积:5e29。 -
负数坐标:
[(-1.0, -1.0), (1.0, -1.0), (1.0, 1.0), (-1.0, 1.0)]
面积:4.0。 -
零面积多边形:
[(0.0, 0.0), (1.0, 1.0), (2.0, 2.0)]
面积:0.0(共线点)。 -
凹多边形带孔:外部顶点
[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0)]
,内部顶点[(1.0, 1.0), (2.0, 1.0), (2.0, 2.0), (1.0, 2.0)]
面积:8.0(需分段计算)。 -
极坐标转换:将极坐标点
(r, θ)
转换为笛卡尔坐标(r*cosθ, r*sinθ)
后计算面积。
注意事项
- 顶点顺序:必须为顺时针或逆时针排列,否则结果可能为负。
- 浮点误差:对于极端数值,需考虑使用高精度库(如
num-bigfloat
)。 - 自相交多边形:需用更复杂算法(如
CGAL
库的扩展)。 - 性能优化:对于大量顶点,可使用迭代器减少内存分配:
vertices.iter().zip(vertices.iter().cycle().skip(1)).map(|(a, b)| a.0 * b.1 - a.1 * b.0).sum::<f64>().abs() / 2.0
完整代码示例可在 geo-types
官方文档和测试用例中找到参考实现。实际开发中建议结合 geo
主库的算法扩展功能。
- 智能振动压路机控制
- 建筑能耗大数据分析
- 桥梁索力无线监测网络
- 基于UWB的室内定位系统
- 混凝土裂缝宽度自动识别
- 塔吊碰撞预警系统
- 建筑垃圾智能分拣机器人
- 地热换热器优化设计
- 智能照明系统光线追踪
- 施工噪声传播模拟
- 结构损伤声纹诊断
- 3D打印建筑拓扑优化
每个实例均可结合Rust的特性实现:
- 零成本抽象:高性能数值计算
- 无畏并发:实时多传感器处理
- 内存安全:长期运行的监测系统
- WASM支持:浏览器端BIM可视化
基于Rust的包围盒计算实例
以下是基于Rust的包围盒计算实例,涵盖不同场景下的实现方法,包括2D/3D包围盒、碰撞检测、几何变换等。所有代码均使用Rust标准库或常用几何计算库(如nalgebra
、cgmath
)。
基础2D轴对齐包围盒(AABB)
struct AABB2D {min: [f32; 2],max: [f32; 2],
}impl AABB2D {fn from_points(points: &[[f32; 2]]) -> Self {let mut min = [f32::MAX, f32::MAX];let mut max = [f32::MIN, f32::MIN];for p in points {min[0] = min[0].min(p[0]);min[1] = min[1].min(p[1]);max[0] = max[0].max(p[0]);max[1] = max[1].max(p[1]);}Self { min, max }}
}
3D轴对齐包围盒
use nalgebra::Point3;struct AABB3D {min: Point3<f32>,max: Point3<f32>,
}impl AABB3D {fn from_points(points: &[Point3<f32>]) -> Self {let mut min = Point3::new(f32::MAX, f32::MAX, f32::MAX);let mut max = Point3::new(f32::MIN, f32::MIN, f32::MIN);for p in points {min.x = min.x.min(p.x);min.y = min.y.min(p.y);min.z = min.z.min(p.z);max.x = max.x.max(p.x);max.y = max.y.max(p.y);max.z = max.z.max(p.z);}Self { min, max }}
}
包围盒合并
fn merge(a: &AABB2D, b: &AABB2D) -> AABB2D {AABB2D {min: [a.min[0].min(b.min[0]), a.min[1].min(b.min[1])],max: [a.max[0].max(b.max[0]), a.max[1].max(b.max[1])],}
}
点是否在包围盒内
impl AABB2D {fn contains(&self, point: [f32; 2]) -> bool {point[0] >= self.min[0] && point[0] <= self.max[0]&& point[1] >= self.min[1]&& point[1] <= self.max[1]}
}
包围盒碰撞检测
impl AABB2D {fn intersects(&self, other: &AABB2D) -> bool {self.min[0] <= other.max[0]&& self.max[0] >= other.min[0]&& self.min[1] <= other.max[1]&& self.max[1] >= other.min[1]}
}
包围球计算
struct BoundingSphere {center: [f32; 3],radius: f32,
}impl BoundingSphere {fn from_points(points: &[[f32; 3]]) -> Self {let aabb = AABB3D::from_points(points);let center = [(aabb.min[0] + aabb.max[0]) * 0.5,(aabb.min[1] + aabb.max[1]) * 0.5,(aabb.min[2] + aabb.max[2]) * 0.5,];let radius = points.iter().map(|p| {let dx = p[0] - center[0];let dy = p[1] - center[1];let dz = p[2] - center[2];(dx * dx + dy * dy + dz * dz).sqrt()}).fold(0.0, f32::max);Self { center, radius }}
}
带旋转的OBB包围盒
use nalgebra::{Vector3, Rotation3};struct OBB {center: Vector3<f32>,half_extents: Vector3<f32>,rotation: Rotation3<f32>,
}
三角形包围盒计算
fn triangle_aabb(v0: [f32; 3], v1: [f32; 3], v2: [f32; 3]) -> AABB3D {let min_x = v0[0].min(v1[0]).min(v2[0]);let min_y = v0[1].min(v1[1]).min(v2[1]);let min_z = v0[2].min(v1[2]).min(v2[2]);let max_x = v0[0].max(v1[0]).max(v2[0]);let max_y = v0[1].max(v1[1]).max(v2[1]);let max_z = v0[2].max(v1[2]).max(v2[2]);AABB3D {min: Point3::new(min_x, min_y, min_z),max: Point3::new(max_x, max_y, max_z),}
}
多边形凸包计算
use convex_hull::convex_hull;fn polygon_aabb(points: &[[f32; 2]]) -> AABB2D {let hull = convex_hull(points);AABB2D::from_points(&hull)
}
动态物体预测包围盒
impl AABB2D {fn predict_motion(&self, velocity: [f32; 2], dt: f32) -> Self {let displacement = [velocity[0] * dt, velocity[1] * dt];let new_min = [self.min[0] + displacement[0], self.min[1] + displacement[1]];let new_max = [self.max[0] + displacement[0], self.max[1] + displacement[1]];Self { min: new_min, max: new_max }}
}
层级包围盒(BVH)节点
struct BVHNode {aabb: AABB3D,left: Option<Box<BVHNode>>,right: Option<Box<BVHNode>>,triangles: Vec<[usize; 3]>,
}
包围盒表面积计算
impl AABB3D {fn surface_area(&self) -> f32 {let dx = self.max.x - self.min.x;let dy = self.max.y - self.min.y;let dz = self.max.z - self.min.z;2.0 * (dx * dy + dy * dz + dz * dx)}
}
屏幕空间AABB计算
fn screen_space_aabb(vertices: &[[f32; 3]], mvp: &Matrix4<f32>) -> AABB2D {let mut points = Vec::new();for v in vertices {let clip_pos = mvp * Vector4::new(v[0], v[1], v[2], 1.0);let ndc = clip_pos.xyz() / clip_pos.w;let screen_pos = [(ndc.x + 1.0) * 0.5, (ndc.y + 1.0) * 0.5];points.push(screen_pos);}AABB2D::from_points(&points)
}
其余实现包括:
- 八叉树空间划分
- 球体与AABB碰撞检测
- 胶囊体包围盒
- 视锥体裁剪
- 包围盒线性插值
- 多物体复合包围盒
- 地形块包围盒计算
- 粒子系统包围盒
- 骨骼动画包围盒更新
- 延迟渲染GBuffer包围盒
基于 Rust cgmath
库的实例
以下是基于 Rust cgmath
库的实用示例,涵盖向量、矩阵、四元数等常见操作。每个示例均提供代码片段和简要说明,可直接运行测试。
向量基础操作
use cgmath::{Vector2, Vector3, Vector4, dot};// 创建二维向量
let v2 = Vector2::new(1.0, 2.0);
assert_eq!(v2.x, 1.0);// 向量点积
let a = Vector3::new(1.0, 2.0, 3.0);
let b = Vector3::new(4.0, 5.0, 6.0);
let dot_product = dot(a, b);
assert_eq!(dot_product, 32.0);// 向量叉积
let cross = a.cross(b);
assert_eq!(cross, Vector3::new(-3.0, 6.0, -3.0));
矩阵变换
use cgmath::{Matrix3, Matrix4, SquareMatrix};// 创建单位矩阵
let identity: Matrix4<f32> = Matrix4::identity();
assert_eq!(identity.determinant(), 1.0);// 矩阵乘法
let m1 = Matrix3::new(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
let m2 = Matrix3::new(9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
let result = m1 * m2;
assert_eq!(result, Matrix3::new(30.0, 24.0, 18.0, 84.0, 69.0, 54.0, 138.0, 114.0, 90.0));// 矩阵求逆
let m = Matrix4::from_scale(2.0);
let inv_m = m.invert().unwrap();
assert_eq!(inv_m, Matrix4::from_scale(0.5));
四元数旋转
use cgmath::{Quaternion, Rad, Deg, Euler};// 创建四元数
let q = Quaternion::new(1.0, 0.0, 0.0, 0.0);
assert_eq!(q.v, Vector3::new(0.0, 0.0, 0.0));// 绕Y轴旋转90度
let rotation = Quater