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 预估耗时( ...
随机推荐
- 【Codeforces Round #499 (Div. 1) B】Rocket
[链接] 我是链接,点我呀:) [题意] 让你猜到火星的距离x是多少. 已知1<=x<=m 然后你可以问系统最多60个问题 问题的形式以一个整数y表示 然后系统会回答你3种结果 -1 x& ...
- Ubuntu 安装 Courier New字体和雅黑consolas字体
一直觉得Ubuntu下的字体不是很好,但毕竟不影响使用,然后作开发的时候eclipse的字体完全没有windows下的两大适合编成的字体courier new 和consloas .可以使用系统安装字 ...
- leetcode第一刷_Reverse Linked List II
翻转链表绝对是终点项目,应该掌握的,这道题要求的是翻转一个区间内的节点.做法事实上非常相似,仅仅只是要注意判定開始是头的特殊情况,这样head要更新的,还有就是要把翻转之后的尾部下一个节点保存好,要么 ...
- UnityShader实例13:屏幕特效之均值模糊(Box Blur)
均值模糊(Box Blur) 概述 因为公司手游项目需求.须要一个适合手机平台的模糊效果,同一时候须要开放一个參数便于调节模糊值.我首先想到的就是ps里面的均值模糊. 查资料能够知道均值模糊是一种高速 ...
- [BLE--Link Layer]设备蓝牙地址
简述 不论什么网络设备而言,都会有自己独特的一个MAC地址,不然在设备量较大的情况下非常可能造成通信的混乱.蓝牙是无线通信中使用非常广泛的技术.当然其蓝牙地址也是相当的重要的了. 蓝牙地址简述 种类划 ...
- 【LeetCode-面试算法经典-Java实现】【168-Excel Sheet Column Title(Excell列标题)】
[168-Excel Sheet Column Title(Excell列标题)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a positive in ...
- xmanager使用
Xmanager全称Netsarang Xmanager,是国外一套非常优秀的远程监控软件.在UNIX/Linux和Windows网络环境中,Xmanager是最好的连通解决方案.我推 荐大家下载En ...
- 将枚举存入map集合
遍历枚举存入集合: Map<String,Object> deptLevel = new HashMap<>(); for(OrgBussinessEnum orgBussin ...
- (转)js document.all的用法
document.all用法 一. document.all是页面内所有元素的一个集合.例如: document.all(0)表示页面内第一个元素 二.document.all可以判断浏览器 ...
- Java绘图技术基础
public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 de ...