青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

布爾數據 邊的相交

Posted on 2023-09-27 21:52 eryar 閱讀(924) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

布爾數據 邊的相交

eryar@163.com

1 Introduction

在OpenCASCADE中對于邊的相交分為三類:邊與點,邊與邊,邊與面,邊與點的相交已經歸結為點與邊的相交處理了,邊的相交主要處理邊與邊,邊與面的相交。邊與邊、邊與面的相交會引入一個新的數據結構-公共部分Common Part,用于保存重疊的公共部分數據。

2 Edge/Edge Interferences

對于兩條邊的相交是指在兩條邊的某些地方的距離小于邊的容差之和,主要分為兩種情況,一種是兩條邊只有一個交點的情況;一種是有重疊部分的情況;先看只有一個交點情況:

我們在DRAW中通過腳本構造最簡單的情況來測試。

在處理邊與邊相交的函數BOPAlgo_PaveFiller::PerformEE()中,對每兩條邊調用BOPAlgo_EdgeEdge進行求交。從這里可以看到Pave Block的使用,相當于對每兩條邊上的每對Pave Block部分進行求交。這里有一些優化空間,目前是使用的兩個循環處理,可以嘗試使用BVH來提升一些性能。當每對Pave Block對應的點的索引號一致時,即每對Pave Block的端點重疊時,使用快速計算的算法來判斷是否有重疊。

對于邊的求交結果保存到BOPDS_InterfEE中,都會保存是哪兩條邊相交及相交的公共部分。對于相交于一點的公共部分的類型為TopAbs_VERTEX,對于有重疊部分的公共部分類型為TopAbs_EDGE:

當兩邊條有重疊部分時,如下圖所示:

如何檢測兩條邊的公共部分呢?在函數IntTools_EdgeEdge::IsCoincident()中實現:

//=======================================================================
//function :  IsCoincident
//purpose  : 
//=======================================================================
Standard_Boolean IntTools_EdgeEdge::IsCoincident() 
{
  Standard_Integer i, iCnt, aNbSeg, aNbP2;
  Standard_Real dT, aT1, aCoeff, aTresh, aD;
  Standard_Real aT11, aT12, aT21, aT22;
  GeomAPI_ProjectPointOnCurve aProjPC;
  gp_Pnt aP1;
  //
  aTresh=0.5;
  aNbSeg=23;
  myRange1.Range(aT11, aT12);
  myRange2.Range(aT21, aT22);
  //
  aProjPC.Init(myGeom2, aT21, aT22);
  //
  dT=(aT12-aT11)/aNbSeg;
  //
  iCnt=0;
  for(i=0; i <= aNbSeg; ++i) {
    aT1 = aT11+i*dT;
    myGeom1->D0(aT1, aP1);
    //
    aProjPC.Perform(aP1);
    aNbP2=aProjPC.NbPoints();
    if (!aNbP2) {
      continue;
    }
    //
    aD=aProjPC.LowerDistance();
    if(aD < myTol) {
      ++iCnt; 
    }
  }
  //
  aCoeff=(Standard_Real)iCnt/((Standard_Real)aNbSeg+1);
  return aCoeff > aTresh;
}

從上述代碼可以看出,對于重疊部分的檢測是將一條邊根據檢測范圍分成23段采樣點,計算每個點到另一條邊的距離,滿足條件的采樣點的數量超過12個,基本認為是重疊的。從這里可以看出這樣檢測重疊稍微有點不嚴謹。固定采樣點數量對于小段曲線來說數量過大,對于很長的曲線來說數量又偏小,這里有待提高。如果重疊,則將公共部分的數據保存起來:

對于測試的TCL腳本不會走這個通用的判斷流程,會直接有IntTools_EdgeEdge::ComputeLineLine()函數來處理這種特殊情況:

從保存的數據可以看出,公共部分的相交類型為TopAbs_VERTEX,及交點分別在兩條邊上的參數。關于有重疊部分的兩條邊相交,同學們可以自行使用DRAW腳本來測試一下。

3 Edge/Face Interferences

邊與面的相交會遇到和邊與邊相交類似的情況,即會有重疊部分Common Part。也分為兩種情況,一種情況是邊與面只有一個交點的情況,交點可能會有多個;一種情況是有重疊部分的情況。

我們可以在使用腳本來測試一下重疊的情況:

從代碼中可以看出當邊的端點在面上時,則會判斷邊與面會不會重疊Coincidence。判斷邏輯與判斷邊是否重疊類似,都是使用固定23個采樣點的方式處理,并加上定位器來判斷點是否在面上,因為面上可能會有孔洞:

