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

eryar

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

OpenCASCADE Chamfer 2D

Posted on 2021-01-31 19:14 eryar 閱讀(1496) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Chamfer 2D

eryar@163.com

 

 二維的倒角Chamfer功能可以將兩個不平行的曲線進行倒角。如下圖所示為QCAD中進行倒角的效果圖:選擇要倒角的兩個邊,及設置兩個邊上的倒角距離。

 

OpenCASCADE中也提供了這個二維曲線倒角功能,使用Tcl腳本在DRAW中顯示如下:

polyline p 0 0 0 10 0 0 10 10 0

chamfer2d r p 3 5

vdisplay r

  

在源文件BRepTest_Fillet2DCommands.cxx中找到命令chamfer2d的實現: 

//=======================================================================
//function : chamfer2d
//purpose : Chamfer 2d.
//usage : chamfer2d result wire (or edge1 edge2) length1 length2
//=======================================================================
static Standard_Integer chamfer2d(Draw_Interpretor& di, Standard_Integer n, const char** a)
{
if (n != 5 && n != 6)
{
di << "Usage : chamfer2d result wire (or edge1 edge2) length1 length2";
return 1;
}
TopoDS_Shape W;
TopoDS_Shape E1, E2;
if (n == 6)
{
// Get the edges.
E1 = DBRep::Get(a[2], TopAbs_EDGE, Standard_True);
E2 = DBRep::Get(a[3], TopAbs_EDGE, Standard_True);
}
else
{
W = DBRep::Get(a[2], TopAbs_WIRE, Standard_True);
}
// Get the lengths.
const Standard_Real length1 = (n == 6) ? Atof(a[4]) : Atof(a[3]);
const Standard_Real length2 = (n == 6) ? Atof(a[5]) : Atof(a[4]);
// Algo.
 ChFi2d_ChamferAPI algo;
if (n == 6)
{
const TopoDS_Edge& e1 = TopoDS::Edge(E1);
const TopoDS_Edge& e2 = TopoDS::Edge(E2);
algo.Init(e1, e2);
}
else
{
const TopoDS_Wire& w = TopoDS::Wire(W);
algo.Init(w);
}
// Prepare the chamfer.
 algo.Perform();
// Get the result.
TopoDS_Edge M1, M2; // modified E1 and E2
TopoDS_Edge chamfer = algo.Result(M1, M2, length1, length2);
if (chamfer.IsNull())
{
di << "Error: the algrithm produced no result.";
return 1;
}
if (n == 6)
{
// Set result for DRAW.
DBRep::Set(a[1], chamfer);
// Update neighbour edges in DRAW.
DBRep::Set(a[2], M1);
DBRep::Set(a[3], M2);
}
else // recreate the wire using the chamfer
 {
BRepBuilderAPI_MakeWire mkWire(M1, chamfer, M2);
if (mkWire.IsDone())
DBRep::Set(a[1], mkWire.Wire());
else
DBRep::Set(a[1], chamfer);
}
return 0;
}

從上述源碼可以看出,二維曲線倒角功能主要是由類ChFi2d_ChamferAPI實現。OpenCASCADE中的算法類的大致套路就是:

Init():初始化:數據輸入。給定幾種條件的初始化函數,對應幾種情況的數據輸入。

Perform():執行計算。根據輸入數據,計算出結果;

Result()/Get():得到計算結果。

 

二維曲線的倒角功能是相對簡單的功能,所以找到類ChFi2d_ChamferAPI中源碼看看實現過程:

// Constructs a chamfer edge.
// Returns true if the edge is constructed.
Standard_Boolean ChFi2d_ChamferAPI::Perform()
{
myCurve1 = BRep_Tool::Curve(myEdge1, myStart1, myEnd1);
myCurve2 = BRep_Tool::Curve(myEdge2, myStart2, myEnd2);
// searching for common points
if (myCurve1->Value(myStart1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion()))
{
myCommonStart1 = true;
myCommonStart2 = false;
}
else
{
if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myStart2), Precision::Confusion()))
{
myCommonStart1 = false;
myCommonStart2 = true;
}
else
{
if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion()))
{
myCommonStart1 = false;
myCommonStart2 = false;
}
else
{
myCommonStart1 = true;
myCommonStart2 = true;
}
}
}
return Standard_True;
}

