• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            OpenCASCADE二維曲線求交

            Posted on 2023-12-02 12:22 eryar 閱讀(1732) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCASCADE二維曲線求交

            1 Introduction

            OpenCASCADE中對二維曲線求交和三維曲線求交是不同的,三維曲線求交統一使用離散法,二維曲線求交根據曲線類型的不同分種類型進行處理。二維曲線求交中還提供了計算自交的直接接口。在TKGeomAlgo中,主要內容就是擬合、求交算法,理解求交算法的實現原理,達到能閱讀和修改源碼的狀態,能夠分析和解決實際遇到的問題,理解OpenCASCADE的能力邊界,根據需要選擇所需要的功能,使軟件結果可控。本文主要介紹二維曲線相交的實現原理。

            由于OpenCASCADE開發時間相對久遠,在二維曲線求交相關代碼中大量使用了宏定義的方式來實現C++ 的模板template能力,宏定義在類的XXX_0.cxx文件中,對應模板實現在*.gxx中:

            這種實現方式會讓代碼的可讀性變差,不利于代碼維護。應該用C++的方式對這些*.gxx代碼重構,增強代碼可讀性和可維護性。

            2 求交分類

            二維求交使用類Geom2dAPI_InterCurveCurve, 這個類是對類Geom2dInt_GInter的封裝。在類Geom2dInt_GInter中,如果只輸入一條曲線,可以計算自交,如果輸入兩條曲線,計算兩條曲線的相交。

            • IntCurve_IntConicConic:二次曲線與二次曲線求交。二次曲線與二次曲線求交都先使用幾何方法計算交點,再判斷是否在參數范圍內;
            • Geom2dInt_TheIntConicCurveOfGInter:二次曲線與任意曲線求交。二次曲線與任意曲線求交通過類Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter建立距離方程,使用類math_FunctionAllRoots來對方程進行求解;
            • Geom2dInt_TheIntPCurvePCurveOfGInter:任意曲線與任意曲線求交。自由曲線求交使用離散法IntCurve_IntPolyPolyGen,使用類Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter將曲線通過采樣點生成多段線Polyline,使用類Intf_InterferencePolygon2d計算多段線之間的粗交點,再使用類IntCurve_ExactIntersectionPoint通過粗交點找到曲線上的精確交點;

            這些類都是從類IntRes2d_Intersection派生:

            從上圖可知,二維求交結果類IntRes2d_Intersection相關派生類可知二維求交與HLR算法也有關系,理解二維曲線求交邏輯,對理解HLR代碼也有幫助。

            3 自交計算

            當只輸入一條曲線時,可以對曲線進行自交計算,主要實現邏輯為:若為普通二次曲線,則不會自交;若是其他曲線,使用離散法對曲線進行自交計算。代碼如下圖所示:

            4 求交結果

            二維曲線求交結果保存到類IntRes2d_Intersection中,主要包含兩部分:

            • IntRes2d_IntersectionPoint:交點數據,保存交點坐標值,交點在兩個曲線上的參數,及兩條曲線在交點處的過渡狀態Transition;
            • IntRes2d_IntersectionSegment:交線數據,當兩條曲線有重疊時的幾何奇異情況時,求交結果為交線;

            因為類IntRes2d_Interseciton的構造函數protected,所以不能直接使用這個類,都是通過其派生類使用函數SetValues()將計算得到的交點和交線數據保存起來。這里類的設計比較繁瑣,代碼可讀性較差。

            5 Conclusion

            OpenCASCADE對于二維曲線求交進行分類處理,根據曲線類型是二次曲線、參數曲線分成三類:二次曲線與二次曲線求交、二次曲線與參數曲線求交和參數曲線與參數曲線求交,不同的求交類型采用不同的策略可以提高求交性能和穩定性。使用離散法計算二維曲線自交。從求交結果來看,也處理了幾何奇異問題,即曲線重疊情況。

            對于曲線求交還有很大改進空間:

            • 使用C++編碼風格重構*.gxx代碼,提高代碼可讀性,方便代碼維護;
            • 對于自由曲線求交的離散法中計算兩條多段線算法中引入BVH來加速;
            • 將曲線離散成多段線時考慮​曲線的曲率變化,不要均勻采樣,減少多段線數量;
            • 對于三維曲線求交都是使用了離散法,建議像二維曲線求交這樣進行分類處理,以及引入BVH,提高性能和穩定性;

             

            国产日韩久久免费影院| 久久综合丁香激情久久| 日韩精品久久无码中文字幕| 久久不见久久见免费视频7| 久久国产午夜精品一区二区三区| 人人狠狠综合88综合久久| 精品综合久久久久久888蜜芽| 一级做a爰片久久毛片16| 久久无码中文字幕东京热| 久久精品国产半推半就| 久久婷婷五月综合国产尤物app| 久久精品国产清高在天天线| 热综合一本伊人久久精品| 精品午夜久久福利大片| 少妇无套内谢久久久久| 丰满少妇人妻久久久久久4| 久久久久波多野结衣高潮| 天天综合久久久网| 国内精品久久久久影院一蜜桃| 亚洲精品乱码久久久久久蜜桃| 久久综合中文字幕| 久久青青草原亚洲av无码app| 日韩AV毛片精品久久久| 老司机午夜网站国内精品久久久久久久久| 久久久久亚洲精品天堂| 性做久久久久久久| 亚洲国产精品无码久久SM| 久久综合亚洲鲁鲁五月天| 久久www免费人成看国产片| 国产福利电影一区二区三区久久老子无码午夜伦不 | 人妻无码αv中文字幕久久琪琪布| 99久久99久久| 高清免费久久午夜精品| 无码国产69精品久久久久网站| 久久精品国产亚洲AV忘忧草18| 亚洲性久久久影院| 色综合久久久久综合99| 精品乱码久久久久久夜夜嗨| 久久国产三级无码一区二区| 久久人妻少妇嫩草AV蜜桃| 亚洲成av人片不卡无码久久|