//=======================================================================
//function :  IsCoincident
//purpose  : 
//=======================================================================
Standard_Boolean IntTools_EdgeFace::IsCoincident() 
{
  Standard_Integer i, iCnt;
  Standard_Real dT, aT, aD, aT1, aT2, aU, aV;
  gp_Pnt aP;
  TopAbs_State aState;
  gp_Pnt2d aP2d;
  //
  GeomAPI_ProjectPointOnSurf& aProjector=myContext->ProjPS(myFace);
  Standard_Integer aNbSeg=23;
  if (myC.GetType() == GeomAbs_Line &&
      myS.GetType() == GeomAbs_Plane)
    aNbSeg = 2; // Check only three points for Line/Plane intersection
  const Standard_Real aTresh = 0.5;
  const Standard_Integer aTreshIdxF = RealToInt((aNbSeg+1)*0.25),
                         aTreshIdxL = RealToInt((aNbSeg+1)*0.75);
  const Handle(Geom_Surface) aSurf = BRep_Tool::Surface(myFace);
  aT1=myRange.First();
  aT2=myRange.Last();
  Standard_Real aBndShift = 0.01 * (aT2 - aT1);
  //Shifting first and last curve points in order to avoid projection
  //on surface boundary and rejection projection point with minimal distance
  aT1 += aBndShift;
  aT2 -= aBndShift;
  dT=(aT2-aT1)/aNbSeg;
  //
  Standard_Boolean isClassified = Standard_False;
  iCnt=0;
  for(i=0; i <= aNbSeg; ++i) {
    aT = aT1+i*dT;
    aP=myC.Value(aT);
    //
    aProjector.Perform(aP);
    if (!aProjector.IsDone()) {
      continue;
    }
    //
    aD=aProjector.LowerDistance();
    if (aD > myCriteria) {
      if (aD > 100. * myCriteria)
        return Standard_False;
      else
        continue;
    }
    //
    ++iCnt; 
    //We classify only three points: in the begin, in the 
    //end and in the middle of the edge.
    //However, exact middle point (when i == (aNbSeg + 1)/2)
    //can be unprojectable. Therefore, it will not be able to
    //be classified. Therefore, points with indexes in 
    //[aTreshIdxF, aTreshIdxL] range are made available 
    //for classification.
    //isClassified == TRUE if MIDDLE point has been chosen and
    //classified correctly.
    if(((0 < i) && (i < aTreshIdxF)) || ((aTreshIdxL < i ) && (i < aNbSeg)))
      continue;
    if(isClassified && (i != aNbSeg))
      continue;
    aProjector.LowerDistanceParameters(aU, aV);
    aP2d.SetX(aU);
    aP2d.SetY(aV);
    IntTools_FClass2d& aClass2d=myContext->FClass2d(myFace);
    aState = aClass2d.Perform(aP2d);
    if(aState == TopAbs_OUT)
      return Standard_False;
    if(i != 0)
      isClassified = Standard_True;
  }
  //
  const Standard_Real aCoeff=(Standard_Real)iCnt/((Standard_Real)aNbSeg+1);
  return (aCoeff > aTresh);
}

求交結果與邊與邊相交類型,會保存邊與面的索引,及公共部分的數據。除了保存這些數據以外,還和點與面相交一樣,更新面上的信息FaceInfo,即有哪些邊在面上。

4 Conclusion

