首页 > 其他分享 >布尔数据 点的相交

布尔数据 点的相交

时间:2023-09-25 19:34:47浏览次数:33  
标签:Real return Vertex 相交 Standard 布尔 数据 BRep

布尔数据 点的相交

[email protected]

1 Introduction

OpenCASCADE中将相交干涉分成两种类型,一种类型是边界表示数据中的点线面Vertex, Edge, Face包含几何和容差,在3D空间中距离在容差范围之内的BRep相交。包含几何数据的点线面就有6种类型的BRep相交(BRep interferences):

  • Vertex/Vertex
  • Vertex/Edge
  • Vertex/Face
  • Edge/Edge
  • Edge/Face
  • Face/Face

第二种类型是一个模型完全在一个Solid之内,这种相交称为非BRep的相交(Non-BRep interferences),有四种可能:

  • Vertex/Solid
  • Edge/Solid
  • Face/Solid
  • Solid/Solid

上面两种类型的相交总共为10种,在类BOPDS_DS中通过静态函数NbInterfTypes()返回。代码如下:

//=======================================================================
//function : NbInterfTypes
//purpose  : Returns the number of types of the interferences
//=======================================================================
inline Standard_Integer BOPDS_DS::NbInterfTypes()
{
  return 10;
}

在BOPDS_Tools中又重新对相交的类型进行编码。本文通过在DRAW中使用Tcl来对源码进行DEBUG,主要来探究一下对点Vertex的相交处理。

2 Vertex/Vertex interference

上图所示为文档中对点/点相交的描述,当两个点之间的距离在容差范围之内时,判定为相交。相交的结果会得到新的点Vertex,其坐标为考虑两个点的容差的一个球的中心,容差为球的半径。在DRAW中输入命令:

vertex v1 1 2 3
vertex v2 1 2 3
bop v1 v2

其中两点求交代码如下:

//=======================================================================
// function: ComputeVV
// purpose: 
//=======================================================================
Standard_Integer BOPTools_AlgoTools::ComputeVV(const TopoDS_Vertex& aV1, 
                                               const TopoDS_Vertex& aV2,
                                               const Standard_Real aFuzz)
{
  Standard_Real aTolV1, aTolV2, aTolSum, aTolSum2, aD2;
  gp_Pnt aP1, aP2;
  Standard_Real aFuzz1 = (aFuzz > Precision::Confusion() ? aFuzz : Precision::Confusion());
  //
  aTolV1=BRep_Tool::Tolerance(aV1);
  aTolV2=BRep_Tool::Tolerance(aV2);
  aTolSum=aTolV1+aTolV2+aFuzz1;
  aTolSum2=aTolSum*aTolSum;
  //
  aP1=BRep_Tool::Pnt(aV1);
  aP2=BRep_Tool::Pnt(aV2);
  //
  aD2=aP1.SquareDistance(aP2);
  if (aD2>aTolSum2) {
    return 1;
  }
  return 0;
}

从代码中可以看出OCC中布尔模糊容差Fuzzy Tolerance的最高精度为Precision::Confusion()。根据相交结果生成新的点代码如下:

//=======================================================================
// function: MakeVertex
// purpose : Makes the vertex in the middle of given vertices with
//           the tolerance covering all tolerance spheres of vertices.
//=======================================================================
void BOPTools_AlgoTools::MakeVertex(const TopTools_ListOfShape& aLV,
                                    TopoDS_Vertex& aVnew)
{
  Standard_Integer aNb = aLV.Extent();
  if (aNb == 1)
    aVnew=*((TopoDS_Vertex*)(&aLV.First()));
  else if (aNb > 1)
  {
    Standard_Real aNTol;
    gp_Pnt aNC;
    BRepLib::BoundingVertex(aLV, aNC, aNTol);
    BRep_Builder aBB;
    aBB.MakeVertex(aVnew, aNC, aNTol);
  }
}

算法实现与文档描述一致。相交结果除了新产生的点,还有这些产生这些结果的数据都保存到BOPDS_InterfVV中,代码如下:

