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

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

OpenCASCADE Chamfer 2D

eryar@163.com

 

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

 

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

polyline p 0 0 0 10 0 0 10 10 0

chamfer2d r p 3 5

vdisplay r

  

在源文件BRepTest_Fillet2DCommands.cxx中找到命令chamfer2d的實(shí)現(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實(shí)現(xiàn)。OpenCASCADE中的算法類的大致套路就是:

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

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

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

 

二維曲線的倒角功能是相對(duì)簡(jiǎn)單的功能,所以找到類ChFi2d_ChamferAPI中源碼看看實(shí)現(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í)行計(jì)算函數(shù)Perform中,根據(jù)邊EDGE中的曲線數(shù)據(jù),判斷兩個(gè)曲線的端點(diǎn)處是不是相連接的,并記錄下連接狀態(tài):是首首連接、首尾連接等。這里面判斷兩個(gè)點(diǎn)是不是相等使用的gp_PntIsEqual()函數(shù),這個(gè)是根據(jù)兩個(gè)點(diǎn)之間的距離來判斷的,需要計(jì)算出兩個(gè)點(diǎn)之間的距離。這里可以使用距離的平方來判斷SquareDistance來判斷兩個(gè)點(diǎn)是不是相等,可以提高性能。因?yàn)橛?jì)算距離需要要開方,開方比較耗時(shí)。關(guān)于開方的數(shù)值算法,還有個(gè)傳奇故事:一個(gè)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;
}

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

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

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

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