執行計算函數Perform中,根據邊EDGE中的曲線數據,判斷兩個曲線的端點處是不是相連接的,并記錄下連接狀態:是首首連接、首尾連接等。這里面判斷兩個點是不是相等使用的gp_PntIsEqual()函數,這個是根據兩個點之間的距離來判斷的,需要計算出兩個點之間的距離。這里可以使用距離的平方來判斷SquareDistance來判斷兩個點是不是相等,可以提高性能。因為計算距離需要要開方,開方比較耗時。關于開方的數值算法,還有個傳奇故事:一個Sqrt函數引發的血案 https://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html

 

// Returns the result (chamfer edge, modified edge1, modified edge2).
TopoDS_Edge ChFi2d_ChamferAPI::Result(TopoDS_Edge& theEdge1, TopoDS_Edge& theEdge2,
const Standard_Real theLength1, const Standard_Real theLength2)
{
TopoDS_Edge aResult;
if (Abs(myEnd1 - myStart1) < theLength1)
return aResult;
if (Abs(myEnd2 - myStart2) < theLength2)
return aResult;
Standard_Real aCommon1 = (myCommonStart1?myStart1:myEnd1) + (((myStart1 > myEnd1)^myCommonStart1)?theLength1:-theLength1);
Standard_Real aCommon2 = (myCommonStart2?myStart2:myEnd2) + (((myStart2 > myEnd2)^myCommonStart2)?theLength2:-theLength2);
// make chamfer edge
GC_MakeLine aML(myCurve1->Value(aCommon1), myCurve2->Value(aCommon2));
BRepBuilderAPI_MakeEdge aBuilder(aML.Value(), myCurve1->Value(aCommon1), myCurve2->Value(aCommon2));
aResult = aBuilder.Edge();
// divide first edge
BRepBuilderAPI_MakeEdge aDivider1(myCurve1, aCommon1, (myCommonStart1?myEnd1:myStart1));
theEdge1 = aDivider1.Edge();
// divide second edge
BRepBuilderAPI_MakeEdge aDivider2(myCurve2, aCommon2, (myCommonStart2?myEnd2:myStart2));
theEdge2 = aDivider2.Edge();
return aResult;
}

這個代碼很好理解,根據Perform()函數中計算到的相連狀態,再結合參數曲線計算出倒角得到的線aResult,及倒角后的兩條邊。

二維曲線倒角算法相對簡單,在理解二維曲線倒角的基礎上再去深入理解三維倒角原理。

因為OpenCASCADE的BREP結構中沒有保存從Vertex到Edger的關系,所以查找兩條邊EDGE的相連關系時只能從幾何點之間的距離來處理。

對于距離的比較,能直接用平方距離比較的情況下盡量避免開方,可以提高性能。


