• <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 Point Classifier

            Posted on 2021-04-17 16:45 eryar 閱讀(2100) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCASCADE Point Classifier

            eryar@163.com

             

            在解決幾何問(wèn)題時(shí)常會(huì)遇到這樣的問(wèn)題:給定平面上一個(gè)有N條邊的簡(jiǎn)單多邊形P和一點(diǎn)z,在問(wèn)點(diǎn)z是在P的內(nèi)部還是外部,或者是在多邊形的邊上。在OpenCASCADE中也有對(duì)點(diǎn)的位置判斷的功能,叫分類器Classifier,其主要功能就是用于點(diǎn)的定位。點(diǎn)定位功能主要用于模型的網(wǎng)格化Mesh,布爾運(yùn)算(BO)中面的重構(gòu)等。

              

            點(diǎn)定位的狀態(tài)由TopAbs_State來(lái)表示,總共有以下幾種狀態(tài):

             

            引入U(xiǎn)NKNOWN是因?yàn)檫@個(gè)枚舉也經(jīng)常用于表示計(jì)算失敗的狀態(tài)。當(dāng)不能確定點(diǎn)在外部或內(nèi)部時(shí),就用UNKNOWN來(lái)表示。

             

                   點(diǎn)定位相關(guān)的類名都是帶有Classifier或其縮寫(xiě),如:

            l  CSLib_Class2d:最底層的多邊形點(diǎn)定位類,用于二維空間點(diǎn)與多邊形的定位;

            l  BRepClass_FaceClassifier:判斷參數(shù)點(diǎn)是否在面Face的參數(shù)空間和模型點(diǎn)是否在面上;

            l  BRepClass3d_SolidClassifier:判斷點(diǎn)是否在體Solid內(nèi)部;

            l  IntTools_FClass2d:判斷參數(shù)點(diǎn)是否在面Face的參數(shù)空間;

             

            判斷一個(gè)點(diǎn)是否在多邊形內(nèi)部常見(jiàn)算法有:

            (1)面積和判別法:判斷目標(biāo)點(diǎn)與多邊形的每條邊組成的三角形面積和是否等于該多邊形,相等則在多邊形內(nèi)部。

            (2)夾角和判別法:判斷目標(biāo)點(diǎn)與所有邊的夾角和是否為360度,為360度則在多邊形內(nèi)部。

            (3)引射線法:從目標(biāo)點(diǎn)出發(fā)引一條射線,看這條射線和多邊形所有邊的交點(diǎn)數(shù)目。如果有奇數(shù)個(gè)交點(diǎn),則說(shuō)明在內(nèi)部,如果有偶數(shù)個(gè)交點(diǎn),則說(shuō)明在外部。時(shí)間復(fù)雜度:O(n) 適用范圍:任意多邊形。是非常不錯(cuò)的算法(不需考慮精度誤差和多邊形點(diǎn)給出的順序),可以作為第一選擇。算法思想:以被測(cè)點(diǎn)Q為端點(diǎn),向任意方向作射線(一般水平向右作射線),統(tǒng)計(jì)該射線與多邊形的交點(diǎn)數(shù)。如果為奇數(shù),Q在多邊形內(nèi);如果為偶數(shù),Q在多邊形外。

             

            OpenCASCADE中判斷點(diǎn)在多邊形內(nèi)部也是采用了射線法,相關(guān)代碼如下:

             

            其中變量nbc即是交點(diǎn)的個(gè)數(shù)。

            x, y是需判定點(diǎn)與多邊形中一條線段起點(diǎn)的差值,SH是表示點(diǎn)與起點(diǎn)的狀態(tài),起點(diǎn)在判定點(diǎn)下方時(shí)為-1,否則為1;

            nx, ny是需判定點(diǎn)與多邊形中一條線段終點(diǎn)的差值,NH是表示點(diǎn)與終點(diǎn)的狀態(tài),終點(diǎn)在判定點(diǎn)下方時(shí)為-1,否則為1;

            當(dāng)多邊形中一條線段起點(diǎn)和終點(diǎn)與指定點(diǎn)狀態(tài)不一致時(shí),即判定點(diǎn)在線段的Y之間才會(huì)有相交。

            返回值使用了一個(gè)位運(yùn)算來(lái)判斷交點(diǎn)個(gè)數(shù)是否為偶數(shù)。

             

            參考資料:

            1 https://blog.csdn.net/WilliamSun0122/article/details/77994526

            2 https://blog.csdn.net/zsjzliziyang/article/details/108813349

            3 https://www.jianshu.com/p/0e974c27af09

             


            為了方便大家在移動(dòng)端也能看到我的博文和討論交流,現(xiàn)已注冊(cè)微信公眾號(hào),歡迎大家掃描下方二維碼關(guān)注。
            Shing Liu(eryar@163.com)
            久久发布国产伦子伦精品| 日本久久久精品中文字幕| 一级做a爰片久久毛片看看| 国产精自产拍久久久久久蜜| 欧美国产成人久久精品| 久久人妻AV中文字幕| 久久er热视频在这里精品| 久久av高潮av无码av喷吹| 久久AV高潮AV无码AV| 中文字幕亚洲综合久久| 久久无码AV中文出轨人妻| 精品永久久福利一区二区| 亚洲国产成人精品91久久久| 亚洲国产精品久久电影欧美| 99精品久久久久久久婷婷| 久久精品中文无码资源站| 久久久久亚洲AV成人网| 久久av无码专区亚洲av桃花岛| 久久亚洲中文字幕精品一区四| 久久久久99精品成人片直播| 噜噜噜色噜噜噜久久| 久久精品亚洲男人的天堂| 国产午夜精品久久久久免费视| 亚洲欧美一级久久精品| 亚洲国产精品一区二区久久| 99久久无码一区人妻a黑| 无码人妻少妇久久中文字幕蜜桃| 日本亚洲色大成网站WWW久久 | 狠狠色噜噜狠狠狠狠狠色综合久久| 久久久久久亚洲精品不卡| 国产成人精品综合久久久| 88久久精品无码一区二区毛片| 亚洲AV日韩精品久久久久久| 久久精品国产精品亚洲| 久久综合综合久久97色| 日韩精品国产自在久久现线拍| 久久99久国产麻精品66| 亚洲精品乱码久久久久久中文字幕 | 天天综合久久久网| 久久成人影院精品777| 亚洲国产成人久久精品影视|