if (theAddInterfs) {
    if (myDS->AddInterf(n1, n2))
    {
        BOPDS_InterfVV& aVV = aVVs.Appended();
        aVV.SetIndices(n1, n2);
        aVV.SetIndexNew(nV);
    }
}

其中BOPDS_InterfVV中保存了哪两个点相交的索引n1, n2及产生新的点的索引nV。

3 Vertex/Edge interference

对于点Vi和边Ej相交的条件为点Vi到边的投影距离小于点Tol(Vi),边Tol(Ej)的容差之和。在DRAW中输入命令如下:

vertex v1 0 0 0
vertex v2 6 0 0
vertex v 3 0 0
edge e v1 v2
bop e v

其中点与边相交的代码如下:

//=======================================================================
//function : ComputeVE
//purpose  : 
//=======================================================================
Standard_Integer IntTools_Context::ComputeVE
  (const TopoDS_Vertex& theV, 
   const TopoDS_Edge&   theE,
   Standard_Real& theT,
   Standard_Real& theTol,
   const Standard_Real theFuzz)
{
  if (BRep_Tool::Degenerated(theE)) {
    return -1;
  }
  if (!BRep_Tool::IsGeometric(theE)) { 
    return -2;
  }
  Standard_Real aDist, aTolV, aTolE, aTolSum;
  Standard_Integer aNbProj;
  gp_Pnt aP;
  //
  aP=BRep_Tool::Pnt(theV);
  //
  GeomAPI_ProjectPointOnCurve& aProjector=ProjPC(theE);
  aProjector.Perform(aP);

  aNbProj=aProjector.NbPoints();
  if (!aNbProj) {
    return -3;
  }
  //
  aDist=aProjector.LowerDistance();
  //
  aTolV=BRep_Tool::Tolerance(theV);
  aTolE=BRep_Tool::Tolerance(theE);
  aTolSum = aTolV + aTolE + Max(theFuzz, Precision::Confusion());
  //
  theTol = aDist + aTolE;
  theT = aProjector.LowerDistanceParameter();
  if (aDist > aTolSum) {
    return -4;
  }
  return 0;
}

使用类GeomAPI_ProjectPointOnCurve来计算点到线的投影距离,当距离小于点Tol(V)和Tol(E)及模糊容差Fuzzy之和的认为是相交的。相交结果保存在BOPDS_InterfVE中,记录了点和边的索引及点在边上的参数。

这里面会引入两个新的概念:BOPDS_Pave和BOPDS_PaveBlock。其中PaveBlock中记录了边中所有的点的Pave,及边的索引。Pave中记录点的索引,在边上的参数。一个PaveBlock对应边上一小部分。

因为容差的原因还引入收缩范围Shrunk Range的概念,先记住这些概念看看后面如何使用这些数据。

4 Vertex/Face interference

点与面的相交也是通过点到面的投影距离来判定的。当然也可以用Tcl脚本来调试,这里留给同学们自己动手尝试一下。计算点与面相交的代码如下:

//=======================================================================
//function : ComputeVF
//purpose  : 
//=======================================================================
Standard_Integer IntTools_Context::ComputeVF
  (const TopoDS_Vertex& theVertex, 
   const TopoDS_Face&   theFace,
   Standard_Real& theU,
   Standard_Real& theV,
   Standard_Real& theTol,
   const Standard_Real theFuzz)
{
  Standard_Real aTolV, aTolF, aTolSum, aDist;
  gp_Pnt aP;

  aP = BRep_Tool::Pnt(theVertex);
  //
  // 1. Check if the point is projectable on the surface
  GeomAPI_ProjectPointOnSurf& aProjector=ProjPS(theFace);
  aProjector.Perform(aP);
  //
  if (!aProjector.IsDone()) { // the point is not  projectable on the surface
    return -1;
  }
  //
  // 2. Check the distance between the projection point and 
  //    the original point
  aDist = aProjector.LowerDistance();
  //
  aTolV = BRep_Tool::Tolerance(theVertex);
  aTolF = BRep_Tool::Tolerance(theFace);
  //
  aTolSum = aTolV + aTolF + Max(theFuzz, Precision::Confusion());
  theTol = aDist + aTolF;
  aProjector.LowerDistanceParameters(theU, theV);
  //
  if (aDist > aTolSum) {
    // the distance is too large
    return -2;
  }
  //
  gp_Pnt2d aP2d(theU, theV);
  Standard_Boolean pri = IsPointInFace (theFace, aP2d);
  if (!pri) {//  the point lays on the surface but out of the face 
    return -3;
  }
  return 0;
}