為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。
Shing Liu(eryar@163.com)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品主播| 国产精品一区二区你懂得| 国内成人在线| 久久亚洲图片| 久久这里只有| 亚洲欧洲在线一区| 亚洲人精品午夜| 欧美四级剧情无删版影片| 亚洲视频一区二区在线观看| 99视频在线精品国自产拍免费观看 | 亚洲福利视频专区| 亚洲国产成人久久综合一区| 欧美日韩国产成人精品| 亚洲网站在线观看| 亚洲专区一区| 亚洲高清激情| 亚洲精品国产视频| 国产精品久久久久久久久久免费看 | 亚洲国产婷婷| 一区二区三区精品视频在线观看| 国产精品区一区二区三区| 久久久久久久国产| 欧美高清视频一二三区| 亚洲免费视频一区二区| 久久精品国产精品亚洲综合| 亚洲片在线资源| 一区二区三区免费看| 国产一区二区三区在线观看免费| 嫩模写真一区二区三区三州| 欧美日韩天天操| 久久爱www久久做| 欧美激情第1页| 久久九九热re6这里有精品| 欧美高清视频一区二区三区在线观看| 亚洲一区在线观看视频| 久久手机精品视频| 亚洲男人的天堂在线观看| 久久一区中文字幕| 羞羞答答国产精品www一本 | 亚洲色图在线视频| 在线观看一区| 午夜亚洲精品| 亚洲性线免费观看视频成熟| 老色鬼久久亚洲一区二区| 亚洲综合三区| 欧美精品二区| 欧美不卡视频一区发布| 国产日韩欧美三区| 一级日韩一区在线观看| 亚洲精品在线观| 久久九九免费| 欧美在线精品一区| 欧美午夜片欧美片在线观看| 亚洲激情第一页| 亚洲福利视频一区二区| 久久久精彩视频| 久久疯狂做爰流白浆xx| 国产精品草草| 一区二区三区福利| 日韩午夜三级在线| 欧美激情综合五月色丁香| 男女激情久久| 亚洲高清在线| 男人的天堂成人在线| 久久综合成人精品亚洲另类欧美| 国产精品一区二区三区久久| 一本久道综合久久精品| 一区二区三区久久网| 欧美人与性动交cc0o| 亚洲日本在线视频观看| 亚洲免费观看高清在线观看| 欧美国产日本在线| 91久久久亚洲精品| 99在线热播精品免费| 欧美日韩在线不卡| 亚洲视频1区| 欧美在线看片| 国产最新精品精品你懂的| 久久国产精品一区二区三区四区| 久久久综合网| 亚洲国产电影| 欧美日韩在线视频一区| 亚洲无毛电影| 欧美一区中文字幕| 亚洲第一福利社区| 欧美福利一区二区三区| 99在线精品免费视频九九视| 亚洲综合三区| 韩国三级电影久久久久久| 久久久亚洲高清| 亚洲经典一区| 欧美一区二区三区在线免费观看| 国产在线观看精品一区二区三区| 久久久久这里只有精品| 亚洲国产精品成人| 亚洲在线视频一区| 精品动漫3d一区二区三区免费版| 蜜乳av另类精品一区二区| 99av国产精品欲麻豆| 久久精品欧洲| 99pao成人国产永久免费视频| 国产精品毛片va一区二区三区| 欧美在线啊v| 91久久精品www人人做人人爽 | 一区二区视频在线观看| 欧美大片免费看| 亚洲在线1234| 亚洲电影免费观看高清完整版在线观看 | 亚洲看片一区| 国产日韩欧美电影在线观看| 美女免费视频一区| 亚洲愉拍自拍另类高清精品| 美女亚洲精品| 亚洲欧美日韩国产中文在线| 亚洲第一网站免费视频| 欧美偷拍一区二区| 久久最新视频| 欧美在线免费观看| 一区二区三区久久精品| 欧美激情中文字幕一区二区| 欧美一区二区精品| 一区二区高清视频| 91久久精品国产91性色tv| 国产欧美在线播放| 欧美性jizz18性欧美| 暖暖成人免费视频| 久久久精彩视频| 欧美一区二区三区男人的天堂| 99re6这里只有精品视频在线观看| 久久欧美肥婆一二区| 午夜精品婷婷| 亚洲永久免费av| 一本色道久久综合亚洲精品高清| 亚洲国产精品第一区二区三区 | 欧美第一黄色网| 久久精品一区| 欧美一区二区免费| 亚洲欧美国产日韩中文字幕| 亚洲毛片在线看| 亚洲黄色一区| 亚洲国产一二三| 亚洲国产欧美一区| 欧美激情按摩| 亚洲啪啪91| 亚洲精品一区中文| 亚洲精品在线视频观看| 亚洲国产高清在线观看视频| 欧美黄网免费在线观看| 欧美成人午夜激情| 欧美国产精品| 亚洲承认在线| 亚洲欧洲日夜超级视频| 亚洲精品资源美女情侣酒店| 亚洲伦理久久| 一区电影在线观看| 亚洲欧美国产另类| 午夜在线一区| 久久男人av资源网站| 老妇喷水一区二区三区| 欧美成人伊人久久综合网| 欧美激情欧美激情在线五月| 欧美另类专区| 国产九九精品视频| 黄色成人91| 亚洲日本一区二区| 亚洲视频综合| 久久久久久久999| 欧美国产精品v| 99天天综合性| 久久国产视频网站| 男女激情久久| 国产精品九色蝌蚪自拍| 国产欧美日韩中文字幕在线| 黄色亚洲免费| 一本久久青青| 久久精品一区二区| 亚洲国产小视频在线观看| 亚洲图中文字幕| 久久视频国产精品免费视频在线| 欧美另类视频| 国产一区二区三区高清| 亚洲电影在线看| 亚洲淫性视频| 欧美高清视频在线| 亚洲自拍电影| 欧美极品在线播放| 国产亚洲人成a一在线v站 | 国产欧美一区二区三区另类精品| 国产专区一区| 亚洲伊人一本大道中文字幕| 久久亚洲精品视频| 一区二区三区精品在线| 久久亚洲视频| 国产精品日日摸夜夜添夜夜av| 亚洲高清久久久| 久久精品91| 亚洲午夜成aⅴ人片| 噜噜噜久久亚洲精品国产品小说| 欧美午夜精品久久久久久人妖| 亚洲成色777777女色窝|