OpenCASCADE圆与平面求交

eryar@163.com

在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的交点,这个算法是将平面Plane作为二次曲面的一个特例来处理,最后主要是对三角函数方程进行求解。

当直接使用圆和平面作为参数时,IntAna_IntConicQuad重载了函数Perform来对圆和平面进行求交计算,这时的算法与前面解三角函数不同,代码如下:

  1. void IntAna_IntConicQuad::Perform (const gp_Circ& C, const gp_Pln& P,
  2. const Standard_Real Tolang,
  3. const Standard_Real Tol)
  4. {
  5.  
  6. done=Standard_False;
  7.  
  8. gp_Pln Plconic(gp_Ax3(C.Position()));
  9. IntAna_QuadQuadGeo IntP(Plconic,P,Tolang,Tol);
  10. if (!IntP.IsDone()) {return;}
  11. if (IntP.TypeInter() == IntAna_Empty) {
  12. parallel=Standard_True;
  13. Standard_Real distmax = P.Distance(C.Location()) + C.Radius()*Tolang;
  14. if (distmax < Tol) {
  15. inquadric = Standard_True;
  16. }
  17. else {
  18. inquadric = Standard_False;
  19. }
  20. done=Standard_True;
  21. }
  22. else if(IntP.TypeInter() == IntAna_Same) {
  23. inquadric = Standard_True;
  24. done = Standard_True;
  25. }
  26. else {
  27. inquadric=Standard_False;
  28. parallel=Standard_False;
  29. gp_Lin Ligsol(IntP.Line(1));
  30.  
  31. gp_Vec V0(Plconic.Location(),Ligsol.Location());
  32. gp_Vec Axex(Plconic.Position().XDirection());
  33. gp_Vec Axey(Plconic.Position().YDirection());
  34.  
  35. gp_Pnt2d Orig(Axex.Dot(V0),Axey.Dot(V0));
  36. gp_Vec2d Dire(Axex.Dot(Ligsol.Direction()),
  37. Axey.Dot(Ligsol.Direction()));
  38.  
  39. gp_Lin2d Ligs(Orig,Dire);
  40. gp_Pnt2d Pnt2dBid(0.0,0.0);
  41. gp_Dir2d Dir2dBid(1.0,0.0);
  42. gp_Ax2d Ax2dBid(Pnt2dBid,Dir2dBid);
  43. gp_Circ2d Cir(Ax2dBid,C.Radius());
  44.  
  45. IntAna2d_AnaIntersection Int2d(Ligs,Cir);
  46.  
  47. if (!Int2d.IsDone()) {return;}
  48.  
  49. nbpts=Int2d.NbPoints();
  50. for (Standard_Integer i=1; i<=nbpts; i++) {
  51.  
  52. gp_Pnt2d resul(Int2d.Point(i).Value());
  53. Standard_Real X= resul.X();
  54. Standard_Real Y= resul.Y();
  55. pnts[i-1].SetCoord(Plconic.Location().X() + X*Axex.X() + Y*Axey.X(),
  56. Plconic.Location().Y() + X*Axex.Y() + Y*Axey.Y(),
  57. Plconic.Location().Z() + X*Axex.Z() + Y*Axey.Z());
  58. paramonc[i-1]=Int2d.Point(i).ParamOnSecond();
  59. }
  60. done=Standard_True;
  61. }
  62. }

  

从上述代码中可以看出,直接对圆和平面求交的算法步骤如下:

l 对圆所在平面与平面进行求交,来判断圆所在平面与平面的状态:平行或是圆在平面内部;

l 如果圆所在平面与平面不平行,则得出交线;

l 然后将交线和圆转换成二维空间进行求交计算;

我觉得在得出圆所在平面与平面的交线后,再转换到二维空间来计算交点的方法有点复杂。在得到两个平面的交线后,就可以直接将圆心P0坐标向交线投影得到垂点Pm,先判断圆心到Pm点距离等于半径时,圆和平面就只有一个交点,就是Pm。小于半径时有两个交点,将Pm沿着交线方向分别移动L和-L距离就可以得到交点了,其中:

