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

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 閱讀(1492) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

OpenCASCADE Chamfer 2D

eryar@163.com

 

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

 

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的實現(xiàn): 

//=======================================================================
//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實現(xiàn)。OpenCASCADE中的算法類的大致套路就是:

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

Perform():執(zhí)行計算。根據(jù)輸入數(shù)據(jù),計算出結(jié)果;

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

 

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

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

執(zhí)行計算函數(shù)Perform中,根據(jù)邊EDGE中的曲線數(shù)據(jù),判斷兩個曲線的端點處是不是相連接的,并記錄下連接狀態(tài):是首首連接、首尾連接等。這里面判斷兩個點是不是相等使用的gp_PntIsEqual()函數(shù),這個是根據(jù)兩個點之間的距離來判斷的,需要計算出兩個點之間的距離。這里可以使用距離的平方來判斷SquareDistance來判斷兩個點是不是相等,可以提高性能。因為計算距離需要要開方,開方比較耗時。關(guān)于開方的數(shù)值算法,還有個傳奇故事:一個Sqrt函數(shù)引發(fā)的血案 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;
}

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

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

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

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


為了方便大家在移動端也能看到我的博文和討論交流,現(xiàn)已注冊微信公眾號,歡迎大家掃描下方二維碼關(guān)注。
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>
            国产综合色产在线精品| 在线视频欧美一区| 免费在线观看日韩欧美| 国产麻豆综合| 午夜宅男久久久| 欧美一级欧美一级在线播放| 国产最新精品精品你懂的| 国产欧美日韩亚洲精品| 欧美xx视频| 亚洲制服av| 亚洲国产精品va在线看黑人动漫| 亚洲视屏在线播放| 美女日韩欧美| 亚洲欧洲精品成人久久奇米网| 亚洲午夜一区二区| 亚洲福利视频三区| 国产麻豆午夜三级精品| 在线成人黄色| 国产视频精品网| 国产精品嫩草99av在线| 亚洲精品乱码久久久久久按摩观| 久久香蕉国产线看观看av| 亚洲伦理一区| 亚洲第一网站| 亚洲丁香婷深爱综合| 亚洲欧美在线x视频| 亚洲黄色免费网站| 激情小说另类小说亚洲欧美| 欧美日韩性视频在线| 另类图片国产| 久久精品三级| 欧美在线观看视频| 亚洲一区免费观看| 一本色道久久综合亚洲精品不卡| 麻豆精品视频| 另类欧美日韩国产在线| 一区二区三区欧美在线| 久久午夜电影网| 久久天堂精品| 国产美女精品视频| 亚洲天堂av在线免费| 亚洲一区二区欧美日韩| 欧美11—12娇小xxxx| 欧美国产日韩一区| 欧美国产先锋| 久久av在线| 国产毛片一区| 欧美一乱一性一交一视频| 欧美一区二区三区四区在线观看地址| 欧美chengren| 久久精品九九| 精品69视频一区二区三区| 性久久久久久久久| 亚洲一区二区成人在线观看| 欧美日韩视频一区二区三区| 亚洲精品久久久久中文字幕欢迎你| 99国产一区| 欧美一区二区在线视频| av不卡免费看| 久久aⅴ国产紧身牛仔裤| 国产精品一区二区你懂得| 亚洲视频福利| 国产精品99久久99久久久二8| 欧美一区二区三区四区在线 | 欧美伊久线香蕉线新在线| 日韩亚洲精品在线| 亚洲欧美韩国| 国产酒店精品激情| 久久久国际精品| 欧美黄色影院| 欧美r片在线| 国产精品自在线| 欧美一区二区三区在线看| 亚洲欧美在线免费| 欧美1级日本1级| 日韩图片一区| 亚洲深夜福利网站| 1204国产成人精品视频| 伊人久久婷婷| 欧美激情在线狂野欧美精品| 欧美精品亚洲一区二区在线播放| 国产欧美日韩| 久久久精品国产免费观看同学| 久久riav二区三区| 亚洲片区在线| 久久久久国产精品厨房| 久久精品二区三区| 欧美久久视频| 亚洲国产欧美日韩另类综合| 亚洲高清在线视频| 欧美日韩一区二区三区在线观看免 | 欧美国产一区二区| 欧美日韩精品一区二区天天拍小说 | 亚洲视频第一页| 欧美在线观看一区| 亚洲精品国产无天堂网2021| 亚洲天堂av高清| 亚洲黄色av| 亚洲欧美变态国产另类| 1024亚洲| 性一交一乱一区二区洋洋av| 亚洲美女视频在线免费观看| 午夜精品一区二区三区在线视| 亚洲国产精品电影| 午夜精品久久久久久久白皮肤| 亚洲日本理论电影| 久久国产视频网站| 亚洲欧美区自拍先锋| 一区二区欧美亚洲| 亚洲韩国一区二区三区| 午夜日韩在线| 亚洲综合色婷婷| 一区二区三区日韩精品视频| 伊人成人在线| 亚洲欧美韩国| 亚洲在线播放| 欧美激情精品久久久六区热门 | 久久精品国产久精国产一老狼| 亚洲色无码播放| 亚洲国产精品电影在线观看| 亚洲欧美日韩精品久久| 一本色道**综合亚洲精品蜜桃冫 | 国产视频一区在线观看一区免费 | 久久只有精品| 欧美大胆成人| 久久久久久久久综合| 国产精品大片免费观看| 亚洲制服av| 欧美日韩国产成人高清视频| 欧美不卡福利| 亚洲电影视频在线| 久久婷婷国产综合国色天香| 久久久久久久久综合| 国产亚洲精品久久久久婷婷瑜伽| 久久亚洲电影| 国产亚洲一区二区在线观看| 中文国产一区| 午夜久久福利| 国产欧美精品在线播放| 亚洲综合色自拍一区| 亚洲在线日韩| 国产精品夜夜夜| 欧美激情1区2区3区| 在线看欧美日韩| 免费日韩成人| 亚洲人在线视频| 99视频国产精品免费观看| 欧美日韩午夜激情| 亚洲特级片在线| 久久爱另类一区二区小说| 毛片av中文字幕一区二区| 亚洲一二三级电影| 国产精品久久国产精麻豆99网站| 亚洲午夜精品国产| 久久视频一区| 亚洲国产黄色| 欧美日韩在线一区二区三区| 久久人91精品久久久久久不卡| 欧美日韩亚洲一区二区三区四区| 99精品99| 久久久久久久久伊人| 亚洲精品日产精品乱码不卡| 欧美日韩精品一区视频| 亚洲免费视频一区二区| 免费成人黄色片| 亚洲一区二区三| 亚洲电影欧美电影有声小说| 欧美日韩一区自拍| 性色av一区二区三区| 免费一级欧美片在线播放| 亚洲免费不卡| 国内精品久久久久久久影视蜜臀| 久久男人资源视频| 国产精品99久久久久久久vr| 免费成人高清| 欧美一区二区三区久久精品茉莉花| 樱花yy私人影院亚洲| 欧美日韩在线视频一区| 久久久久久久久久久久久女国产乱| 亚洲在线观看视频| 在线看欧美日韩| 国产精品色一区二区三区| 美日韩精品免费| 亚洲欧美在线免费| 亚洲人成精品久久久久| 久久久国产91| 亚洲欧美成人在线| 亚洲伦理网站| 亚洲国产精品成人va在线观看| 国产欧美一区二区三区久久人妖| 欧美波霸影院| 久久久久www| 亚洲一区二区三区午夜| 91久久国产综合久久91精品网站| 久久精品噜噜噜成人av农村| 一区二区高清在线| 国产精品你懂的在线| 麻豆成人综合网| 欧美在线不卡视频| 亚洲欧美综合另类中字|