江苏快三开奖结果

posts - 432, comments - 579, trackbacks - 0, articles - 0

OpenCASCADE圓與平面求交

Posted on 2019-09-19 13:19 eryar 閱讀(728) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE圓與平面求交

eryar@163.com

 

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

 

當直接使用圓和平面作為參數時,IntAna_IntConicQuad重載了函數Perform來對圓和平面進行求交計算,這時的算法與前面解三角函數不同,代碼如下:

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;
  }
}

CONGSHANGSHUDAIMAZHONGKEYIKANCHU,ZHIJIEDUIYUANHEPINGMIANQIUJIAODESUANFABUZOURUXIA:

l DUIYUANSUOZAIPINGMIANYUPINGMIANJINXINGQIUJIAO,LAIPANDUANYUANSUOZAIPINGMIANYUPINGMIANDEZHUANGTAI:PINGXINGHUOSHIYUANZAIPINGMIANNEIBU;

江苏快三开奖结果l RUGUOYUANSUOZAIPINGMIANYUPINGMIANBUPINGXING,ZEDECHUJIAOXIAN;

l RANHOUJIANGJIAOXIANHEYUANZHUANHUANCHENGERWEIKONGJIANJINXINGQIUJIAOJISUAN;

 

我覺得在得出圓所在平面與平面的交線后,再轉換到二維空間來計算交點的方法有點復雜。在得到兩個平面的交線后,就可以直接將圓心P0坐標向交線投影得到垂點Pm,先判斷圓心到Pm點距離等于半徑時,圓和平面就只有一個交點,就是Pm。小于半徑時有兩個交點,將Pm沿著交線方向分別移動L和-L距離就可以得到交點了,其中:

 

江苏快三开奖结果ZHEYANGCHULIZHISHEJIDAOYIGEDIANXIANGZHIXIANTOUYING、YIGEKAIFANGJIJIGEXIANGLIANGCAOZUO,DAIMAJIANDANRONGLIANGLIJIE。


為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。
Shing Liu(eryar@163.com)

只有注冊用戶登錄后才能發表評論。

網站導航:                管理