这样处理只涉及到一个点向直线投影、一个开方及几个向量操作,代码简单容量理解。

OpenCASCADE圆与平面求交的更多相关文章

  1. OpenCASCADE直线与平面求交

    OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...

  2. OpenCASCADE 平面求交

    OpenCASCADE 平面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二 ...

  3. HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)

    pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...

  4. 一步一步实现基于GPU的pathtracer(二):求交算法

    不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...

  5. OpenCASCADE 平面与球面求交

    OpenCASCADE 平面与球面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平 ...

  6. 光线求交-面、三角形、球 (Ray intersection)

    光线求交 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\); 球定义: center p, radius r; 平面定义:normal \(\vec{n}\) ...

  7. Gym - 101208J 2013 ACM-ICPC World Finals J.Pollution Solution 圆与多边形面积交

    题面 题意:给你一个半圆,和另一个多边形(可凹可凸),求面积交 题解:直接上板子,因为其实这个多边形不会穿过这个半圆,所以他和圆的交也就是和半圆的交 打的时候队友说凹的不行,不是板题,后面想想,圆与多 ...

  8. OpenCASCADE点向平面投影

    OpenCASCADE点向平面投影 OpenCASCADE的ProjLib类提供了解析曲线(直线.圆.椭圆.抛物线.双曲线)向解析曲面(平面.圆柱面.圆锥面.球面.圆环面)投影的功能,主要用来计算三维 ...

  9. work2_求交点数

    教学班级:周三上午三四节 项目地址:https://github.com/875571216/- PSP表格 psp2.1 Personal Software Process Stages 预估耗时( ...

随机推荐

  1. 2018今日头条湖北省赛【A】

    [题目链接]https://www.nowcoder.com/acm/contest/104/A 这题就是很简单的几何题..md现场推了很久的cos sin仿佛像个zz.自己都想给自己一巴掌. 题意就 ...

  2. Mybatis与Spring整合(CURD)

    项目采用Maven构建,用Junit进行测试,数据库是Mysql,连接池是c3p0,未测试缓存部分 1.Maven的“pom.xml”文件 <project xmlns="http:/ ...

  3. 2019-7-29-asp-dotnet-core-从-Frp-获取用户真实-IP-地址

    title author date CreateTime categories asp dotnet core 从 Frp 获取用户真实 IP 地址 lindexi 2019-07-29 08:28: ...

  4. Delphi 第一课

    Delphi 是面向对象的 可视化的集成开发环境 对象包括属性 方法   事件. 用户事件 对象响应事件 不同的对象响应事件不一样

  5. uoj49 轴仓库

    题意: n叠箱子排成一线,第i叠箱子坐标为xi,竖直方向叠着ai个箱子. 可以花费+1s左移或右移一位,也可以在瞬间搬起一个位置的箱子,或将怀里的有且仅有一个箱子放下. 任意选择起点s(可以不与xi重 ...

  6. layui实现已知被选中的option,怎样渲染

    在项目中用到layui实现第几个option 实现,在select中渲染出需要展示的option 代码: $("#period option[value="+res.data.se ...

  7. 【JZOJ6350】考试(test)

    description analysis 对于\(n=0\)的点,直接模拟就好了 状压\(DP\),设\(f[i][j][S]\)表示到第\(i\)题.连续\(GG\)了\(j\)题.喝的饮料集合为\ ...

  8. windows 嵌入控制台

    { 实际非常简单 需要控制台的hwnd 和 hdc 能获取控制台的hwnd 那hdc 就出来了 有了hdc 还有什么不能干的呢?? 如果会win32 窗口编程的就知道hdc,是一个让人流口水的类型 } ...

  9. dos中文乱码怎么办?

    最简单的方法: 通过 chcp命令改变代码页,UTF-8的代码页为65001 即chcp 65001 chcp 65001  就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp ...

  10. ps快速将白底图片变为透明图片

    方法一: 如果图层有锁图标,则要点击它,然它消失.然后选中魔棒工具,然后点击图片上要透明的区域,按下backspace键即可. 方法二: 转载自:https://blog.csdn.net/sunyi ...