Posted on 2019-09-22 22:39
eryar 閱讀(2088)
評論(0) 編輯 收藏 引用 所屬分類:
2.OpenCASCADE
OpenCASCADE點向圓柱面投影
eryar@163.com
OpenCASCADE的類Extrema_ExtPElS提供了點到基本曲面的投影計算功能,距離可能是最大值或是最小值。如下圖所示的點到圓柱的投影會有兩個投影點P1和P2,則點到圓柱的距離的最小值是P到P1的距離,最大值是P到P2的距離。本文主要是對此類中點到圓柱的投影算法進行分析。

類Extrema_ExtPElS類中計算點到圓柱的投影源碼列出如下:

結合源碼的注釋可以看出點P到圓柱S的投影主要按有如下步驟:
l 計算點P到以圓柱S軸線為法線的平面的投影點Pp;
l 若點P在軸線上,則計算失敗返回;
l 計算點Pp在圓柱U方向的參數U1(角度);
l 將參數U1(角度)加180度得到參數U2;
l 計算參數(U1,V),(U2,V)對應在圓柱面上的點;
上述實現主要也是使用向量的運算,所以程序簡單且性能高。其中保存的距離是距離的平方值,這種方式主要考慮的是自帶的開方函數性能,除非后面要用到距離才會自己去開方,這樣也是提供性能的一種處理方式。
OpenCASCADE的向量類gp_Vec提供了一個函數AngleWithRef(),查看源碼可知這個函數主要是計算兩個向量之間的夾角,其中參數向量Ref是用來處理角度的正負。當兩個向量叉乘的向量與參考向量Ref反向時,也會將得到的角度值取負。
下面通過一個簡單的小程序來將計算結果在Draw Test Harness中可視化,這樣可以直觀地驗證一下:

將生成的腳本文件加載到DRAW中得到如下圖所示的結果:

從上圖可以看出,投影得到的兩個點P1,P2的高度值與點P是相同的。
為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。