NCF参数化建筑论坛

标题: 关于grasshopper精度问题 [打印本页]

作者: /大兵夜明    时间: 2013-8-13 15:56
标题: 关于grasshopper精度问题
[attach]39693[/attach]
做项目时的一个心得:
Grasshopper中数值越大,运算时丢失的精度越多,做大型建筑时如果定位点尺寸较大,经过多次运算会导致模型与理论差距越来越大。一般在毫米级以下可以不管,但有时会达到几个毫米的误差。我一般将模型移动至原点(0,0,0)位置进行运算,最后再移动至实际定位点,这样只产生了两次较大的线性误差。

作者: 浮世拂尘—恒    时间: 2013-8-13 17:09
但是没有没有命令可以再中途,修正一下
作者: JiangLi.arch    时间: 2013-8-13 21:37
哦,这样啊。还没有做过实际项目,估计以后能用上。谢谢————不过不懂前辈说的“我一般将模型移动至原点(0,0,0)位置进行运算,最后再移动至实际定位点,这样只产生了两次较大的线性误差。”什么叫实际定位点。你的意思是将很多东西在靠近原点运算,最后一步通过移动到实际定位,然后就不继续运算了么?
作者: thinksong    时间: 2013-8-13 21:55
本帖最后由 thinksong 于 2013-8-13 23:30 编辑
JiangLi.arch 发表于 2013-8-13 21:37
哦,这样啊。还没有做过实际项目,估计以后能用上。谢谢————不过不懂前辈说的“我一般将模型移动至原点 ...

我曾经学习过 Bentley MicroStation 的时候,就听说了,离原点越近,越精确,这与计算机计算有关系,当时记的比较模糊,改天从新温习下,这个误差貌似真的存在,但Gh什么情况,偶就不晓得嘞

作者: /大兵夜明    时间: 2013-8-13 23:36
JiangLi.arch 发表于 2013-8-13 21:37
哦,这样啊。还没有做过实际项目,估计以后能用上。谢谢————不过不懂前辈说的“我一般将模型移动至原点 ...

恩,很多项目轴网离原点是很远的,1比1在实际位置建模会有较大误差
作者: 999de爱    时间: 2013-8-14 08:28
多谢分享!!
作者: JiangLi.arch    时间: 2013-8-14 08:49
/大兵夜明 发表于 2013-8-13 23:36
恩,很多项目轴网离原点是很远的,1比1在实际位置建模会有较大误差

那是不是可以通过缩放比例的方式来解决。比如开始以米为单位,最后用乘法,这样的误差怎样?
作者: 几度天狼    时间: 2013-8-14 09:16
很难相信这是真的……
作者: 老小开    时间: 2013-8-14 10:23
才明白以前要在原点建模的原因

作者: pink58972    时间: 2013-8-14 14:33
GH 是依赖 Rhino 系统单位的   一般Rhino精度用在建筑行业是已经足够了   还要看你要建什么模型 要建到什么深度  一开始就要 设置好单位的精度。。。
作者: wrq329    时间: 2013-8-14 16:06
为什么有这种情况发生呢。。?
好神奇。。。
作者: zyfeiniao    时间: 2013-8-14 21:07
在现有的施工技术条件下,虽然参数化无限接近最精准的定位数值,但实际工程中多次累加各种误差后,定位基本都会有问题,比如结构按定位的做完后,再安装幕墙,就需要现场实测之后,重新划分板块下料。
作者: wuhawuhababy    时间: 2013-8-14 21:56
thinksong 发表于 2013-8-13 21:55
我曾经学习过 Bentley MicroStation 的时候,就听说了,离原点越近,越精确,这与计算机计算有关系,当时 ...

不仅是 Microstation 就是常用的CAD也是如此 离原点越远 偏差越大(感觉是内部作图范围制定时的问题)
作者: thinksong    时间: 2013-8-14 22:01
zyfeiniao 发表于 2013-8-14 21:07
在现有的施工技术条件下,虽然参数化无限接近最精准的定位数值,但实际工程中多次累加各种误差后,定位基本 ...

