6 轴对齐的边界框

轴对齐的边界框,可能用于确认图形是否在区域内,源码如下

use parry2d_f64::bounding_volume::BoundingVolume as _;
use parry3d_f64::bounding_volume::BoundingVolume as _;use super::{Point, Vector};/// 轴对齐的边界框 An axis-aligned bounding box (AABB)
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Hash, Ord, PartialOrd)]
#[repr(C)]
pub struct Aabb<const D: usize> {/// AABB的最小坐标pub min: Point<D>,/// AABB的最大坐标pub max: Point<D>,
}impl<const D: usize> Aabb<D> {/// 确定AABB是否包含给定点pub fn contains(&self, point: impl Into<Point<D>>) -> bool {let point = point.into();let min = self.min.coords.components.into_iter().zip(point.coords.components);for (min, p) in min {if min > p {return false;}}let max = self.max.coords.components.into_iter().zip(point.coords.components);for (max, p) in max {if max < p {return false;}}true}
}impl Aabb<2> {/// 从点列表构建二维AABB////// The resulting AABB will contain all the points.pub fn from_points(points: impl IntoIterator<Item = impl Into<Point<2>>>,) -> Self {let points: Vec<_> = points.into_iter().map(|point| point.into().to_na()).collect();parry2d_f64::bounding_volume::Aabb::from_points(&points).into()}///从Parry AABB构建二维AABBpub fn from_parry(aabb: parry2d_f64::bounding_volume::Aabb) -> Self {Self {min: aabb.mins.into(),max: aabb.maxs.into(),}}///将AABB转换为Parry AABBpub fn to_parry(self) -> parry2d_f64::bounding_volume::Aabb {parry2d_f64::bounding_volume::Aabb {mins: self.min.to_na(),maxs: self.max.to_na(),}}/// 将此AABB与另一个合并pub fn merged(&self, other: &Self) -> Self {self.to_parry().merged(&other.to_parry()).into()}
}impl Aabb<3> {/// 根据点列表构建三维AABB////// The resulting AABB will contain all the points.pub fn from_points(points: impl IntoIterator<Item = impl Into<Point<3>>>,) -> Self {let points: Vec<_> = points.into_iter().map(|point| point.into().to_na()).collect();parry3d_f64::bounding_volume::Aabb::from_points(&points).into()}/// Construct a 3-dimensional AABB from a Parry AABBpub fn from_parry(aabb: parry3d_f64::bounding_volume::Aabb) -> Self {Self {min: aabb.mins.into(),max: aabb.maxs.into(),}}/// Convert the AABB to a Parry AABBpub fn to_parry(self) -> parry3d_f64::bounding_volume::Aabb {parry3d_f64::bounding_volume::Aabb {mins: self.min.to_na(),maxs: self.max.to_na(),}}/// Access the vertices of the AABBpub fn vertices(&self) -> [Point<3>; 8] {self.to_parry().vertices().map(Into::into)}/// Compute the center point of the AABBpub fn center(&self) -> Point<3> {self.to_parry().center().into()}/// Compute the size of the AABBpub fn size(&self) -> Vector<3> {self.to_parry().extents().into()}/// Compute an AABB that includes an additional pointpub fn include_point(self, point: &Point<3>) -> Self {let mut aabb = self.to_parry();aabb.take_point(point.to_na());Self::from_parry(aabb)}/// Merge this AABB with anotherpub fn merged(&self, other: &Self) -> Self {self.to_parry().merged(&other.to_parry()).into()}
}impl From<parry2d_f64::bounding_volume::Aabb> for Aabb<2> {fn from(aabb: parry2d_f64::bounding_volume::Aabb) -> Self {Self::from_parry(aabb)}
}impl From<parry3d_f64::bounding_volume::Aabb> for Aabb<3> {fn from(aabb: parry3d_f64::bounding_volume::Aabb) -> Self {Self::from_parry(aabb)}
}#[cfg(test)]
mod tests {use super::Aabb;#[test]fn contains() {let aabb = Aabb::<2>::from_points([[1., 1.], [3., 3.]]);assert!(aabb.contains([2., 2.]));assert!(!aabb.contains([0., 0.]));assert!(!aabb.contains([4., 0.]));assert!(!aabb.contains([4., 4.]));assert!(!aabb.contains([0., 4.]));assert!(!aabb.contains([2., 0.]));assert!(!aabb.contains([2., 4.]));assert!(!aabb.contains([0., 2.]));assert!(!aabb.contains([4., 2.]));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/20432.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ElementUI之给el-table实现搜索功能

1&#xff0c;有一个表格 <el-table:data"tableData"borderstyle"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-columnprop"name"label&quo…

Chrome 浏览器 131 版本开发者工具(DevTools)更新内容

Chrome 浏览器 131 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、使用 Gemini 调试 CSS Chrome DevTools 现在推出了一个新的实验性 AI 辅助面板&#xff0c;可以与 Gemini 聊天并获得帮助来调试 CSS。 在 Elements 面板中&#xff0c;右键点击一个元素并选…

Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0

firefly 公司出的rk3588的设备&#xff0c;其中已经安装了gcc 交叉编译工具&#xff0c;系统版本是Ubuntu20.04。 使用Ubuntu20.04 交叉编译ffmpeg_ubuntu下配置ffmpeg交叉编译器为arm-linux-gnueabihf-gcc-CSDN博客文章浏览阅读541次。ubuntu20.04 交叉编译ffmpeg_ubuntu下配…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…

sagemaker中使用pytorch框架的DLC训练和部署cifar图像分类任务

参考资料 https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/pytorch_cnn_cifar10/pytorch_local_mode_cifar10.ipynbhttps://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html 获取训练数据 # s3://zhaojiew-sa…

golang笔记8-函数

1. 基本函数 package mainimport "fmt"/*什么是函数&#xff1a;完成某一功能的程序指令的集合语法&#xff1a;func 函数名称(形参列表)(返回值类型列表){执行语句。。。返回值列表}注意事项&#xff1a;函数名&#xff1a;函数名首字母大写&#xff1a;可以被本包…

vite+vue3+ts编译vue组件后,编译产物中d.ts文件为空

一、前言 使用vue3vitets实现一个UI组件库&#xff0c;为了生成类型文件便于其他项目引用该组件库。根据推荐使用了vite-plugin-dts插件进行ts文件的生成 二、版本 组件版本vue ^3.5.12 vite ^5.4.10 vite-plugin-dts ^4.3.0 typescript ~5.6.2 三、问题描述 使用vitevi…

向量数据库FAISS之二:基础进阶版

基础 1.评价类型和距离 1.METRIC_L2 Faiss 使用了欧几里得 (L2) 距离的平方&#xff0c;避免了平方根。 这仍然与欧几里德距离一样单调&#xff0c;但如果需要精确距离&#xff0c;则需要结果的额外平方根。 2.METRIC_INNER_PRODUCT 这通常用于推荐系统中的最大内积搜索。…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…

华三预赛学习笔记(每日编辑,复习完为止)

知识点分布 路由交换技术基础 计算机网络基本概念 计算机网络基本概念&#xff1a; 很多电脑和设备通过电线或无线信号连在一起&#xff0c;可以互相“说话”和“分享东西” 网络的主要形式和发展历程&#xff1a; 诞生阶段-最早的计算机网络是以单个计算机为中心的联机系统-终…

技术速递|Microsoft.Extensions.VectorData 预览版简介

作者&#xff1a;Luis Quintanilla - 项目经理 排版&#xff1a;Alan Wang 我们很高兴推出 Microsoft.Extensions.VectorData.Abstractions 库&#xff0c;该库现已提供预览版。 正如 Microsoft.Extensions.AI 库为使用 AI 服务提供了一个统一层一样&#xff0c;此包为 .NET 生…

第5章-总体设计 5.3 硬件架构设计

5.3 硬件架构设计 1.哪些类型的产品需要架构设计&#xff1f;2.硬件架构师到底做什么&#xff1f;&#xff08;1&#xff09;理解需求和业务模型的情况。&#xff08;2&#xff09;背板设计&#xff0c;既需要考虑业务数据交换能力&#xff0c;也需要考虑子模块的管理监控能力。…

图像/文字差异类型验证码识别 无需训练

某像差异在个别全家桶验证方便有使用&#xff0c;对于这种验证码类型如下&#xff1a; 首先还是目标检测&#xff0c;直接用 dddd 自带的detection 就足够了。 特征提取 其次经过观察&#xff0c;差异答案与其他三个无非就是颜色&#xff0c;字体&#xff0c;方向&#xff0c…

新华三H3CNE网络工程师认证—生成树协议

新华三H3CNE网络工程师认证本节讲解生成树协议&#xff0c;关于生成树协议&#xff0c;提到生成树协议&#xff0c;这个时候不得不提到另外一个概念叫二层环路。二层环路导致的原因是交换机的转发机制导致的&#xff0c;本博客将分析这个机制导致这个问题的原因。 文章目录 一…

使用ai工具探究论文的工作流(阅读一个EEG的cnn-lstm文献(2021))

文章目录 李沐老师的方法论第一遍&#xff1a;做海选第二遍&#xff1a;对相关论文进行精选第三遍&#xff1a;重点研读 AI是怎么分析一个文章的标题&#xff08;Title&#xff09;和关键词摘要&#xff08;Abstract&#xff09;分析引言&#xff08;Introduction&#xff09;梳…

Scala的Array习题

答案&#xff1a;CBBBB import scala.collection.mutable.ArrayBuffer //1 case class DreamItem(content:String,var isDone:Boolean,deadline:String,var order:Int) object p5 {def main(args: Array[String]): Unit {//2val dreamListArrayBuffer[DreamItem]()//梦想清单/…

深度学习的实践层面

深度学习的实践层面 设计机器学习应用 在训练神经网络时&#xff0c;超参数选择是一个高度迭代的过程。我们通常从一个初步的模型框架开始&#xff0c;进行编码、运行和测试&#xff0c;通过不断调整优化模型。 数据集一般划分为三部分&#xff1a;训练集、验证集和测试集。常…

TPU-MLIR 总览

TPU-MLIR 总览 &#x1f4a1;深度学习编译器可以实现一次性代码开发和重用各种计算能力处理器的目标 ## 项目简介&#xff1a; TPU-MLIR 是 AI 芯片的 TPU 编译器工程。该工程提供了一套完整的工具链, 其可以将不同框架下预训练的神经网络, 转化为可以在算能 TPU 上高效运算的…

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项&#xff08;启用 strict 后自动包含这些&#xff09;模块与导入相关选项 2. include 和 excludeinclude…

苹果MacOS 调用自编译opencv的Dylib显示一个图片程序的步骤

前言 为了测试自编译的opencv库是否能在苹果MacOS系统下使用&#xff0c;需要写一个简单的测试程序。这个测试程序写起来不难&#xff0c;麻烦的是一些配置。网上的办法很多&#xff0c;里面因为版本的问题有一些坑。特此写了一个建立步骤&#xff0c;供大家参考。 1、新建一个…