欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 关于精度话题的杂谈

关于精度话题的杂谈

2025/2/13 23:35:11 来源:https://blog.csdn.net/baidu_38621657/article/details/145534604  浏览:    关键词:关于精度话题的杂谈

 浮点值的存储、运算都可能会带来精度损失,了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大,以及思考怎么避免或减少精度损失。

01 杂谈

     之前在CSDN上写过《关于float浮点值二进制存储和运算精度损失的话题》等几篇精度有关的文章,简述了精度损失的背后机制以及怎么保持较高的精度。

计算精度损失的主要原因包括二进制表示的限制、浮点数的存储方式、运算中的误差以及数据类型选择不当‌。

  • ‌二进制表示的限制‌

  • ‌浮点数的存储方式‌

  • ‌运算中的误差‌

  • ‌数据类型选择不当‌

02 运算中的误差积累

在图形几何算法中经常需要使用向量,在很多场景我们习惯于将向量单位化,如空间平面可以由平面法向和平面上一点来表示,可以转化为平面阐述方程:

a、b、c为平面法向量单位化后对应的XYZ坐标分量,d为原点到平面的距离。

基于此,我们可以进行平面相关的计算,如:

  • 点、线、面、实体等与平面关系判断;

  • 切割;

  • 构造表征实体的空间分区二叉树,进而进行实体相关计算;

  • 其他

如点与平面关系的判断,将点坐标带入方程,

  • 其值大于0时:点在平面外侧(正向方向);

  • 值小于0时:点在平面内侧(反向方向);

  • 值等于0时:点在平面上;

此过程理论没有问题,但在工程实际中可能就出问题了,如点与平面距离计算误差较大、某些边界情况下点与平面关系计算错误、某些边界情况下点与实体关系计算错误......

究其原因是文章开篇所述的几个原因点,但主要原因是法向量单位化导致误差,在后续计算中误差积累放大,在一些边界情况下,误差会导致错误!

试想一下,法向量单位化已经损失了精度,再使用单位化的法向量点乘一个值较大的向量时其结果可能“偏差”了很大,可能“失之毫厘,差之千里”。

有比较好的办法吗?

03 提高精度

本文不详细论述提高精度的办法,感兴趣可参考作者以往CSDN或公众号文章。

对于运算导致的误差,我们可以尽量避免使用精度损失较大的运算,如向量单位化、过多繁杂的计算过程。

对于平面法向量,我们可不进行单位化,使用原始计算的数据(可能是叉乘,也可能是Newell法计算而得),在后续平面相关计算中我们考虑法向量非单位化的情况(抵消法向量长度影响因素),如:

double distanceToUnboundPlane(const Vector3f& point, const Vector3f& planeNormalNotNormalized, const Vector3f& ptOnPlane)
{Vector3f vecTemp = point - ptOnPlane;return vecTemp.DotProduct(planeNormalNotNormalized) / planeNormalNotNormalized.Length();
}

放两张铺装算法中误差损失导致问题和提高运算精度的对比图:

放几张其他的图,

04 写在后面

原文:关于精度话题的杂谈

点(线)集最小包围外轮廓效果赏析

图形几何之美:凸分割和网格化

铺装算法可应用于地砖、墙砖、吊顶、纹饰等设计铺装和算量统计,由作者自主开发,已集成到GLViewer中,可试用,欢迎交流探讨~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com