綜上所述,邊與邊、邊與面相交會得到公共部分Common Part,公共部分可能是點,也可能是重疊的邊。在過濾相交的邊與邊、邊與面時都有一定的優化空間,即使用BVH來加速檢測相交部分。在快速判斷邊與邊是否重疊、邊與面是否重疊部分的代碼采用固定數量的采樣點的處理方式不太嚴謹。將相交的結果及過程數據都保存到BOPDS_DS中作為后面算法使用。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲在线第一页| 欧美aⅴ一区二区三区视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产香蕉97碰碰久久人人| 午夜精品视频在线| 亚洲欧美在线观看| 国产婷婷色一区二区三区| 久久激情五月丁香伊人| 久久精品99国产精品| 亚洲国产三级在线| 亚洲精品美女在线观看播放| 欧美日韩精品是欧美日韩精品| 亚洲天堂成人在线观看| 亚洲自拍啪啪| 激情小说亚洲一区| 亚洲区国产区| 国产精品一区免费视频| 美女视频网站黄色亚洲| 欧美黄网免费在线观看| 午夜天堂精品久久久久| 久久久噜噜噜久久中文字免| 99一区二区| 欧美中文在线视频| 一区二区久久久久| 亚洲欧美春色| 亚洲精品乱码久久久久久日本蜜臀| 日韩一级免费| 在线日韩电影| 亚洲午夜91| 亚洲精品在线免费| 亚洲综合清纯丝袜自拍| 91久久久亚洲精品| 亚洲小视频在线观看| 亚洲三级电影在线观看| 亚洲嫩草精品久久| 一本一本久久a久久精品综合麻豆| 亚洲视屏在线播放| 亚洲精品午夜| 久久人人看视频| 亚洲男人第一av网站| 老牛国产精品一区的观看方式| 午夜精品区一区二区三| 欧美高清影院| 免费久久99精品国产自在现线| 欧美丝袜第一区| 美国成人直播| 国产亚洲免费的视频看| 中文精品视频| 亚洲视频axxx| 欧美激情第3页| 亚洲福利一区| 在线观看日产精品| 久久精品日产第一区二区| 亚洲欧美日产图| 欧美日韩伊人| 亚洲欧洲综合另类| 91久久黄色| 免费观看一区| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲愉拍自拍另类高清精品| 麻豆精品视频在线观看| 久久美女性网| 国产一区二区在线观看免费播放| 宅男在线国产精品| 亚洲主播在线播放| 国产精品vvv| 一区二区免费看| 制服丝袜激情欧洲亚洲| 欧美日韩三区四区| 亚洲日韩欧美视频一区| 日韩亚洲视频在线| 欧美日韩国产成人在线91| 亚洲激情视频网站| 亚洲精品黄网在线观看| 欧美国产亚洲视频| 99精品国产在热久久| 99亚洲一区二区| 欧美特黄一区| 午夜欧美理论片| 久久五月婷婷丁香社区| 精品不卡一区| 另类春色校园亚洲| 亚洲人成啪啪网站| 亚洲欧美成人| 国产在线一区二区三区四区| 久久久国产一区二区三区| 欧美大成色www永久网站婷| 亚洲人人精品| 欧美性猛片xxxx免费看久爱| 亚洲婷婷国产精品电影人久久| 亚洲欧美一区二区原创| 国产一区二区久久久| 久久综合影音| 一区二区不卡在线视频 午夜欧美不卡在 | 一区二区黄色| 国产欧美精品日韩精品| 久久久久久**毛片大全| 亚洲国产另类久久久精品极度| 亚洲天堂成人| 一区精品在线| 欧美日本免费| 欧美一区二区视频免费观看| 欧美韩日亚洲| 午夜综合激情| 亚洲高清激情| 国产精品美女久久| 老司机亚洲精品| 亚洲永久免费视频| 亚洲高清123| 久久九九精品| 一区二区欧美日韩视频| 国产真实乱偷精品视频免| 欧美精品一区在线发布| 欧美一级一区| 99re6这里只有精品视频在线观看| 久久九九精品99国产精品| 一区二区av| 在线日韩av片| 国产在线精品二区| 国产精品99一区二区| 欧美成人国产| 久久精品免费观看| 亚洲欧美日韩国产精品| 亚洲精品一级| 亚洲黄色精品| 欧美高清视频一区二区三区在线观看 | 国产一区二区三区四区在线观看 | 亚洲激情社区| 国产在线一区二区三区四区| 国产精品成av人在线视午夜片| 久久久久久**毛片大全| 午夜在线精品| 亚洲主播在线| 亚洲欧美精品伊人久久| 中文在线一区| 一区二区欧美国产| 99亚洲一区二区| 亚洲人成网在线播放| 亚洲激情av| 亚洲欧洲精品成人久久奇米网 | 一区二区三区四区蜜桃| 亚洲二区精品| 亚洲第一网站免费视频| 在线观看一区二区精品视频| 国产一区二区精品久久91| 国产区在线观看成人精品| 国产精品成人在线| 国产精品福利av| 国产精品亚洲аv天堂网| 国产精品一二三视频| 国产精品久久久久久影视 | 久久先锋影音av| 久久人人爽人人| 牛牛影视久久网| 欧美经典一区二区| 欧美色另类天堂2015| 国产精品大片wwwwww| 国产欧美精品久久| 国产在线精品一区二区夜色| 狠狠久久亚洲欧美专区| 亚洲福利专区| 亚洲色图综合久久| 欧美一区二区在线观看| 久久久999| 欧美激情第六页| 99国产精品久久| 欧美在线视频一区| 免费高清在线视频一区·| 欧美日韩二区三区| 国产精品一卡| 在线激情影院一区| 一区二区三区精品在线| 欧美一区二区三区在线观看| 欧美va天堂| 一区二区av| 久久综合五月| 欧美性视频网站| 亚洲第一页在线| 午夜精品福利视频| 欧美成人国产va精品日本一级| 亚洲精品欧美极品| 欧美在线免费观看视频| 欧美激情亚洲综合一区| 国产精品一区二区久久| 亚洲精品国产视频| 久久精彩免费视频| 亚洲精品欧美在线| 久久久久久久久久久一区| 欧美日韩国产二区| 在线不卡a资源高清| 亚洲欧美国产制服动漫| 美日韩精品视频| 亚洲午夜视频| 欧美激情二区三区| 在线视频国内自拍亚洲视频| 亚洲一区亚洲二区| 亚洲精品1区| 噜噜爱69成人精品| 好男人免费精品视频| 亚洲女人天堂av|