OpenCASCADE直线与平面求交
OpenCASCADE直线与平面求交
在《解析几何》相关的书中都给出了直线和平面的一般方程和参数方程。其中直线的一般方程有点向式形式的。

由于过空间一点可作且只能作一条直线平行于已知直线,所以当直线上一点(x0, y0, z0)和它的一方向向量(m,n,p)为已知时,直线就完全确定了。所以在OpenCASCADE中直线类gp_Lin有一个构造函数:
gp_Lin (const gp_Pnt &P, const gp_Dir &V) 即通过点和方向来构造直线。由直线的点向式方程容易导出直线的参数方程:

其中OpenCASCADE的直线是用参数方程来表示的。
同理对于平面而言,过空间一点可以作而且只能作一平面垂直于一已知直线,所以平面的一点(x0,y0,z0)和它的一个法线方向(A, B, C)为已知时,平面就完全确定了。所以平面方程也有点向式的:

从一个点和两个不共线的向量确定一个平面作为讨论的出发点,可以得出平面的参数方程:

如上图所示,已知一个点M0(x0,y0,z0),向量v1(x1,y1,z1)和向量v2(x2,y2,z2),我们来求点M0和向量V1,V2确定的平面方程。点M(x,y,z)在平面上的充要条件是向量M0M与V1, V2共面。因为向量V1, V2不平行,所以共面的充要条件是存在唯一的一对实数u, v使:

向量M0M和V1,V2共面的充要条件是:

根据平面的参数方程可知,要确定一个平面从参数方程的角度来看需要一个点和两个方向。从参数方程推导出一般方程的过程也是计算平面一般方程系数的方法。
根据直线的参数方程及平面的一般方程可以推导出直线与平面交点的计算公式,推导过程如下:

从上面的推导过程可以看出,计算直线与平面的交点主要就是计算参数t,当t求出后代入直线参数方程即可得到交点坐标。从参数t的计算公式可知,有个特殊情况就是分母为零的情况,此时是直线与平面平行共面需要特别处理。
在OpenCASCADE中提供了直线与平面求交的计算类IntAna_IntConicQuad,其实现源码如下:
void IntAna_IntConicQuad::Perform (const gp_Lin& L, const gp_Pln& P,
const Standard_Real Tolang,
const Standard_Real Tol,
const Standard_Real Len) { // Tolang represente la tolerance angulaire a partir de laquelle on considere
// que l angle entre 2 vecteurs est nul. On raisonnera sur le cosinus de cet
// angle, (on a Cos(t) equivalent a t au voisinage de Pi/2). done=Standard_False; Standard_Real A,B,C,D;
Standard_Real Al,Bl,Cl;
Standard_Real Dis,Direc; P.Coefficients(A,B,C,D);
gp_Pnt Orig(L.Location());
L.Direction().Coord(Al,Bl,Cl); Direc=A*Al+B*Bl+C*Cl;
Dis = A*Orig.X() + B*Orig.Y() + C*Orig.Z() + D;
//
parallel=Standard_False;
if (Abs(Direc) < Tolang) {
parallel=Standard_True;
if (Len!= && Direc!=) {
//check the distance from bounding point of the line to the plane
gp_Pnt aP1, aP2;
//
aP1.SetCoord(Orig.X()-Dis*A, Orig.Y()-Dis*B, Orig.Z()-Dis*C);
aP2.SetCoord(aP1.X()+Len*Al, aP1.Y()+Len*Bl, aP1.Z()+Len*Cl);
if (P.Distance(aP2) > Tol) {
parallel=Standard_False;
}
}
}
if (parallel) {
if (Abs(Dis) < Tolang) {
inquadric=Standard_True;
}
else {
inquadric=Standard_False;
}
}
else {
parallel=Standard_False;
inquadric=Standard_False;
nbpts = ;
paramonc [] = - Dis/Direc;
pnts[].SetCoord(Orig.X()+paramonc[]*Al,
Orig.Y()+paramonc[]*Bl,
Orig.Z()+paramonc[]*Cl);
}
done=Standard_True;
}
从上述代码中可以看出其计算思路也是先计算参数t,还加了一个特殊用法,即当参数Len!=0且参数t的分母!=0时重新判断直线与平面的平行状态。这个用法虽然有平行状态的重新判断,但是如果不平行没有计算交点的处理。所以使用这个函数时,参数Len可以用默认值0,即不用这段处理逻辑。还有个不严谨的地方是这里的实数判断没有用区间判断法。
OpenCASCADE直线与平面求交的更多相关文章
- OpenCASCADE圆与平面求交
OpenCASCADE圆与平面求交 eryar@163.com 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的 ...
- OpenCASCADE 平面求交
OpenCASCADE 平面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二 ...
- 一步一步实现基于GPU的pathtracer(二):求交算法
不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...
- OpenCASCADE 平面与球面求交
OpenCASCADE 平面与球面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平 ...
- max of 直线划平面
在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域. Input 第一行包含一个整数T,(0& ...
- HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)
pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...
- 光线求交-面、三角形、球 (Ray intersection)
光线求交 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\); 球定义: center p, radius r; 平面定义:normal \(\vec{n}\) ...
- OpenCASCADE点向平面投影
OpenCASCADE点向平面投影 OpenCASCADE的ProjLib类提供了解析曲线(直线.圆.椭圆.抛物线.双曲线)向解析曲面(平面.圆柱面.圆锥面.球面.圆环面)投影的功能,主要用来计算三维 ...
- work2_求交点数
教学班级:周三上午三四节 项目地址:https://github.com/875571216/- PSP表格 psp2.1 Personal Software Process Stages 预估耗时( ...
随机推荐
- Java实现把两个数组合并为一个的方法总结
本文实例讲述了Java实现把两个数组合并为一个的方法.分享给大家供大家参考,具体如下: 在Java中,如何把两个String[]合并为一个? 看起来是一个很简单的问题.但是如何才能把代码写得高效简洁, ...
- Windows 8.1硬盘安装Ubuntu 14.04双系统
Windows 8.1硬盘安装Ubuntu 14.04双系统 学习了: http://www.jb51.net/os/windows/298507.html http://www.linuxidc.c ...
- Cocos2d-x-lua学习点滴
Lua下的方法.自己项目经验,个人见解,不能确保正确. Sprite: local Light = CCSprite:create("light.png") ...
- php利用href进行页面传值的正确姿势
首先在a.php中 <?php $a = "world"; echo "<a href='b.php?m=$a'>删除</a>"; ...
- [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)
题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...
- SharePoint 使用Expression Web 设计网站
创建好网站以后可就可以开始发布了 possible causes : 1.The web server may not hava the FrontPage Server Extensions ins ...
- MyBatis数据持久化(三)增删改查
上篇文章中我们使用mybatis成功建立数据库会话,并从表中查询出相应的数据,本文在此基础上介绍MyBatis另外几种操作,即插入.修改.删除记录. 1.修改User.xml文件,增加几条sql语句: ...
- 51nod 1268 和为K的组合 dfs
题目: 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:& ...
- 51nod 1267 4个数和为0 思路:哈希map+避免重复的点
题目: 总结大佬们的思路: 思路1:所有数两两求和,存入map中,每次判断有没有相反数被标记过. 思路2:对所有数排序,排完所有数两两求和,结果正好是排好序的.然后扫一遍,二分查找看之前有没有相反数存 ...
- hiho151周*
题目链接 题目大意:依次在给定的三维坐标上垒方块,对于一个新的坐标需满足两个条件 1:六个方向有相邻的方块或者z==1[题目说明了初始状态是:所有z==0的位置都有方块] 2:该位置存在一条到无穷远处 ...