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

目录

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

不旋转的长方体

如果这个长方体是规则的,不进行任何旋转,可以先计算长方体的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//计算向量DEvector_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;//计算向量DPvector_DP.x=p.x-vertices[4].x;vector_DP.y=p.y-vertices[4].y;vector_DP.z=p.z-vertices[4].z;//计算向量EPvector_EP.x=p.x-vertices[7].x;vector_EP.y=p.y-vertices[7].y;vector_EP.z=p.z-vertices[7].z;//计算向量点乘的结果//DP点乘DEdouble DP_DE;DP_DE=vector_DP.x*vector_DE.x+vector_DP.y*vector_DE.y+vector_DP.z*vector_DE.z;//EP点乘DEdouble 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//计算向量APvector_AP.x=p.x-vertices[0].x;vector_AP.y=p.y-vertices[0].y;vector_AP.z=p.z-vertices[0].z;//计算向量ADvector_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 APdouble AD_AP;AD_AP=vector_AD.x*vector_AP.x+vector_AD.y*vector_AP.y+ vector_AD.z*vector_AP.z;//AD DPdouble 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 OAdouble 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://xiahunao.cn/news/2979277.html

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

相关文章

软硬件无缝集成:新加坡量子公司首创下一代量子集成平台

为了充分发挥量子系统的性能&#xff0c;已经公认的一个关键方法是在硬件和软件层之间实现紧密集成。这种集成使得软件能够充分利用硬件的所有特性&#xff0c;以实现最佳性能。随着行业努力开发能够提供量子优势的系统&#xff0c;实现这种高性能显然是非常必要的。 Horizon的…

Python学习从0开始——项目一day02数据库连接

Python学习从0开始——项目一day02数据库连接 一、在线云数据库二、测试数据库连接三、数据库驱动介绍四、SQL执行4.1插入测试数据4.2安装数据库连接模块4.3测试SQL语句执行4.4执行SQL的固定步骤及示例 一、在线云数据库 找了一个在线数据库&#xff0c;需要邮箱注册&#xff…

Linux系统中安装MySQL

1、在电脑中安装虚拟机 2、df -h查看光盘是否挂载&#xff0c;没挂载用mount -o ro /dev/sr0 /media命令挂载 3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#xff0c;未配置则进行配置 配置软件仓库 [rootlocalhost yum.repos.d]# vim rhle.r…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

归并排序精讲

一.定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子…

AI交互数字人对教育领域有何优势?

AI交互数字人不仅能够跨越物理距离的限制&#xff0c;以数字人形象为学生提供“面对面”教学互动体验&#xff0c;还能根据学生的具体需求提供个性化的知识解答。如天津大学推出了数字人老师&#xff0c;以刘艳丽教授形象1&#xff1a;1仿真打造的2.5D数字人&#xff0c;能够应…

【深度学习】行人跌倒行为检测软件系统

行人跌倒检测系统在各个领域的应用都对社会的整体健康、安全和福祉产生积极影响&#xff0c;为人们的生活和工作提供了更加安全和可靠的环境&#xff0c; 本文主要使用YOLOV8深度学习框架自训练了一个“行人跌倒检测模型”&#xff0c;基于此模型使用PYQT5实现了一款界面软件用…

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

Rest微服务案例

Rest 父工程构建microservicecloud-api公共子模块Modulemicroservicecloud-provider-dept-8001部门微服务提供者Modulemicroservicecloud-consumer-dept-80部门微服务消费者Module 以Dept部门模块做一个微服务通用案例 Consumer消费者&#xff08;Client&#xff09;通过REST调…

Go 堆内存分配源码解读

简要介绍 在Go的内存分配中存在几个关键结构&#xff0c;分别是page、mspan、mcache、mcentral、mheap&#xff0c;其中mheap中又包括heapArena&#xff0c;具体这些结构在内存分配中担任什么角色呢&#xff1f; 如下图&#xff0c;可以先看一下整体的结构&#xff1a; mcach…

Maxwell安装使用和简单案例

一、解压 cd /opt/software/ ​ tar -zxvf maxwell-1.29.2.tar.gz -C /opt/module/ ​ cd /opt/module/ 二、MySQL 环境准备 1、修改 mysql 的配置文件 修改 mysql 的配置文件&#xff0c;开启 MySQL Binlog 设置 vi /etc/my.cnf 添加以下内容 server_id1 log-binmysql-…

跟着野火从零开始手搓FreeRTOS(6)多优先级的配置

在 FreeRTOS 中&#xff0c;数字优先级越小&#xff0c;逻辑优先级也越小。 之前提过&#xff0c;就绪列表其实就是一个数组&#xff0c; 里面存的是就绪任务的TCB&#xff08;准确来说是 TCB 里面的 xStateListItem 节点&#xff09;&#xff0c;数组的下标对应任务的优先级&a…

GUI简述

GUI概述 swing概述 swing是java设计的GUI包&#xff0c;该包包括了GUI中各种组件支持 swing中的组件包括两大类&#xff0c;容器&#xff08;例如窗口&#xff0c;对话框&#xff0c;面板&#xff09;和功能组件&#xff08;如按钮&#xff0c;输入框&#xff0c;菜单等&…

【RSGIS数据资源】2018年北京森林站东灵山样地无人机遥感生态数据集

文章目录 一、数据集基本信息二、数据结构和内容三、 数据集质量控制&#xff08;一&#xff09; 产生方式&#xff08;二&#xff09; 数据源说明&#xff08;三&#xff09; 数据采集、加工处理方法 四、 数据使用 一、数据集基本信息 说明数据集基本描述信息&#xff0c;包…

Linux安装部署Tomcat

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

电脑上如何将png图片改为jpg?这几个方法一定用的上

在我们的日常工作、学习中&#xff0c;经常需要用到不同的图片格式类型&#xff0c;比如jpg、png、gif、tiff等等&#xff0c;这些图片之间有着非常大的区别&#xff0c;静态图片jpg格式&#xff0c;设计工作者常接触到的png&#xff0c;还有我们平时发的动态表情包是gif格式&a…

微服务架构中10个常用的设计模式,建议收藏!

从软件开发早期&#xff08;1960 年代&#xff09;开始&#xff0c;应对大型软件系统中的复杂性一直是一项令人生畏的任务。多年来为了应对软件系统的复杂性&#xff0c;软件工程师和架构师们做了许多尝试&#xff1a;David Parnas 的模块化和封装 &#xff08;1972&#xff09…

上门废品回收小程序,互联网回收拥有哪些特点?

随着社会的进步&#xff0c;人们的生活水平不断提高&#xff0c;产生的可回收物也在不断上升&#xff0c;每年垃圾站都能产生大量的可回收物&#xff0c;这也造成了资源的浪费。 目前&#xff0c;加快发展回收模式&#xff0c;提高我国回收效率成为了当下回收市场发展的重要方…

鬼手剪辑如何导入剪映草稿箱?含工程文件

鬼手剪辑导入剪映功能介绍 功能概述 鬼手剪辑导入剪映功能可以让您将鬼手剪辑翻译、克隆和一键解说等作品的工程文件导入到剪映草稿&#xff0c;以便通过剪映进行精细化调整。 推荐使用场景 视频二创 视频语音翻译 短剧解说等作品的微调 导出的工程文件包含以下元素 视频…