言之有理,所以需要  物联网。
作者: zhiaixu2010    时间: 2013-8-15 15:56
本帖最后由 zhiaixu2010 于 2013-8-15 16:02 编辑

真相帝来也......
——————————————————————————————————————————————————————
其实所谓的离原点越近越精确只是一种感性的说法,当你的数据位数超过16位,那么告诉你,这个数从16位以后绝对是不精确的,而且即便位数没有超过16位,对于小数点过多或者某些特殊的小数在小数点6位以后都是不精确的......WHY?
——————————————————————————————————————————————————————
让我们首先温习一下计算机对于实型数据的储存方式:
计算机储存数据的最小单位是bit(位),一字节(byte)=8bit,对于实型数据,分为float(单精度浮点)和double(双精度浮点)(C中还有long double),float在内存中占用的大小为4字节(32位),double占用8字节(64位)。在此我们只关注double类型,因为float的存储量比较小。double类型的64个内存位置能储存64个二进制数(63+1个符号位),所能表示的十进制数为15~16位,也就是说对于超过16位的十进制数,编译系统只会对其前15~16个有效位数进行计算,
如同楼主的第一张图
[attach]39702[/attach]
系统只会计算前16个1的减法,结果当然是0......
——————————————————————————————————————————————————————
重点来了,那为什么会出现接下来的情况呢?如同楼主接下来的图
[attach]39703[/attach]

这个就是在最开始说的,即便是没有超过16位的double类型,在转换为二进制的过程中同样会有精度损失
为了说明这不是GH独有的情况,我们在Visual studio 2010中使用C++做测试:
如图,上半部是简单的z=x-y代码,重点是下面红色的z数值
[attach]39704[/attach]
为什么在0.123456末尾多出了许多奇怪的数?
————————————————————————————————————————————————————
举个栗子...
对于十进制数12.34如何储存为二进制浮点数?
首先将整数和小数分开,分别用二进制表示
整数部分很简单,相信大家都知道,就是不停地除2,最后把余数由后到前排列,
即12=1100,
而小数部分则是不停地乘2,将乘积的整数部分由前向后排列,
即0.34=0.0101011111...,我们发现小数部分*2永远乘不尽,就是说不可能出现没有小数的时候,所以此浮点数就无法被精确的转换成二进制。这就是误差产生的原因,后面具体转换成二进制就不再赘述。
————————————————————————————————————————————————————
最后,避免这种“误差”的最好办法就是减少位数,一个是单位的转换,二是把位数多的数据拆分成几个部分(整数+小数or短整数),再进行计算,切记,总位数保证在16位以内会减少大部分的误差......@thinksong


作者: 犬少    时间: 2013-8-15 15:59
楼上真相帝!学习了
作者: xielanmin    时间: 2013-8-16 08:41
在精度要求不要高的情况下,比如曲面衔接差个3、5毫米,犀牛建模可以说忽略不计,我的模型量量差了这一点,放过就放过,当作没发生就好了。。。

但是,当模型数据要转入到力学分析时,所有要计算的组成部分必须丝毫不差,所以很多力学模型,只有选择在原有框线基础上重画,失之毫厘,差之千里。。。
作者: JiangLi.arch    时间: 2013-8-16 20:14
musikerz 发表于 2013-8-14 16:48
转换单位的话,计算误差更大,别忘了人是十进制动物,而电脑是二进制机器。

哦,哦,是这样说。我只知道设置里面有容差的选项,只要在你选择范围内他就可以运算,超出了那个数据就挑选不出来,这样就可以控制了吧
作者: JiangLi.arch    时间: 2013-8-16 20:17
zhiaixu2010 发表于 2013-8-15 15:56
真相帝来也......
————————————————————————————————————————— ...

