首页 > 其他分享 >OpenCASCADE二维曲线求交

OpenCASCADE二维曲线求交

时间:2023-11-27 19:13:35浏览次数:36  
标签:求交 曲线 二次曲线 二维 OpenCASCADE 交点

OpenCASCADE二维曲线求交

1 Introduction

OpenCASCADE中对二维曲线求交和三维曲线求交是不同的,三维曲线求交统一使用离散法,二维曲线求交根据曲线类型的不同分种类型进行处理。二维曲线求交中还提供了计算自交的直接接口。在TKGeomAlgo中,主要内容就是拟合、求交算法,理解求交算法的实现原理,达到能阅读和修改源码的状态,能够分析和解决实际遇到的问题,理解OpenCASCADE的能力边界,根据需要选择所需要的功能,使软件结果可控。本文主要介绍二维曲线相交的实现原理。

由于OpenCASCADE开发时间相对久远,在二维曲线求交相关代码中大量使用了宏定义的方式来实现C++ 的模板template能力,宏定义在类的XXX_0.cxx文件中,对应模板实现在*.gxx中:

这种实现方式会让代码的可读性变差,不利于代码维护。应该用C++的方式对这些*.gxx代码重构,增强代码可读性和可维护性。

2 求交分类

二维求交使用类Geom2dAPI_InterCurveCurve, 这个类是对类Geom2dInt_GInter的封装。在类Geom2dInt_GInter中,如果只输入一条曲线,可以计算自交,如果输入两条曲线,计算两条曲线的相交。

  • IntCurve_IntConicConic:二次曲线与二次曲线求交。二次曲线与二次曲线求交都先使用几何方法计算交点,再判断是否在参数范围内;
  • Geom2dInt_TheIntConicCurveOfGInter:二次曲线与任意曲线求交。二次曲线与任意曲线求交通过类Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter建立距离方程,使用类math_FunctionAllRoots来对方程进行求解;
  • Geom2dInt_TheIntPCurvePCurveOfGInter:任意曲线与任意曲线求交。自由曲线求交使用离散法IntCurve_IntPolyPolyGen,使用类Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter将曲线通过采样点生成多段线Polyline,使用类Intf_InterferencePolygon2d

计算多段线之间的粗交点,再使用类IntCurve_ExactIntersectionPoint

通过粗交点找到曲线上的精确交点;

这些类都是从类IntRes2d_Intersection派生:

从上图可知,二维求交结果类IntRes2d_Intersection相关派生类可知二维求交与HLR算法也有关系,理解二维曲线求交逻辑,对理解HLR代码也有帮助。

3 自交计算

当只输入一条曲线时,可以对曲线进行自交计算,主要实现逻辑为:若为普通二次曲线,则不会自交;若是其他曲线,使用离散法对曲线进行自交计算。代码如下图所示:

4 求交结果

二维曲线求交结果保存到类IntRes2d_Intersection中,主要包含两部分:

  • IntRes2d_IntersectionPoint:交点数据,保存交点坐标值,交点在两个曲线上的参数,及两条曲线在交点处的过渡状态Transition;
  • IntRes2d_IntersectionSegment:交线数据,当两条曲线有重叠时的几何奇异情况时,求交结果为交线;

因为类IntRes2d_Interseciton的构造函数protected,所以不能直接使用这个类,都是通过其派生类使用函数SetValues()将计算得到的交点和交线数据保存起来。这里类的设计比较繁琐,代码可读性较差。

5 Conclusion

OpenCASCADE对于二维曲线求交进行分类处理,根据曲线类型是二次曲线、参数曲线分成三类:二次曲线与二次曲线求交、二次曲线与参数曲线求交和参数曲线与参数曲线求交,不同的求交类型采用不同的策略可以提高求交性能和稳定性。使用离散法计算二维曲线自交。从求交结果来看,也处理了几何奇异问题,即曲线重叠情况。

