OpenCASCADE BRep Precision
eryar@163.com
Abstract: Several geometric representations maybe attached to a topological(B-Rep) object. These representations are similar but rarely identical. For modeling algorithms, it is necessary to know exactly the precision associated with this approximation. The numeric value of this precision is called tolerance. It defines the zone in which all geometrical representations of the object are located.
Keywords: OpenCASCADE, BRep, Precision, Tolerance
1 Introduction
在計(jì)算機(jī)中表示浮點(diǎn)數(shù)是有精度限制的,浮點(diǎn)數(shù)的相等比較一般使用鄰域比較技術(shù),就是在指定精度的前提下比較兩個(gè)浮點(diǎn)數(shù)是否相等。在邊界表示法BRep中同一個(gè)拓樸體可以附加幾種幾何表示,如拓樸點(diǎn)Vertex有如下幾何表示方法:
- 一個(gè)三維點(diǎn);
- 一條曲線和曲線上的參數(shù)u;
- 一個(gè)曲面上的一對參數(shù)u,v;
這幾種幾何表示方法表示的是同一個(gè)對象,但因?yàn)楦↑c(diǎn)數(shù)精度限制,這幾種幾何數(shù)據(jù)并不能完全相同的。對于造型算法有必要知道拓樸體上的精度值。BRep上關(guān)聯(lián)的精度值稱為容差Tolerance。Vertex點(diǎn)的容差是包圍點(diǎn)且以精度值為半徑的球體;Edge邊的容差是包圍曲線且以精度值為半徑的管道;Face的容差是包圍曲面且以精度值為厚度板:

精度是幾何造型內(nèi)核一個(gè)重要指標(biāo),且影響數(shù)值算法性能及穩(wěn)定性Robust。在OpenCASCADE中,精度還有一個(gè)要求:

2 Unit and Precision
對于幾何內(nèi)核中的數(shù)值1代表什么,一般人可能習(xí)慣性地將其與毫米mm單位關(guān)聯(lián),覺得是1mm。建模時(shí)單位的選擇會對精度有很大影響,因?yàn)椴煌瑔挝粫?dǎo)致數(shù)據(jù)小數(shù)位數(shù)的變化。如對芯片內(nèi)部結(jié)構(gòu)建模,芯片的尺度是納米,若以毫米以單位,則要構(gòu)造出芯片內(nèi)部有些結(jié)構(gòu),對幾何內(nèi)核精度要求會更高;若以納米為單位,則對幾何內(nèi)核精度要求會低些。

由此可見,幾何內(nèi)核中的數(shù)值1無單位的,需要根據(jù)模型的尺度選擇合適的單位。單位只針對三維模型空間中的曲線曲面,由于曲線曲面用參數(shù)方程表示,所以曲線的參數(shù)空間是一維空間,曲面的參數(shù)空間是二維空間。參數(shù)空間的數(shù)是沒有單位的。如一個(gè)圓,不管其位置和半徑如何,其參數(shù)空間總是從0~2PI。所以在設(shè)置精度時(shí),需要區(qū)分是模型空間還是參數(shù)空間。
3 BRep Precision
在OpenCASCADE中通過類BRep_Builder來設(shè)置邊界表示法中包含幾何信息的點(diǎn)、邊和面來設(shè)置容差。如設(shè)置面的容差函數(shù)為:

修改容差也可以通過類BRep_Builder中的Update相關(guān)函數(shù),更高級直接的修改容差的類是ShapeFix_ShapeTolerance。

查詢?nèi)莶钚枰褂妙怋Rep_Tool:

從查詢?nèi)莶詈瘮?shù)的實(shí)現(xiàn)代碼中可以看出,在OpenCASCADE中容差的最小值是Precision::Confusion(),即1.e-7。即使設(shè)置的容差小于1.e-7,查詢?nèi)莶畹臅r(shí)候也是1.e-7。即OpenCASCADE中BRep表示的建模極限是1.e-7。如以米為單位,要去對納米的物體建模,在OpenCASCADE中是做不到。
5 Primitive Tolerance
使用OpenCASCADE內(nèi)置的構(gòu)造基本體的算法來構(gòu)造BRep體時(shí),默認(rèn)的容差值就是Precision::Confusion(),(1.e-7)即使用了最高精度。如創(chuàng)建圓錐體時(shí)其高度Height值最小為Precision::Confusion()。

創(chuàng)建長方體Box時(shí)各邊長度的最小值也是Precision::Confusion():

4 Geometry Precision
在OpenCASCADE中幾何曲線和曲面都是用參數(shù)方程來表示的,幾何的意思就是數(shù)學(xué)方程,是精確的數(shù)學(xué)表示沒有容差。
但是幾何相關(guān)的算法如求交Intersection、投影Project及定位Classifier都與精度密切相關(guān)。如定位算法Classifier判斷點(diǎn)是否在線/面上等。而求交的算法實(shí)現(xiàn)都是數(shù)值方法,數(shù)值算法的迭代次數(shù)和終止條件都與精度直接相關(guān),從而影響算法性能及穩(wěn)定性。如計(jì)算解析曲面求交算法中默認(rèn)容差:

解析曲面幾何求交算法中的默認(rèn)容差:

有些容差值是寫在代碼中不能修改,這些容差值都要比BRep中的極限容差值1.e-7要小,即幾何算法中硬編碼的一些容差要小于BRep中的容差值。由此可見幾何算法中的精度要高于BRep中的精度,從而保證算法的正確性。
6 Fuzzy Tolerance
在布爾運(yùn)算中,BRep體的容差值會作為幾何算法的精度輸入。在Draw Test Harness中可通過如下命令設(shè)置容差:
Draw[1]> help settolerance
settolerance : shape [mode=v-e-f-a] val(fix value) or tolmin tolmax
Draw[2]> settolerance s1 a 0.001
下面以兩個(gè)模型做布爾減CUT操作為例,看看不同的容差布爾支算所需要時(shí)間有什么不同。通過左邊Tcl腳本導(dǎo)入兩個(gè)模型,再使用命令settolerance設(shè)置容差為0.01,最后布爾運(yùn)算花費(fèi)0.2414661秒。

將命令settolerance注釋掉,使用模型默認(rèn)容差1e-7,看所需要的時(shí)間:

從上面的例子看到容差的提高所需時(shí)間沒有太大區(qū)別。若BRep的容差會作為幾何算法的容差輸入,理論上設(shè)置BRep容差會對布爾運(yùn)算有影響。

在二次解析曲面求交的數(shù)值算法中,容差參數(shù)直接省略沒有使用。在二次解析曲面求交的幾何算法中,容差主要用來判斷一些接觸時(shí)是否相交。在更底層的數(shù)值算法庫math中使用了內(nèi)置硬編碼的更高的精度。如下圖所示為多項(xiàng)式求根的數(shù)值算法中內(nèi)置的精度為1.0e-30,遠(yuǎn)高于BRep中的1.0e-7。這樣做避免了BRep容差對底層算法的影響,但是高精度犧牲了一些數(shù)值算法性能。

由此可見,容差主要影響接觸時(shí)情況的處理,處理結(jié)果直接影響求交的結(jié)果。在布爾運(yùn)算中使用默認(rèn)容差為1e-7不相交的,但實(shí)際應(yīng)用場景只要1e-3的容差,則會相交。會導(dǎo)致布爾運(yùn)算結(jié)果與預(yù)期不符。為了提高布爾運(yùn)算穩(wěn)定性引入Fuzzy容差的概念。在相交計(jì)算中Fuzzy容差的使用代碼如下:

其他相交計(jì)算中關(guān)于Fuzzy容差的處理都是類似的,具體可以參考類IntTools_EdgeFace和IntTools_FaceFace。通過引入Fuzzy容差設(shè)置,在原有BRep容差基礎(chǔ)上加上Fuzzy/2來擴(kuò)大容差范圍,可以處理布爾運(yùn)算中接觸的情況,提高布爾運(yùn)算穩(wěn)定性。下面使用Tcl腳本演示Fuzzy容差的使用場景:
box b 10 10 10
pcylinder c 5 20
ttranslate c 5 5 0.00001
bfuzzyvalue 0.00001
bcut r b c
當(dāng)使用布爾運(yùn)算標(biāo)準(zhǔn)容差時(shí),可以把bfuzzyvalue這行注釋掉。

創(chuàng)建一個(gè)長方體和圓柱體,并將圓柱體沿Z方向移動0.00001。

上圖左邊為使用標(biāo)準(zhǔn)容差,默認(rèn)為1e-7。右邊為設(shè)置Fuzzy容差效果。
7 Conclusion
綜上所述,幾何內(nèi)核中的數(shù)是沒有量綱的,可以根據(jù)模型的尺度選擇合適的單位。OpenCASCADE中BRep體模型最小建模精度為1.e-7。幾何數(shù)據(jù)使用參數(shù)方程表示,是精確的數(shù)學(xué)表示,但是幾何算法是有精度的。有些幾何算法中有些精度是硬編碼的不能修改,這類精度值都要高于1.e-7。有些精度是通過BRep中的拓樸點(diǎn),邊和面?zhèn)鬟f過來的。為了提高布爾運(yùn)算的穩(wěn)定性,引入Fuzzy容差,解決一些接觸的容差問題。
8 下載PipeCAD
現(xiàn)在可以直接在Github上下載PipeCAD個(gè)人版免費(fèi)使用:
https://github.com/eryar/PipeCAD/releases

國內(nèi)用戶可以加入PipeCAD QQ交流群964851855,在群文件中下載PipeCAD最新版本。
PipeCAD自帶Sample示例項(xiàng)目,可以通過用戶SYSTEM,密碼XXXXXX來登錄項(xiàng)目體驗(yàn)PipeCAD。關(guān)于PipeCAD的使用方法可以先查看PipeCAD相關(guān)的操作視頻:
https://space.bilibili.com/1548012589
歡迎大家下載使用,反饋意見或參與開發(fā),來一起完善PipeCAD。大家可以掃描下方二維碼加入PipeCAD QQ群,一起交流使用PipeCAD的經(jīng)驗(yàn)心得。PipeCAD QQ交流群 964851855。

注意事項(xiàng):目前PipeCAD正處于測試階段,建議根據(jù)需要將項(xiàng)目數(shù)據(jù)進(jìn)行備份,以防數(shù)據(jù)丟失。