使用类GeomAPI_ProjectPointOnSurf来计算点到面的投影距离,并使用定位器IntTools_FClass2d来判断点是否在有界的Face面上。将计算结果保存到BOPDS_InterfVF中,保存数据有点与面的索引和点在面的参数空间上的参数。还更新面的信息,将这些点的索引保存到VerticesIn中。

5 Conclusion

综上所述,在DRAW中使用脚本可以方便对相关代码进行DEBUG。通过点与点、边和面的相交代码实现可以看出在BOPDS中对于相交结果保存了哪些数据。及模糊容差Fuzzy Tolerance的作用和精度。通过引入Pave, PaveBlock, Shrunk Range来保存求交结果及容差处理。

 

标签:Real,return,Vertex,相交,Standard,布尔,数据,BRep
From: https://www.cnblogs.com/opencascade/p/occt_vertex_interference.html

相关文章

  • hive string, map, struct类型的建表和导入数据语句
    本文转载于 https://blog.51cto.com/u_14405/6419362,https://blog.csdn.net/tototuzuoquan/article/details/115493697和 https://blog.csdn.net/weixin_43597208/article/details/117450579。今天要用到hive的string相关的数据类型和数据,直接附链接和sql语句Hive的String类......
  • 数据类型转换以及变量常量
    数据类型转换由于java是强类型的语言,所以有些运算时要进行类型转换运算时,不同类型的数据先转换为同一类型,然后再进行运算容量大小byte,short,char->int->long->float->doublefloat没有lang长但是在后面是因为小数的优先级要高强制转换的注意点1.不能对Boo......
  • 智慧工地系统源码,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
    智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化转型升级的重要抓手。智慧工地物......
  • Selenium模拟登录(数字验证码)+Requests获取json数据
    前言我只是想算算每个月洗澡花了多少钱……Selenium模拟登录登录需要提交账号、密码、验证码#实例化browser=webdriver.Edge()browser.implicitly_wait(10)url1='http://card.cqu.edu.cn/'browser.get(url1)#学工号和密码user_id='学号/工号'user_psd='密码'#输入学......
  • 喜报 | 谷器数据荣获“专精特新中小企业”认定!
    近日,北京市经济和信息化局公布了2023年第二季度专精特新中小企业认定名单。经过专业的审查和公示,谷器数据凭借聚焦于制造领域的卓越产品能力成功入选!“专精特新”是“专业化、精细化、特色化、新颖化”的简称。“专精特新”企业评选认定严格,从企业的经营条件、专业化程度、创新制造......
  • 智慧工地系统源码,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
    智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化转型升级的重要抓手。智慧工地物联......
  • MYSQL数据库SQL-删除
    1、deleteDelete删除表数据,保留表结构,且可以加where,删除一行或多行支持回滚操作既可以删除表也可以删除视图,truncate只能删除表不能删除视图(1)删除某张表中某个字段为'xxx'的行deletefrom表名where字段名='xxx'(2)删除整张表deletefrom表名不跟where条件时删......
  • 众多数据中台实施项目失败的原因?
    在当今数字化转型的浪潮中,数据中台作为关键的战略举措被越来越多的企业所关注和实施。然而,数据中台项目的实施过程中并不乏失败案例,这引业界对于数据中台失败原因的深入思考和分析。通过一些公开的信息和数据,可以学习和总线路一些数据中台失败的根本原因,从而避免类似的错误,实现真正......
  • 基于weka的数据库挖掘➖分类方法的实现
    基于weka的数据库挖掘➖分类方法的实现关于作者作者介绍......
  • 活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术
    数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显。作为中国数据库联盟(ACDU)的品牌活动之一,【ACDU中国行】在线下汇集数据库领域的行业知名人士,共同探讨数据库前沿技术及其应用,促进行业发展和创新,同时也为开发者们提供一个......