对于曲线求交还有很大改进空间:

  • 使用C++编码风格重构*.gxx代码,提高代码可读性,方便代码维护;
  • 对于自由曲线求交的离散法中计算两条多段线算法中引入BVH来加速;
  • 对于三维曲线求交都是使用了离散法,建议像二维曲线求交这样进行分类处理,以及引入BVH,提高性能和稳定性;

 

标签:求交,曲线,二次曲线,二维,OpenCASCADE,交点
From: https://www.cnblogs.com/opencascade/p/occt_int_curve2d.html

相关文章

  • c语言中向函数传递二维矩阵的方法
    在C语言中,向函数传递二维数组有几种方式,这主要取决于二维数组的大小是否已知。下面是几种常见的方式:  1)如果二维数组的大小已知,那么你可以在函数参数中直接指定数组的大小。例如: voidfunc(intarr[10][10]){...} 在这个例子中,func函数接受一个10x10的二维数组作为参数......
  • 二维数组
    多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组语法:inta[][]=newint[4][5];以上二维数组a可以看成一个两行五列的数组publicclassDemo02{publicstaticvoidmain(String[]args){int[][]a={{1,2},{2,3},......
  • 二维数组
    packagearray;publicclassArrayDemo05{publicstaticvoidmain(String[]args){int[][]array={{1,2},{2,3},{3,4},{4,5}};//[4][2]/*1,2array[0]2,3array[1]3,4array[2]4,5array[3]......
  • 定义二维数组,冒泡排序法
    //#define_CRT_SECURE_NO_WARNINGS1////#include<stdio.h>//#include<stdlib.h>//#include<string.h>//#include<math.h>//voidbubble_sort(intarr[],intsz)//{// inti=0;// for(i=0;i<sz-1;i++)// {// intj=0......
  • 二维数组
    一.二维数组`2041:【例5.9】新矩阵时间限制:1000ms内存限制:65536KB提交数:54995通过数:26522【题目描述】已知一个n×n(2≤n≤20)的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。【输入】第一行为n;下面为一个n×n,矩阵中各正整......
  • 一维数组与二维数组的创建、初始化和储存
     一、一维数组1.数组的创建 数组是一组相同类型的集合。数组的创建方式:type_t  arr_name  [contest_n];//type_t是指数组的元素类型//const_n是一个常量表达式,用来指数组的大小介绍一下strlen和sizeof的区别strlen和sizeof没什么关联strlen是求字符串长度的,只能根据字符串......
  • 二维费用背包
    二维费用背包题目描述有\(N\)件物品和一个容量是\(V\)的背包,背包能承受的最大重量是\(M\)。每件物品只能用一次。体积是\(v_i\),重量是\(m_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。输出最大价......
  • 快手原始ID转二维码工具,3m开头UID,一键转二维码跳转APP
    之前客户定制过一个工具,就是它从直播间或者评论区提取的ID都是3m开头的,这个不是快手id,类似于微信的原始ID,通过这个ID我们在快手客户端是搜不到的,但是通过浏览器能访问对方主页,比如”3xe9azfmv3396qq“这种形式的,我就开发了一个转二维码工具,就是把这个原始ID转换成二维码,然后通过扫......
  • 陌陌头像留二维码隐藏技术,微信号,双头像生成工具,“codeA”方式开源
    正常情况下我们在陌陌头像留二维码会被系统检测到的,因为它识别到了这是二维码是,就算不封号对账号权重也有营销,但是一些人想在陌陌做一些产品,比如足浴、保健品之类的,想在陌陌引流,那么留二维码头像不封号的实现就非常重要了,我制作的这个工具可以生成干扰码,就是二维码生成干扰码导致......
  • 陌陌头像留微信号二维码不被检测的方法,工具一键生成干扰码,屏蔽系统检测
    正常情况下我们在陌陌头像留二维码会被系统检测到的,因为它识别到了这是二维码是,就算不封号对账号权重也有营销,但是一些人想在陌陌做一些产品,比如足浴、保健品之类的,想在陌陌引流,那么留二维码头像不封号的实现就非常重要了,我制作的这个工具可以生成干扰码,就是二维码生成干扰码导致......