Make Helix Curve in OpenCASCADE
Abstract. OpenCASCADE does not provide helix curve directly, but you can build a helix curve by the pcurve of a surface(curve on surface). When you understand the pcurve of a surface, you can make a helix curve easily. The paper first make a helix by Tcl in Draw Test Harness, then translate the Tcl script to OpenCASCADE C++ code.
Key Words. OpenCASCADE, Helix Curve, PCurve, Sweep, Spring
?
1. Introduction
螺旋線是實踐中常用到的曲線,例如平頭螺絲釘的外緣曲線就是螺旋線。當我們擰緊平頭螺絲釘時,它的外緣曲線上的任一點M一方面繞螺絲釘的軸旋轉,另一方面又沿平行于軸線的方向前進,點M就走出一段螺旋線。[1]
如果空間一點M在圓柱面x*x+y*y=a*a上以角速度ω繞z軸旋轉,同時又以線速度υ沿平等于z軸正方向上升(其中ω,υ都是常數),那未點M構成的圖形叫螺旋線。其參數方程為:
Figure 1.1 A Helix Curve
OpenCASCADE 中并沒有直接提供構造螺旋線的類和函數,因此只有自己來構造了,其中構造的核心是要理解PCurve(曲面的參數曲線)。本文先以Tcl腳本在Draw Test Harness中快速生成一個螺旋線,再將相應的Tcl腳本轉換成C++代碼。在理解Pcurve概念的基礎上來構造螺旋線還是很簡單的,甚至還可以擴展 應用。
2.Make Helix Curve
在OpenCASCADE提供的一個經典例子:生成一個酒瓶中,就有螺旋線的應用,即生成瓶口處的螺紋。當時看這例子的時候也是沒有完全理解,究竟怎么生成的那個螺旋線?感謝lifenli的提醒,使我又重溫了一遍例子,頓時茅塞頓開,明白了pcurve的一個應用。
由《OpenCASCADE BRep Format》[4]中可知,圓柱面的參數方程為:
假設當你在參數空間[u,v]中創建一條二維曲線后,可根據這個二維曲線來計算對應曲面上的三維曲線。根據二維曲線的不同定義,得到的結果如下:
條件 |
參數方程 |
參數曲線 |
U=0 |
S(v)=P+r*cos(u)+vDz |
與Z軸平行的直線 |
V=0 |
S(u)=P+r*(cos(u)*Dx+sin(u)*Dy) |
與XOY面平行的圓 |
U!=0?&&?V?!=?0 |
S(u,v)=P+r(cos(u)*Dx+sin(u)*Dy)+vDz |
螺旋線 |
# # make helix curve in OpenCASCADE. # Shing Liu(eryar@163.com) # 2015-07-08 22:00 # pload MODELING VISUALIZATION cylinder aCylinder 6 line aLine2d 0 0 1 1 trim aSegment aLine2d 0 2 * pi mkedge aHelixEdge aSegment aCylinder 0 6 * pi vdisplay aHelixEdge
Figure 2.1 Make a helix by Tcl script
上述Tcl腳本可以很容易的轉換成C++代碼的,下面給出相應的C++實現,源碼如下所示:
#define WNT #include <gp_Lin2d.hxx> #include <GCE2d_MakeSegment.hxx> #include <Geom_CylindricalSurface.hxx> #include <BRepBuilderAPI_MakeEdge.hxx> #include <TopoDS_Edge.hxx> #include <BRepTools.hxx> #pragma comment(lib, "TKernel.lib") #pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKG3d.lib") #pragma comment(lib, "TKBRep.lib") #pragma comment(lib, "TKGeomBase.lib") #pragma comment(lib, "TKTopAlgo.lib") void makeHelix( void ) { Handle_Geom_CylindricalSurface aCylinder = new Geom_CylindricalSurface(gp::XOY(), 6.0 ); gp_Lin2d aLine2d(gp_Pnt2d( 0.0 , 0.0 ), gp_Dir2d( 1.0 , 1.0 )); Handle_Geom2d_TrimmedCurve aSegment = GCE2d_MakeSegment(aLine2d, 0.0 , M_PI * 2.0 ); TopoDS_Edge aHelixEdge = BRepBuilderAPI_MakeEdge(aSegment, aCylinder, 0.0 , 6.0 * M_PI).Edge(); BRepTools::Dump(aHelixEdge, std::cout); BRepTools::Write(aHelixEdge, " d:/helix.brep " ); } int main( int argc, char * argv[]) { makeHelix(); return 0 ; }
參數空間中pcurve的斜率決定了螺旋線的螺距pitch,當其他參數不變,改變斜率后得到如下圖所示結果:
Figure 2.2 Different Pitch by different K
由圖可知,當pcurve的斜率越小時,得到的螺旋線的螺距也越小。修改pcurve的斜率只需要修改上述Tcl腳本中的aLine2d的斜率。
如當斜率k=1時的pcurve為:
當斜率k=1.0/5.0時的pcurve為:
當斜率k=1.0/10.0時的pcurve為:
可以自己嘗試修改看看沒的斜率得到的不同螺旋線的螺距變化。
3.Spring: Sweep profile along helix
得到螺旋線后自然就想到能不能用一個圓沿著螺旋線來放樣,從而得到一個彈簧。下面還是用Tcl腳本在Draw Test Harness中嘗試一下,相應的C++實現也是很容易找到相關的類。
# # make helix curve in OpenCASCADE. # Shing Liu(eryar@163.com) # 2015-07-08 22:00 # pload MODELING VISUALIZATION cylinder aCylinder 6 line aLine2d 0 0 1 1 trim aSegment aLine2d 0 2 * pi mkedge aHelixEdge aSegment aCylinder 0 6 * pi # there is no curve 3d in the pcurve edge. mkedgecurve aHelixEdge 0.001 wire aHelixWire aHelixEdge circle profile 6 0 0 0 4 1 1 mkedge profile profile wire profile profile mkplane profile profile pipe aSpring aHelixWire profile vdisplay aSpring vsetmaterial aSpring steel vsetgradientbg 180 200 255 180 180 180 2 vsetdispmode 1 vzbufftrihedron # set ray tracing if { ! [catch {vrenderparams -raytrace -shadows -reflections -fsaa -rayDepth 5 }] } { vtextureenv on 1 }
Figure 3.1 Spring by sweep a circle along a helix path
當將pcruve在圓錐面上生成三維曲線時就會得到類似夏天的蚊香那樣螺旋形狀。同樣使用上述代碼,只是將圓柱面改成圓錐面得到:
Figure 3.2 Mosquito Coil
4.Conclusion
綜 上所述,常見的計算幾何造型書中講到曲線的參數方程都會以螺旋線為經典例子,甚至是高等數學中也是一樣,由此可見螺旋線是很常見的一種曲線。但是occ中 并沒有直接提供螺旋線的幾何曲線,只有通過pcurve來構造了。所以理解pcurve后,才好理解make bottle例子中的瓶頸螺紋部分的代碼。
通過將一個輪廓沿著螺旋線掃掠可以得出很多有意思的模型。在使用sweep的過程中發現pcurve生成的邊Edge中并沒有三維幾何曲 線,所以會導致算法失敗。最終發現occ提供了一個將pcurve生成的邊中生成出一個擬合三維幾何曲線的函數 BRepLib::BuildCurve3d()。對于一些在曲面上的曲線的造型可以參考這種用法,用pcurve來構造。
5. References
1. 同濟大學數學教研室. 高等數學(上). 高等教育出版社. 1978
2. Helix. http://mathworld.wolfram.com/Helix.html
3. OpenCASCADE Make Bottle Tutorial. 2015
4. OpenCASCADE BRep Format. 2015
5. 莫勇,常智勇. 計算機輔助幾何造型技術. 科學出版社. 2009
?
PDF Version and Tcl Script Make Helix Curve in OpenCASCADE
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
