C++判断一个点是否在一个在任意空间中的长方体中

news2025/1/14 1:10:38

目录

  • 不旋转的长方体
  • 计算旋转矩阵及旋转后的长方体
    • 计算旋转矩阵
    • 计算旋转后的长方体
  • 判断点是否在旋转后的长方体内

不旋转的长方体

如果这个长方体是规则的,不进行任何旋转,可以先计算长方体的BoundingBox,判断点是否在3D的BoundingBox中即可。

计算旋转矩阵及旋转后的长方体

计算旋转矩阵

这里使用的是glm库,下面是根据旋转角度,旋转中心和旋转轴计算的旋转矩阵:

glm::mat4 getMatrix(float angleInDegrees, glm::vec3 rotationCenter, glm::vec3 rotationAxis)
{
	// 将角度转换为弧度
	float angleInRadians = glm::radians(angleInDegrees);

	// 创建反向平移矩阵,将旋转中心移动到原点
	glm::mat4 translateToOrigin = glm::translate(glm::mat4(1.0f), -rotationCenter);

	// 创建旋转矩阵,围绕原点进行旋转
	glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), angleInRadians, rotationAxis);

	// 创建平移矩阵,将旋转中心移动回原来的位置
	glm::mat4 translateBack = glm::translate(glm::mat4(1.0f), rotationCenter);

	// 将以上矩阵相乘,得到最终的变换矩阵
	return translateBack * rotationMatrix * translateToOrigin;
}

计算旋转后的长方体

下面是根据一个不旋转的长方体的角点和旋转矩阵计算当前长方体的位置,8个顶点位置是固定的,位置如图所示:
长方体8个顶点顺序
实现代码如下所示:

std::vector<glm::vec3>computeCube(const glm::vec3 minBounds, const glm::vec3 maxBounds,glm::mat4 matrix)
{
	std::vector<glm::vec3> cubeVerticex;
	cubeVerticex.resize(8);
	cubeVerticex[0] = matrix* glm::vec4(maxBounds.x, minBounds.y, minBounds.z, 1.0);
	cubeVerticex[1] = matrix* glm::vec4(minBounds, 1.0);
	cubeVerticex[2] = matrix* glm::vec4(minBounds.x, maxBounds.y, minBounds.z, 1.0);
	cubeVerticex[3] = matrix* glm::vec4(maxBounds.x, maxBounds.y, minBounds.z, 1.0);
	cubeVerticex[4] = matrix* glm::vec4(maxBounds.x, minBounds.y, maxBounds.z, 1.0);
	cubeVerticex[5] = matrix* glm::vec4(minBounds.x, minBounds.y, maxBounds.z, 1.0);
	cubeVerticex[6] = matrix* glm::vec4(minBounds.x, maxBounds.y, maxBounds.z, 1.0);
	cubeVerticex[7] = matrix* glm::vec4(maxBounds, 1.0);
	return cubeVerticex;
}

判断点是否在旋转后的长方体内

这里参考了已有代码,但是作者使用的是在原点的长方体,我们的长方体在大部分情况下是不在原点的,下面是根据原作者的代码进行的修改,可以是不在原点的长方体,但是长方体的8个顶点必须是上面的顺序,不可更改。代码如下:

bool isPointInsideCube(glm::vec3 p,std::vector<glm::vec3> vertices) {
	//长方体必须是8个顶点
	if(vertices.size()!=8)
	{
		return false;
	}    
    //首先判断点是否在左右两面的中间 此时法线为y轴
	vec3 vector_DP;
	vec3 vector_EP; 
	vec3 vector_DE;//法线y
    //计算向量DE
	vector_DE.x=vertices[7].x-vertices[4].x;vector_DE.y=vertices[7].y-vertices[4].y;vector_DE.z=vertices[7].z-vertices[4].z;
	//计算向量DP
	vector_DP.x=p.x-vertices[4].x;vector_DP.y=p.y-vertices[4].y;vector_DP.z=p.z-vertices[4].z;
	//计算向量EP
	vector_EP.x=p.x-vertices[7].x;vector_EP.y=p.y-vertices[7].y;vector_EP.z=p.z-vertices[7].z;
	//计算向量点乘的结果
	//DP点乘DE
	double DP_DE;
	DP_DE=vector_DP.x*vector_DE.x+vector_DP.y*vector_DE.y+vector_DP.z*vector_DE.z;
	//EP点乘DE
	double EP_DE;
	EP_DE=vector_EP.x*vector_DE.x+vector_EP.y*vector_DE.y+vector_EP.z*vector_DE.z;
    //然后判断点是否在上下两面的中间 此时法线为z轴	
	vec3 vector_AP; 
	vec3 vector_AD;//法线y
	//计算向量AP
	vector_AP.x=p.x-vertices[0].x;vector_AP.y=p.y-vertices[0].y;vector_AP.z=p.z-vertices[0].z;
	//计算向量AD
	vector_AD.x=vertices[4].x-vertices[0].x;vector_AD.y=vertices[4].y-vertices[0].y;vector_AD.z=vertices[4].z-vertices[0].z;
	//计算向量点乘的结果
	//AD AP
	double AD_AP;
	AD_AP=vector_AD.x*vector_AP.x+vector_AD.y*vector_AP.y+ vector_AD.z*vector_AP.z;
	//AD DP
	double AD_DP;
	AD_DP=vector_AD.x*vector_DP.x+vector_AD.y*vector_DP.y+ vector_AD.z*vector_DP.z;
	//最后判断点是否在前后两面的中间 此时法线为x轴 
	vec3 vector_OA;//法线
	vec3 vector_OP;	
	vector_OA.x=vertices[0].x-vertices[1].x;vector_OA.y=vertices[0].y-vertices[1].y;vector_OA.z=vertices[0].z-vertices[1].z;
	vector_OP.x=p.x-vertices[1].x;vector_OP.y=p.y-vertices[1].y;vector_OP.z=p.z-vertices[1].z;
	//计算向量点乘的结果
	//OP OA
	double OP_OA;
	OP_OA=vector_OP.x*vector_OA.x+vector_OP.y*vector_OA.y+vector_OP.z*vector_OA.z;
	//AP OA 
	double AP_OA;
	AP_OA=vector_AP.x*vector_OA.x+vector_AP.y*vector_OA.y+vector_AP.z*vector_OA.z;
	if (DP_DE*EP_DE<0&&AD_AP*AD_DP<0&&OP_OA*AP_OA<0)
	{
		return true;
	}else
	{
		return false;
	}
}

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

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

相关文章

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决

自制Apache-Doris 2.0.4镜像Docker部署一Fe和一Be集群及遇到的问题解决 文章目录 1.前言2.doris是什么&#xff1f;2.1简介2.2介绍2.3使用场景2.4架构 3.官网4.构建部署4.1 构建环境4.2 doris2.0.4的fe和be镜像构建4.2.1 fe2.0.4镜像构建脚本4.2.2 be2.0.4镜像构建4.2.3 启动脚…

Matlab对多个输入信号进行数值排序提取特定值

1、将多个信号转为一个数组信号输出&#xff0c;在这里需要注意&#xff0c;数据类型是否统一&#xff1b; 2、使用Sort模块&#xff0c;进行排序&#xff08;可设置排序方向&#xff09;&#xff0c;得到排序后的新数组以及对应的索引号&#xff1b; 3、设置想要的索引号&…

YOLOv8改进项目汇总-超全改进-ultralyticsPro介绍:订阅了《芒果YOLOv8原创改进专栏》的读者免费赠送,包括很多稀有改进

&#x1f525;&#x1f525;&#x1f525;专注于YOLOv8改进&#xff0c;NEW - YOLOv8 &#x1f680; in PyTorch >, Support to improve Backbone, Neck, Head, Loss, IoU, LA, NMS and other modules&#x1f680; Makes YOLOv8 improvements easy again 芒果出品 YOLOv8…

前端CSS基础8(盒子模型(margin、border、padding、content))

前端CSS基础8&#xff08;盒子模型&#xff08;margin、border、padding、content&#xff09;&#xff09; CSS盒子模型CSS中常用的长度单位元素的分类&#xff0c;各个元素的显示模式修改元素的显示模式&#xff08;类型&#xff09;盒子模型的组成部分盒子内容区-contentCSS…

Python的venv虚拟环境

venv 是 Python 的一个内置模块&#xff0c;用于创建和管理虚拟环境&#xff08;virtual environments&#xff09;。虚拟环境可以独立于系统的全局环境&#xff0c;并且可以在其中安装特定版本的包和库&#xff0c;以便于项目之间的隔离和管理。下面是 venv 的使用教程&#x…

【SpringCloud】Consul-服务注册中心及配置中心快速入门

【SpringCloud】Consul-服务注册中心及配置中心快速入门 文章目录 【SpringCloud】Consul-服务注册中心及配置中心快速入门1. 下载安装及启动2. 服务注册2.1 引入依赖2.2 yml配置2.3 启动类配置2.4 测试 3. 服务配置3.1 引入依赖3.2 yml配置3.3 创建配置文件3.4 动态刷新配置3.…

