cad 系統出於精度的要求,通常使用曲線和曲面對模型進行精確表示,因此曲線、曲面的幾何表示,就是比較基礎也比較重要的東西了。
通常,曲線、曲面的表示有三種方式:
顯示表示:形如:曲線的 y = f(x)
隱式表示:行如: f(x,y) = 0
引數表示,形如: x(t) = u(t),y(t) = v(t)
習慣上,選擇引數表示形式,優點是有比較明確的幾何意義,方便構造和顯示等。
occt 的 geometry 曲線和曲面表示形式,符合 step 標準中的定義。如下使其繼承圖(下面以 3d 為主):
geom_geometry
----geom_axisplacement
--------geom_axis1placement
--------geom_axis2placement
----geom_curve
--------geom_boundedcurve
----------------geom_beziercurve
----------------geom_bsplinecurve
----------------geom_trimmedcurve
--------geom_conic
----------------geom_circle
----------------geom_ellipse
----------------geom_hyperbola
----------------geom_parabola
--------geom_line
--------geom_offsetcurve
--------shapeextend_complexcurve
----geom_point
--------geom_cartesianpoint
----geom_su***ce
--------geomplate_su***ce
--------geom_boundedsu***ce
----------------geom_beziersu***ce
----------------geom_bsplinesu***ce
----------------geom_rectangulartrimmedsu***ce
--------geom_elementarysu***ce
----------------geom_conicalsu***ce
----------------geom_cylindricalsu***ce
----------------geom_plane
----------------geom_sphericalsu***ce
----------------geom_toroidalsu***ce
--------geom_offsetsu***ce
--------geom_sweptsu***ce
----------------geom_su***ceoflinearextrusion
----------------geom_su***ceofrevolution
--------shapeextend_compositesu***ce
----geom_vector
--------geom_direction
--------geom_vectorwithmagnitude
這裡主要看 curve 和 su***ce 。
curve 是空間的曲線。主要四大類:直線、有界曲線、二次曲線、偏移曲線。
直線很簡單,由一點和方向定義。直線是無界曲線,向兩端無限延伸。引數公式為:
p (u) = o + u*dir 其中, u 為引數, o 為一點, dir 為方向。
有界曲線,顧名思義是有界限的曲線。主要是三類曲線, bezier 、 bspline 曲線定義容易知道,最後乙個geom_trimmedcurve 是將乙個 curve 使用兩個引數值界定後得到的裁減曲線,例如,如果要表示乙個線段,則需要對直線使用引數範圍進行界定,獲得。
二次曲線是空間的二次曲線,首先是平面上的曲線。在空間如何定義二次曲線?主要是定義乙個座標系,然後在座標系內部,二次曲線的定義和平面二次曲線的定義一致。具體來說,各自的引數公式可以看出這點,如下:
geom_circle :
p(u) = o + r*cos(u)*xdir + r*sin(u)*ydir
其中 o xdir ydir 構成了圓所在平面的座標系, u 為引數,範圍 [0,2pi], 下面類似。
geom_ellipse :
p(u) = o + majorrad*cos(u)*xdir + minorrad*sin(u)*ydir
和 circle 類似,只是有長短半徑的區別。
geom_hyperbola :
p(u) = o + majrad*cosh(u)*xdir + minrad*sinh(u)*ydir
注意:是 sinh 、 cosh , u 範圍從負無窮到正無窮。
geom_parabola :
p(u) = o + u*u/(4.*f)*xdir + u*ydir
u 範圍從負無窮到正無窮。
下面是偏移曲線,即將一條曲線,偏移一定的距離獲得的曲線。首先,要求被偏移曲線是平面曲線,否則無法偏移。其次,偏移的方向,是曲線切矢和乙個參考向量叉乘後獲取的向量的方向,通常參考向量為平面所在平面的法矢。
下面來看曲面的表示。曲面分為四大類:有界曲面、基本曲面、偏移曲面和掃掠曲面。
下面依次來看:
有界曲面:
顧名思義,有界曲面是引數域有界的曲面。這裡 bezier 和 bspline 曲面定義比較清楚。geom_rectangulartrimmedsu***ce 曲面是乙個曲面由引數域 [u1,u2] × [v1,v2] 界定的部分,是最基本的裁剪曲面。
基本曲面:
基本曲面描述了定義在乙個區域性座標系內部的引數曲面。下面列出各個曲面的引數公式:
平面:p(u, v) = o + u*xdir + v*ydir
這裡, o 、 xdir 、 ydir 定義了區域性座標系。 u 、 v 為引數,平面是無界曲面,引數域為無窮大區域。
特別注意:區域性座標系不一定非要是右手座標系,也可能是左手座標系,主要用於拓樸中 topods_face 的方向為reversed 是的曲面表示。這適用於所有基本曲面。
球面: geom_sphericalsu***ce
p(u,v) = o + r*cos(v)*(cos(u)*xdir + sin(u)*ydir)+r*sin(v)*zdir
引數 u 屬於 [ 0, 2.*pi ] , v 屬於 [ - pi/2., + pi/2. ] 。公式貌似複雜,但只要畫個圖,運用一點幾何知識,公式是顯而易見的。
柱面: geom_cylindricalsu***ce :
p (u, v) = loc + radius * (cos (u) * xdir + sin (u) * ydir) + v * zdir
錐面: geom_conicalsu***ce
p(u, v) = o + (r + v*tan(ang)) * (cos(u)*xdir + sin(u)*ydir) + v*zdir
geom_toroidalsu***ce :
p(u, v) = o + (r + r*cos(v)) * (cos(u)*xdir + sin(u)*ydir ) + r*sin(v)*zdir
偏移曲面
就是將乙個曲面偏移一定的距離獲得的曲面。這裡僅僅是簡單的表示,沒有考慮曲面自交等複雜的情況。實際上,偏移曲面是乙個很複雜的曲面,需要很多的處理。
掃掠面:
包括拉伸面和旋轉面,兩種最常使用的曲面,都通過將乙個曲線沿另乙個曲線掃掠獲得的曲面。
拉伸面,將乙個曲線沿某個向量拉伸,獲得的曲面。
旋轉面,將乙個曲線繞某個方向旋轉,獲得的曲面。
還有兩個曲面類,是系統內部使用的,不是 step 的標準形式。。其中 geomplate_su***ce 類是生成過渡麵時使用的類,用於 n 邊補洞等,比較複雜。
上述就曲線和曲面做了乙個簡單的總結,只有掌握了基本的曲線曲面形式,才能夠對很多演算法有深入的理解,才能對後面的拓樸結構有比較深入的理解。
專案3 單鏈表的應用(3)
檔名稱 main.cpp,linklist.cpp,linklist.h 完成日期 2015年10月12日 版本號 vc 6.0 問題描述 如下 輸入描述 無 程式輸出 y or n 問題及 3 設計乙個演算法,判斷單鏈表l是否是遞增的。實現這個演算法,並完成測試。ifndef linklist h...
關於 0x3f3f3f3f 的問題
0x3f3f3f3f是乙個很有用的數值,它是滿足以下兩個條件的最大整數。1 整數的兩倍不超過 0x7f7f7f7f,即int能表示的最大正整數。2 整數的每8位 每個位元組 都是相同的。我們在程式設計中經常需要使用 memset a,val,sizeof a 初始化乙個陣列a,該語句把數值 val ...
CSS3的幾個標籤速記3
transition css3過渡 css3裡很好的乙個標籤,可以非常方便的完成需要很多js才能完成的動態效果 例語法 transition width 2s,height 2s,transform 2s css3動畫 keyframes 使一種樣式逐漸變為另一種樣式的過程 1 doctype ht...