OpenCASCADE 平面与球面求交

eryar@163.com

OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面、圆柱面、圆锥面及平面,平面是二次曲面的特例)之间的交线。他们之间可能的结果有:

l 一个点

l 一条或两条直线

l 一个点和一条直线

l 圆

l 椭圆

l 抛物线

l 双曲线

将源码结合《高等数学》、《解析几何》等书,可以来学习如何将理论付诸实践。本文主要介绍这个类中平面与球面求交的源码实现。 

将源码列出如下:

void IntAna_QuadQuadGeo::Perform( const gp_Pln& P
,const gp_Sphere& S)
{ done = Standard_False;
Standard_Real A,B,C,D,dist, radius;
Standard_Real X,Y,Z; nbint = ;
// debug JAG : on met typeres = IntAna_Empty par defaut...
typeres = IntAna_Empty; P.Coefficients(A,B,C,D);
S.Location().Coord(X,Y,Z);
radius = S.Radius(); dist = A * X + B * Y + C * Z + D; if (Abs( Abs(dist) - radius) < Epsilon(radius)) {
// on a une seule solution : le point projection du centre de la sphere
// sur le plan
nbint = ;
typeres = IntAna_Point;
pt1.SetCoord(X - dist*A, Y - dist*B, Z - dist*C);
}
else if (Abs(dist) < radius) {
// on a un cercle solution
nbint = ;
typeres = IntAna_Circle;
pt1.SetCoord(X - dist*A, Y - dist*B, Z - dist*C);
dir1 = P.Axis().Direction();
if(P.Direct()==Standard_False) dir1.Reverse();
dir2 = P.Position().XDirection();
param1 = Sqrt(radius*radius - dist*dist);
}
param2bis=0.0; //-- pour eviter param2bis not used ....
done = Standard_True;
}

理解上述代码需要有平面一般方程的概念及点到平面的距离计算公式:

源码实现步骤如下:

l 取出平面一般方程的系数:A,B,C,D及球心坐标X,Y,Z;

l 计算球心到平面的距离dist;

l 若距离dist等于球面的半径,则平面为球面的切平面,只有一个交点;

l 若距离dist小于球面的半径,则平面与球面的交线为圆;

其中需要注意的是在获取平面一般方程的参数时,平面的法向为单位向量,所以在计算球心到平面的距离时的分母为1。

从上述代码可以看出OpenCASCADE的算法类的特点:即都有一个算法完成状态的函数IsDone(),通过成员变量done来设置,算法执行前都设置成false,算法成功后设置成true。还有一个前缀在变量名和函数名中很普遍,就是nb,是数量Number的缩写,这里是一个成员变量nbint,即相交的数量。

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

  1. OpenCASCADE 平面求交

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

  2. OpenCASCADE直线与平面求交

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

  3. OpenCASCADE圆与平面求交

    OpenCASCADE圆与平面求交 eryar@163.com 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的 ...

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

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

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

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

  6. ray与triangle/quad求交二三事

    引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...

  7. [NetTopologySuite](2)任意多边形求交

    任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...

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

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

  9. hdu 5111 树上求交

    hdu 5111 树上求交(树链剖分 + 主席树) 题意: 给出两棵树,大小分别为\(n1\),\(n2\), 树上的结点权值为\(weight_i\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...

随机推荐

  1. 19-Ubuntu-文件和目录命令-删除文件和目录-rm

    rm 删除文件或目录 注:使用rm命令要小心,因为文件删除后不能恢复.不会放在垃圾箱里,直接从磁盘删除. 选项 含义 -f 强制删除文件,无需提示.不能删除目录! -r 递归的删除目录下的内容,删除文 ...

  2. POJ 1946 Cow Cycling

    Cow Cycling Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2516   Accepted: 1396 Descr ...

  3. PostgreSQL 主键自动增长

    建立主键并设置自动增加的办法好好几种,这里记录我测试过的: drop table pro_process; CREATE TABLE "public"."pro_proc ...

  4. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  5. Java中逗号运算符的使用

    今天看到一道面试题,题目如下: 题目解释: 上面有一个类,有四个成员属性,以及两个构造方法(一个四个参数,一个两个参数),题目给出四个选项,问哪些选项可以满足在在四个参数的构造方法中完成x=a,y=b ...

  6. node---处理post请求

    //nodejs 处理post请求 // 异步 const http =require('http') const server=http.createServer((req,res)=>{ i ...

  7. day18 函数定义、参数;名称空间;全局变量及局部变量。

    Python之路,Day6 = Python基础6 函数的定义 def func1(): # 定义一个函数,名字叫func1,括号中没有传入参数 print('hello word') # 这里是 f ...

  8. eclipse查看源码的配置

    1.打开eclipse软件,点击window-preference 2.在弹出框中选择java-Installed JRES,选中的默认就行,然后点一下选中的,点击edit 3.弹出框中选择第二个,展 ...

  9. C++和JavaScript脚本的相互调用

    脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载 ...

  10. tomcat下文件路径

    第一种:复制要访问的文件a.txt至tomcat安装路径下的webapps/ROOT文件夹下: 访问路径为:localhost:8080/a.txt 或者在webapps文件夹下新建一个文件夹(tes ...