|
主题: 讨论讨论CD的布尔运算的BUG.......
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#312003/7/10 12:41:18
在我看了很多资料之后,我总算大概知道Cd的运算中误差是怎么产生的......
如果接我前面的物体分类(这里就省了吧),分到最后大家会发现,所有物体的造型在进行布尔运算时都是基于节点运算的。节点的位置、节点句柄(也就是控制杆)的方向、长度决定着物体的轮廓。比如说要算两个物体的交集,先取得物体的节点数据算出形体,然后在得到的数据中可以找到在形体上相交的节点及其数据。因为节点控制这形体,因而也就得到了两个物件的交集。 误差的产生在于:取样精度(或者称文档精度)和计算精度的区别.......
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#322003/7/10 13:07:01
CD从6.0开始就对外宣称它的计算精度为小数点后7位数。原本这对我们的应用来说足够了。可是,有个问题。 取样精度首先不应该跟计算精度一个样。我们先假设CD的取样精度和计算精度都是整数。那么它在运算中遇到除法运算(在我所接触到的资料中有详细的贝塞尔曲线的计算方式,但很惭愧,我实在啃不下去,只看懂了一点,它绝对不是简单的加减算法所能实现的)例如3除以2,计算精度只能支持整数的话,计算的值就只能是2(假设它对余数的取舍是采用四舍五入)。当这个值返回CD的文件里要重绘物体的时候,由于文档也支持这个精度,CD的文件会忠实地将误差一一保留........
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#332003/7/10 13:16:31
syt说CD不够精确,这个说法有问题。它是太精确了,而计算精度却没办法跟到位,导致它死扣那些本应该忽略不记的细节。事实上这些精度是没必要存在的,我们根本不能觉查到0.0000001毫米的区别!
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#342003/7/10 13:36:06
图片如下: 图片如下: 图片如下: 图片如下: streakingant和syt得到的结果中残留的是点吗?不是,它实际上是一个封闭的子曲线。导致它看起来更象线的原因是文档精度和计算精度差距拉得不够........
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#352003/7/10 13:46:47
另一个问题是计算中即使精度够了,还存在着余数取舍的差距。其实我们无法分辨也没必要这么细微,通常都应该让系统有一个阀值,小于文档精度接受的余数,都一概予以融合(这方面也有人提出了算法),显然CD并没有考虑
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#362003/7/10 14:05:51
但是我无法解释两个问题: 1、在多次布尔运算后为什么CD会将一根封闭的曲线打断?(我贴的第一个例子其实不是一个封闭的曲线,它有四个断点,是一个复合曲线) 2、将外框转成曲线的物体进行布尔运算的特殊的地方......
|
清风 明月
职务:普通成员
等级:2
金币:7.1
发贴:514
|
#372003/7/10 18:16:47
我插一句。能否直接和CD的开发公司取得联系,来更全面的解释。哈哈
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#382003/7/10 18:38:11
能得到官方的权威解释当然好。但我不相信这个问题我是第一个发现的人,我同样不相信没有人向Corel公司反映过。但是直到今天CD依然如故,Corel公司仍然保持沉默........谁知道里面卖的什么膏药。
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#392003/7/10 20:26:14
等等吧。我这个问题还差一点没说完,那就是关于将外框转成曲线的物体进行布尔运算的特殊的地方,我虽然不能解释它的原因,但我却找到了解决的办法。......这一点相信对大伙有点意义吧。
|
5D荣誉斑竹
职务:普通成员
等级:5
金币:22.0
发贴:2854
|
#402003/7/10 21:33:27
等你写完我慢慢看,准备加精华。
|
SYT
职务:普通成员
等级:3
金币:6.0
发贴:1424
|
#412003/7/11 2:46:37
小刀的例子真奇怪,明明是两个物件相交,还是得出不合理的运算,我相信CD的开发组也不是傻瓜,肯定有其他致命的部分制抓着他们改良这个臭虫。 不知道其他的矢量软件会否出现同样的情况 如AI,CAD,FH,MAX。。。
|
streakingant
职务:普通成员
等级:3
金币:5.0
发贴:876
|
#422003/7/11 8:31:29
离弦小刀在上个帖子中说 引用: 等等吧。我这个问题还差一点没说完,那就是关于将外框转成曲线的物体进行布尔运算的特殊的地方,我虽然不能解释它的原因,但我却找到了解决的办法。......这一点相信对大伙有点意义吧。
streakingant和syt得到的结果中残留的是点吗?不是,它实际上是一个封闭的子曲线。导致它看起来更象线的原因是文档精度和计算精度差距拉得不够........ 我之前曾试图将那封闭的子曲线填满色,但只能改变曲线的“边框线”,里面的白色不行,小刀说找到了解决方法,是何方法?
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#432003/7/11 15:00:31
再给一个例子的文件: 相关文件: 点这儿打开这个文件用我举的第一个例子使用的命令,你会得到另一种效果。
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#442003/7/11 16:23:26
这是例子中的物体: 图片如下: 这是计算后的结果: 图片如下:
|
离弦小刀
职务:普通成员
等级:3
金币:7.0
发贴:1413
|
#452003/7/11 16:51:27
在这个例子中除了碰到计算错误之外还有另一个问题。它莫名其妙地删了两个节点。不仅仅是删除,而是活生生地忽略掉两个节点的信息。 图片如下:
|