為了方便大家在移動(dòng)端也能看到我的博文和討論交流,現(xiàn)已注冊(cè)微信公眾號(hào),歡迎大家掃描下方二維碼關(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>
            国产精品日日摸夜夜添夜夜av | 麻豆久久婷婷| 国内精品久久久久影院优| 欧美一区二区在线播放| 久久中文欧美| 亚洲精品日韩激情在线电影 | 尤妮丝一区二区裸体视频| 老司机精品视频网站| 亚洲黄页一区| 亚洲女女女同性video| 国产午夜精品理论片a级大结局 | 亚洲视频电影图片偷拍一区| 午夜亚洲一区| 在线日韩精品视频| 欧美日韩在线影院| 欧美在线观看www| 亚洲高清免费| 欧美中文字幕视频| 亚洲激情视频网站| 国产精品一区二区黑丝| 老妇喷水一区二区三区| 亚洲香蕉在线观看| 欧美成人按摩| 欧美在线观看一区二区| 亚洲精品久久久蜜桃| 国产精品日产欧美久久久久| 免费不卡在线观看av| 亚洲一级黄色av| 亚洲国产精品久久| 久久久久久久综合色一本| 一本色道久久精品| 尤物九九久久国产精品的分类| 欧美另类综合| 久久久久久久综合狠狠综合| 一本大道久久a久久精二百| 麻豆精品国产91久久久久久| 亚洲深夜av| 欧美在线观看天堂一区二区三区 | 欧美精品不卡| 韩国精品一区二区三区| 亚洲精选视频免费看| 久久国产日本精品| 制服丝袜亚洲播放| 亚洲国产欧美另类丝袜| 国产亚洲美州欧州综合国| 欧美三级乱人伦电影| 蜜桃av久久久亚洲精品| 久久久99精品免费观看不卡| 一区二区三区国产在线观看| 亚洲国产精品嫩草影院| 久久综合五月| 久久久久在线| 久久精品一区| 欧美中文字幕视频在线观看| 亚洲综合色激情五月| av成人黄色| 日韩视频中文字幕| 亚洲九九爱视频| 亚洲欧洲精品天堂一级| 一区在线视频| 在线欧美三区| 在线免费观看日韩欧美| 精品1区2区3区4区| 激情亚洲网站| 在线观看亚洲精品| 亚洲国产精品一区在线观看不卡 | 国语自产精品视频在线看一大j8| 国产精品网站一区| 国产免费成人在线视频| 国产欧美日韩综合一区在线播放| 国产精品日韩久久久| 国产精品一区二区久激情瑜伽| 国产精品伦一区| 国产视频欧美视频| 国产专区综合网| 揄拍成人国产精品视频| 亚洲精品1区2区| 日韩小视频在线观看专区| 中文国产亚洲喷潮| 亚洲欧美日韩在线观看a三区 | 亚洲精品一二| 在线视频免费在线观看一区二区| 一区二区三区久久网| 亚洲图片自拍偷拍| 欧美一级理论片| 久热国产精品| 欧美日韩精品在线| 欧美视频在线观看| 国产欧美丝祙| 亚洲国产专区校园欧美| 一本色道久久综合亚洲精品按摩 | 国内精品99| 狠狠综合久久| 亚洲黄色免费电影| 国产精品99久久久久久久女警 | 国产精品国产成人国产三级| 国产精品久久二区| 国产一区高清视频| 亚洲经典在线看| 中文欧美字幕免费| 欧美在线地址| 免费欧美视频| aa级大片欧美三级| 久久av免费一区| 欧美理论大片| 国产主播精品在线| 日韩午夜免费视频| 久久久久www| 亚洲国产精品激情在线观看 | 亚洲女同同性videoxma| 久久免费视频一区| 国产精品精品视频| 亚洲第一天堂无码专区| 亚洲视频第一页| 欧美α欧美αv大片| 亚洲作爱视频| 久久综合电影| 国产日韩欧美麻豆| 一区二区三区**美女毛片 | 一区二区三区日韩欧美精品| 欧美一区二区在线播放| 欧美久久99| 精品成人在线| 亚洲欧美日韩久久精品| 欧美国产欧美综合 | 久久久亚洲国产美女国产盗摄| 欧美日韩成人综合天天影院| 国内精品久久久久久影视8 | 欧美私人啪啪vps| 在线欧美不卡| 久久精品视频在线| 亚洲图片你懂的| 欧美日韩成人综合| 亚洲日本理论电影| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲一区999| 欧美日韩一区二区在线视频| 91久久香蕉国产日韩欧美9色| 久久精品国产久精国产思思| 99re在线精品| 欧美精品粉嫩高潮一区二区| 曰本成人黄色| 久久综合伊人77777| 亚洲欧美视频一区| 国产精品萝li| 亚洲午夜一二三区视频| 亚洲精品视频一区| 欧美国产日韩免费| 亚洲精品国产精品国自产观看| 久久综合影音| 久久久99免费视频| 伊人久久综合| 免费观看日韩av| 久久久噜噜噜久噜久久| 激情成人亚洲| 免费一级欧美片在线观看| 久久久久久久久久久久久9999| 国产一区二区0| 久久视频国产精品免费视频在线| 亚洲欧美日韩成人| 国产手机视频一区二区| 久久av红桃一区二区小说| 午夜精品影院| 国产一区二区高清不卡| 久久久久在线| 久久亚洲私人国产精品va| 亚洲国产欧洲综合997久久| 欧美电影资源| 欧美成人在线免费观看| 日韩一级片网址| 一区二区三区视频在线看| 国产精品久久久久久一区二区三区| 亚洲专区一区| 欧美一级大片在线免费观看| 狠狠色狠狠色综合日日小说| 欧美777四色影视在线| 欧美大片91| 亚洲视频在线观看网站| 亚洲在线黄色| 极品少妇一区二区三区精品视频| 媚黑女一区二区| 欧美精品999| 午夜精品久久久久久久99黑人| 西西裸体人体做爰大胆久久久| 伊甸园精品99久久久久久| 欧美激情欧美狂野欧美精品| 欧美日韩视频在线一区二区 | 久久精品视频在线播放| 欧美在线|欧美| 亚洲国产视频一区| 99国产精品一区| 国产一区二区三区黄| 亚洲国产国产亚洲一二三| 欧美无乱码久久久免费午夜一区| 欧美中文字幕视频在线观看| 久久久久久久久久久久久久一区| 日韩亚洲视频| 欧美一区二区三区久久精品| 亚洲精品免费在线| 亚洲男人影院|