• <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 2019-09-19 13:19 eryar 閱讀(1905) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            OpenCASCADE圓與平面求交

            eryar@163.com

             

            在 解析幾何求交之圓與二次曲面中分析了OpenCASCADE提供的類IntAna_IntConicQuad可以用來計(jì)算圓與二次曲面之間的交點(diǎn),這個(gè)算法是將平面Plane作為二次曲面的一個(gè)特例來處理,最后主要是對(duì)三角函數(shù)方程進(jìn)行求解。

             

            當(dāng)直接使用圓和平面作為參數(shù)時(shí),IntAna_IntConicQuad重載了函數(shù)Perform來對(duì)圓和平面進(jìn)行求交計(jì)算,這時(shí)的算法與前面解三角函數(shù)不同,代碼如下:

            void IntAna_IntConicQuad::Perform (const gp_Circ& C, const gp_Pln& P,
                              const Standard_Real Tolang,
                              const Standard_Real Tol)
            {
              
              done=Standard_False;
              
              gp_Pln Plconic(gp_Ax3(C.Position()));
              IntAna_QuadQuadGeo IntP(Plconic,P,Tolang,Tol);
              if (!IntP.IsDone()) {return;}
              if (IntP.TypeInter() == IntAna_Empty) {
                parallel=Standard_True;
                Standard_Real distmax = P.Distance(C.Location()) + C.Radius()*Tolang;
                if (distmax < Tol) {
                  inquadric = Standard_True;
                }
                else {
                  inquadric = Standard_False;
                }
                done=Standard_True;
              }
              else     if(IntP.TypeInter() == IntAna_Same) { 
                inquadric = Standard_True;
                done = Standard_True;
              }
              else {
                inquadric=Standard_False;
                parallel=Standard_False;
                gp_Lin Ligsol(IntP.Line(1));
                
                gp_Vec V0(Plconic.Location(),Ligsol.Location());
                gp_Vec Axex(Plconic.Position().XDirection());
                gp_Vec Axey(Plconic.Position().YDirection());
                
                gp_Pnt2d Orig(Axex.Dot(V0),Axey.Dot(V0));
                gp_Vec2d Dire(Axex.Dot(Ligsol.Direction()),
                      Axey.Dot(Ligsol.Direction()));
                
                gp_Lin2d Ligs(Orig,Dire);
                gp_Pnt2d Pnt2dBid(0.0,0.0);
                gp_Dir2d Dir2dBid(1.0,0.0);
                gp_Ax2d Ax2dBid(Pnt2dBid,Dir2dBid);
                gp_Circ2d Cir(Ax2dBid,C.Radius());
                
                IntAna2d_AnaIntersection Int2d(Ligs,Cir);
                
                if (!Int2d.IsDone()) {return;}
                
                nbpts=Int2d.NbPoints();
                for (Standard_Integer i=1; i<=nbpts; i++) {
                  
                  gp_Pnt2d resul(Int2d.Point(i).Value());
                  Standard_Real X= resul.X();
                  Standard_Real Y= resul.Y();
                  pnts[i-1].SetCoord(Plconic.Location().X() + X*Axex.X() + Y*Axey.X(),
                         Plconic.Location().Y() + X*Axex.Y() + Y*Axey.Y(),
                         Plconic.Location().Z() + X*Axex.Z() + Y*Axey.Z());
                  paramonc[i-1]=Int2d.Point(i).ParamOnSecond();
                }
                done=Standard_True;
              }
            }

            從上述代碼中可以看出,直接對(duì)圓和平面求交的算法步驟如下:

            l 對(duì)圓所在平面與平面進(jìn)行求交,來判斷圓所在平面與平面的狀態(tài):平行或是圓在平面內(nèi)部;

            l 如果圓所在平面與平面不平行,則得出交線;

            l 然后將交線和圓轉(zhuǎn)換成二維空間進(jìn)行求交計(jì)算;

             

            我覺得在得出圓所在平面與平面的交線后,再轉(zhuǎn)換到二維空間來計(jì)算交點(diǎn)的方法有點(diǎn)復(fù)雜。在得到兩個(gè)平面的交線后,就可以直接將圓心P0坐標(biāo)向交線投影得到垂點(diǎn)Pm,先判斷圓心到Pm點(diǎn)距離等于半徑時(shí),圓和平面就只有一個(gè)交點(diǎn),就是Pm。小于半徑時(shí)有兩個(gè)交點(diǎn),將Pm沿著交線方向分別移動(dòng)L和-L距離就可以得到交點(diǎn)了,其中:

             

            這樣處理只涉及到一個(gè)點(diǎn)向直線投影、一個(gè)開方及幾個(gè)向量操作,代碼簡(jiǎn)單容量理解。


            為了方便大家在移動(dòng)端也能看到我的博文和討論交流,現(xiàn)已注冊(cè)微信公眾號(hào),歡迎大家掃描下方二維碼關(guān)注。
            Shing Liu(eryar@163.com)
            精品久久久久香蕉网| 麻豆国内精品久久久久久| 九九久久自然熟的香蕉图片| 久久久久久午夜成人影院| jizzjizz国产精品久久| 久久久久人妻一区精品果冻| 久久综合九色综合网站| 久久精品免费一区二区三区| 亚洲精品无码久久久| 久久久久久亚洲AV无码专区| 久久影视综合亚洲| 久久精品中文闷骚内射| 国产真实乱对白精彩久久| 亚洲伊人久久精品影院| 久久婷婷色综合一区二区| 久久人人爽人人爽人人片av麻烦| 久久九九亚洲精品| 97精品依人久久久大香线蕉97 | 国产69精品久久久久APP下载| 色欲综合久久躁天天躁蜜桃| 久久精品国产精品亜洲毛片| 亚洲欧美日韩久久精品第一区| 99久久国产亚洲高清观看2024| 久久精品国产精品亚洲精品| 99久久人人爽亚洲精品美女| 99久久99久久精品国产片果冻| 久久人人爽人人澡人人高潮AV| 成人国内精品久久久久一区| 久久只这里是精品66| 久久九九免费高清视频| 久久er国产精品免费观看2| 久久久无码精品亚洲日韩京东传媒| 精品久久久久久国产免费了| 99久久婷婷免费国产综合精品| 国产69精品久久久久观看软件| 久久免费大片| 久久久久国产视频电影| 国内精品久久久久久久影视麻豆| 好久久免费视频高清| 久久99国产精品一区二区| 7777久久亚洲中文字幕|