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. POJ 3237 /// 树链剖分 线段树区间修改(*-1)

    题目大意: 给定树的N个结点 编号为1到N 给定N-1条边的边权. 三种操作: CHANGE k w:将第 k 条边的权值改成 w. NEGATE x y:将x到y的路径上所有边的权值乘 -1. QU ...

  2. mysql的几种启动方式

    mysql的四种启动方式: 1.mysqld 启动mysql服务器:./mysqld --defaults-file=/etc/my.cnf --user=root 客户端连接: mysql --de ...

  3. PHP算法之盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  4. 40. 组合总和 II

    题目描述: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

  5. Eclipse注释快捷键、如何生成API以及可能遇到的问题解决

    1.Java注释方式单行注释// 快捷键:ctrl+/多行注释/* 快捷键:shift+ctrl+/*/文档注释/** 快捷键:shift+Alt+j */ 2.生成API文档 打开index.htm ...

  6. 关于Modelsim安装闪退

    在盗版Windows系统上,安装Modelsim时可能出现闪退. 现象表现为,在任务管理器中仍然有Modelsim的进程,但是看不到安装界面. 碰到这种情况可以尝试如下方法:退到安全模式下安装. 一般 ...

  7. cocos2D-X LUA 常用功能封装和工作经验的一些解决方案

    --[[ Packaging_KernelEngine.h 文件说明:所有对象在建立时位置是优先的,传入位置参数必须cc.p(X,Y) CurObj:表示要传入当前的对象 将3.10 lua api ...

  8. mvc和mvvm区别

    mvc和mvvm区别 MVC和MVVM的区别其实并不大.都是一种设计思想. 主要就是MVC中Controller演变成MVVM中的viewModel. MVVM主要解决了MVC中大量的DOM操作使页面 ...

  9. 谈谈域名DNS的缓存问题

    可以从很多地方看到,许多刚开始做站的朋友,对域名设置方面的知识原理一知半解,以至于为了某些测试需要,经常对域名解析大动干戈.今天改个A记录,明天又换个NS.又或者,在迁移域名,迁移网站的时候的时候由于 ...

  10. 接着上回,导包正确之后,出现javabean.Friend cannot be cast to java.util.List,的错误。找了很久。以为是User user0作为参数,改成了String username还是错误,看了看listFriend.jsp没有错误,我想会不会是包多了,导致类型复杂。最后发现包少了一个:

    import org.apache.commons.dbutils.handlers.BeanListHandler;这个包,BeanListHandler让我发现List<Friend> ...