真相帝,学习了。等以后用得到在看这个根本原因吧,现在看了一堆头大。我觉得@zyfeiniao 的方法更好吧。就是到了实际工程进行测量,在测量后的数据上进行设计————不过要是异形的估计设计师就不干了。哎,这问题得大家共同努力才能解决啊
作者: 794779857lock    时间: 2013-8-17 19:38
zhiaixu2010 发表于 2013-8-15 15:56
真相帝来也......
————————————————————————————————————————— ...

碉堡,来看看,直接用 mm单位就能减少误差了吧
作者: jek    时间: 2013-8-19 02:53
学到东东了!谢谢楼主
作者: jasonroc    时间: 2013-8-19 10:27
学习了,涨姿势了~
作者: yal7    时间: 2013-8-19 16:46
zhiaixu2010 发表于 2013-8-15 15:56
真相帝来也......
————————————————————————————————————————— ...

长姿势啊!
作者: /大兵夜明    时间: 2013-8-20 01:13
zhiaixu2010 发表于 2013-8-15 15:56
真相帝来也......
————————————————————————————————————————— ...

的确,根本原理是这样子的,但是这种减少误差的方式是不能用在建模上的,你不能在一次次操作模型的同时去处理模型的每个坐标而减少误差。实际上一般工程尤其是直面的,建筑师在设计的时候模型定位中心离原点都不会太远。但是大面积的异性建筑就不一样了,比如几个大圆弧构成的轮廓,通常半径会在10^8~10^11mm之间,也就是说模型尺寸的数量级或许不是非常大,但是模型距原点的位置却非常远,那么每块面每条线每个点的坐标值也会非常大。虽然说其实10^11mm这样的数量级可能影响的只是小数点后3位,但是在复杂的运算器运算过程中不可避免的让这种误差成倍增长,也或许最终下来误差并没有想象中那么大,但是我不知道什么时候它会出现,比如两条该相交的线不相交了,该共面的不共面了。也不是因为业主要求非常高的精度,人的要求是很低的,然而软件的要求却是很高的,所以为了不必要的麻烦,我养成了这种习惯,稍微大点的模型我都会先移动定位点再建模。
作者: hyycq    时间: 2013-8-21 11:02
学习了。这个还是挺有讲究的。
作者: 246817923    时间: 2014-1-15 16:14
感謝分享,學習了
作者: 灬明|_|光灬    时间: 2014-1-17 16:22
学习了学习了,以前发现了这个问题,但是不知道为什么。看了这个帖子明白了,多谢多谢~~~~~
作者: ymf813    时间: 2014-2-28 12:27
zhiaixu2010 发表于 2013-8-15 15:56
真相帝来也......
————————————————————————————————————————— ...

从专业的角度解释,明白了,谢谢
作者: Zzzzkee    时间: 2014-3-3 14:37
真相帝的身份配上迈克尔杰克逊的头像,超级高大上的感觉。。。不食人间烟火~~~
作者: xxyluo    时间: 2014-3-17 00:37
谢谢楼主 学习了
作者: 塞林格    时间: 2014-4-8 11:08
你说的这个问题这么屌,Gh编程的人知道吗?
作者: 塞林格    时间: 2014-4-8 11:10
再补充一下,我是外行,有个问题,计算机算得那么精确,实际制造工艺的精度能不能达到呢?
作者: /大兵夜明    时间: 2014-4-10 15:02
塞林格 发表于 2014-4-8 11:10
再补充一下,我是外行,有个问题,计算机算得那么精确,实际制造工艺的精度能不能达到呢?

计算机算浮点数实际都是不准的,这个误差看你的设定,gh默认精度是6位,当然可以再调高一点,为什么建模要把世界坐标放到项目附近不能太远,如果你做了大体量的项目就会知道了,如果离得非常远,比如可能出现的情况,明明四点共面但就是显示不共面,明明很简单的曲线偏移就是偏移不了,明明物体相交了但是就是剪切不了。在revit里有两个坐标原点,其实就是这个道理,一个是勘测原点,一个是项目原点。




欢迎光临 NCF参数化建筑论坛 (http://bbs.ncf-china.com/) Powered by Discuz! X3.2