有没有学网络空间安全的学长,想知道学长们毕业以后都去干嘛了?

我作为一个零基础小白到白帽黑客&#xff0c;也认识到了很多零基础小白的&#xff0c;有一些网络空间安全的学员&#xff0c;但是大多数还是非计算机相关专业的学员。他们通过系统学习网络安全&#xff0c;掌握黑客技术之后&#xff0c;都找到了自己满意的工作。 同学A&#x…

从0到1实现RPC | 接入Apollo配置中心

一、代码实现 添加依赖 添加apollo客户端的依赖和spring配置相关依赖 添加监听器 通过实现ApplicationContextAware接口&#xff0c;获取Spring上下文。 使用ApolloConfigChangeListener注解监听命名空间rpc-demo-provider.yaml和默认的application.properties。 监听逻辑…

Meta Llama 3本地部署

感谢阅读 环境安装收尾 环境安装 项目文件 下载完后在根目录进入命令终端&#xff08;windows下cmd、linux下终端、conda的话activate&#xff09; 运行 pip install -e .不要控制台&#xff0c;因为还要下载模型。这里挂着是节省时间 模型申请链接 复制如图所示的链接 然后…

翱途O2OA新手上路-服务器下载及私有云部署

本篇主要简要描述从官网下载服务器&#xff0c;进行部署&#xff0c;启动的过程&#xff0c;并且描述在部署过程中常见的问题与报错以及云服务器安全策略配置和O2OA服务器端口修改的方式。 O2OA部署的服务器要求不高&#xff0c;一般使用4C8G以上的服务器均可正常运行。 一、检…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

Vue+OpenLayers7入门到实战,OpenLayers加载GeoJson数据并叠加GeoJson中的要素到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上加载GeoJson数据并叠加GeoJson中的要素到OpenLayers矢量图层上。 GeoJson数据格式可以参考博主另一篇文章《GIS开发入门,GeoJSON是什么?GeoJSON格式标准介绍》,那么…

Python Selenium无法打开Chrome浏览器处理自定义浏览器路径

问题 在使用Python Selenium控制Chrome浏览器操作的过程中&#xff0c;由于安装的Chrome浏览器的版本找不到对应版本的驱动chromedriver.exe文件&#xff0c;下载了小几个版本号的驱动软件。发现运行下面的代码是无法正常使用的&#xff1a; from selenium import webdriver …

在excel中,如何在一个表中删除和另一个表中相同的数据?

现在有A表&#xff0c;是活动全部人员的姓名和学号&#xff0c;B表是该活动中获得优秀人员的姓名和学号&#xff0c; 怎么提取没有获得优秀人员的名单&#xff1f; 这里提供两个使用excel基础功能的操作方法。 1.条件格式自动筛选 1.1按住Ctrl键&#xff0c;选中全表中的姓…

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

如何高效的压缩GIF图片?一键搞定GIF动图压缩 就是这么简单

一&#xff0c;引言 压缩GIF动图是一个常见的需求&#xff0c;无论是在社交媒体上分享动态表情&#xff0c;还是在网页设计中添加动态元素&#xff0c;GIF动图都扮演着重要的角色。然而&#xff0c;过大的GIF文件大小可能会导致加载速度慢&#xff0c;影响用户体验。因此&…

【每日刷题】Day22

【每日刷题】Day22 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1669. 合并两个链表 - 力扣&#xff08;LeetCode&#xff09; 2. 11. 盛最多水的容器 - 力扣&#…

茶饮门店本地生活抖音团购运营方案计划书

【干货资料持续更新&#xff0c;以防走丢】 茶饮门店本地生活抖音团购运营方案计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑80页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音本地生活运营方案 1. 账号基础搭建与优化 - 门店账号…

MTK6775/MT6775/曦力P70联发科处理器性能参数资料

联发科MT6775(曦力P70)芯片搭载强大的Arm Cortex-A73/A53八核CPU&#xff0c;并采用台积电12纳米FinFET制程工艺&#xff0c;相较于其他14纳米级别产品&#xff0c;功耗节省达到了15%。此外&#xff0c;曦力P70还配备了高效能的Arm Mali-G72 GPU&#xff0c;相比上一代产品曦力…

sklearn 笔记 metrics

1 分类 1.1 accuracy_score 分类准确率得分 在多标签分类中&#xff0c;此函数计算子集准确率&#xff1a;y_pred的标签集必须与 y_true 中的相应标签集完全匹配。 1.1.1 参数 y_true真实&#xff08;正确&#xff09;标签y_pred由分类器返回的预测标签normalize 默认为 Tr…