几何算法系列:空间实体体积计算公式推导

embedded/2024/10/24 4:21:19/

1.前言

面积和体积的计算是常见和基础的几何算法话题,面积和体积通常作为面或构件的基本信息参与相关的建模、计算、分析等过程。

有关面积的计算,可以参考博主此前的文章,

一种误差较小的轮廓面积计算算法_轮廓面积计算原理-CSDN博客文章浏览阅读920次,点赞18次,收藏19次。基于微分思想的轮廓面积计算方法之一是将多边形轮廓边与X轴会Y轴进行围合,形成一个个梯形,每个梯形的面积有符号,累计求和即得到多边形轮廓的面积。详见博主之前的文章,记录导致计算轮廓面积出错的一个坑点-CSDN博客计算轮廓面积是常见的几何算法话题,获取轮廓面积、计算轮廓法线等场景会涉及到。计算轮廓面积的方法有很多,一种常用的是微积分思路的分段求和办法,即组成轮廓的每条线段与X轴或Y轴进行有向投影,轮廓边线与X轴或Y轴的投影之和即为轮廓的有向面积。_轮廓面积计算原理https://blog.csdn.net/baidu_38621657/article/details/141868522

本文对实体体积计算算法进行说明。

2.内容

实体体积计算方法不唯一,如微积分、投影求和、公式推导应用等方式,其实很多方式的原始思维是一样的,即来源于微分和积分思路,通过公式推导简化计算逻辑,提高计算效率。

 其中,

公式如上,解释如下,

  1. Si为构成实体的面;
  2. ni为面的法向;
  3. P0,i为面上任意一点;
  4. ci为面所在平面的参数,即面所在平面到原点(0,0,0)的距离;
  5. Area(Si)为面的面积,该面积为基于法向ni的面积,如果ni为面法向,则面积符号为正,如果ni为面法向对向,则面积为负,其实这里ni为法向或法向的对向不影响结果,但不能为任意方向,那样,结果数值会错误。
  6. ci * Area(Si)为平面到原点构成的拉伸体的体积
  7. 整个公式的解释就清楚了吧,不清楚可以关注博主公众号留言;

3.公式推导

其实体积计算可以由面积计算扩展而来,实体各个面对某一平面(通常为XY、YZ或ZX平面)投影所围成区域有符号体积之和即为实体的体积

上述解释也可以作为求体积的一种方法,不过稍微复杂了点,毕竟当碰到顶面倾斜的直纹体的体积计算话题时,没有什么人会感觉到十分轻松。

我们继续推导,

  1. 面Si在空间的三个正交平面均有分量:Si_x、Si_y、Si_z;
  2. Si在某空间平面的投影等价于其在此平面的分量在此平面的投影,此处的投影可扩展为所围成的空间区域;如Si在XY平面的投影等于Si_z在XY平面的投影;
  3. Ci为原点到面Si所在平面的距离,同样,Ci由三个分量:Ci_x、Ci_y、Ci_z;
  4. Si在XY平面的投影区域体积为Si*Ci_z=Si_z*Ci_z,这里的Si和Ci_z均为向量,结果为数值;同理可求Si在YZ、ZX平面投影区域的体积
  5. Si在空间三个正交平面投影区域体积之和为:Si*(Ci_x+Ci_y+Ci_z) = Si*Ci
  6. 上述提到过构成实体的面在空间某平面投影所形成区域体积之和为实体体积,可进一步得知,构成实体的面在空间三个正交平面投影之和的之和为3倍的实体体积,如公式所示;
  7. 为什么不直接求1倍的体积呢?因为实体时三维空间中的元素,根据上述思路,3倍体积公式得到了简化,容易求解,将结果除以3即得到实体体积

4.效果

代码就不上传了,上述思路和公式是准确的,可自行实现,感兴趣可进一步联系博主。

经单元测试验证,各种情况下均通过单元测试,一个领域问题是浮点运算会带来误差,减少误差的话题可参考博主此前文章,

关于float浮点值二进制存储和运算精度损失的话题_float的二进制存储和输出-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏18次。浮点值的存储、运算都可能会带来精度损失,了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大,以及思考怎么避免或减少精度损失。_float的二进制存储和输出https://blog.csdn.net/baidu_38621657/article/details/141027014

5.写在后面

图形几何、数据处理、并行计算相关研究和研发,公众号:geometrylib,欢迎交流。

 

_________哈市雪花__________


http://www.ppmy.cn/embedded/129981.html

相关文章

[前端] ✨【如何用课程设计提升工程能力?】✨笔记

✨【如何用课程设计提升工程能力?】✨ 📚 课程设计真的在语言工具类课程中占据了“C位”!👑设计得好的课程简直像一个实战训练营,既能帮助学生巩固理论,又能培养解决复杂问题的能力,还能让他们…

麒麟aarch64架构下安装compat-openssl10

问题描述: 麒麟aarch64架构下安装mysql8.0.40,报错nothing provides libcrypto.so.10()(64bit) needed by 原因: 你当前系统的 OpenSSL 版本与 MySQL 8.0.40 所需的库不匹配。MySQL 8.0.40 需要 libcrypto.so.10,而你的系统使用的是 OpenS…

张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 “计算机专业 一定要优先报 网络安全 它是未来国家发展的大方向” 为什么推荐学网络安全? “没有网络安全就没有国家安全。”当前&#xff…

基于vue框架的的大连金州红星社区物业管理系统dg6co(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:楼栋信息,住户,社区投诉,设备报修,报修完成,车位信息,缴费信息,房屋信息,维修工,保安,来访人员,缴费申诉,公共设备,设备类型,消防设备,公共场地 开题报告内容 基于Vue框架的大连金州红星社区物业管理系统的设计与实现开题报告 一、研究…

C++ string的常用函数以及简单模拟实现

在C语言,字符串就是一个以\0结尾的char类型的数组,管理字符串可以使用string库中提供的一系列函数。然而,这些函数与字符串是分开的,不方便操作,还容易越界访问。 在C中,string是代表字符顺序的对象&#…

Java中的Vector,看着陌生?

Vector和ArrayList都是AbstractList的子类&#xff0c;二者有啥区别呢&#xff1f;Vector很少用&#xff0c;但是其父类Stack却常见在各类项目工程中。 public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.i…

Redis设计与实现 学习笔记 第九章 数据库

第9章到第14章属于本书第二部分&#xff1a;单机数据库的实现。 9.1 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态结构redis.h/redisServer的db数组中&#xff0c;db数组的每一项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库&…

Widget结构(一)

1、概念 Widget 是 UI 控件的基本抽象&#xff0c;它负责描述 UI 的一部分应该如何构建。每个Widget 都有一个对应的 RenderObject&#xff0c;负责实际的布局和绘制工作。Widget 不直接参与布局或绘制过程&#xff1b;它们只是描述了如何构建用户界面的一部分&#xff0c;并且…