OpenCASCADE 平面与球面求交

OpenCASCADE 平面与球面求交

[email protected]

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 = 0;
// 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 = 1;
    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 = 1;
    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,即相交的数量。

原文地址:https://www.cnblogs.com/opencascade/p/PlaneSphere.html

时间: 2024-10-08 05:20:32

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

OpenCASCADE圆与平面求交

OpenCASCADE圆与平面求交 [email protected] 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的交点,这个算法是将平面Plane作为二次曲面的一个特例来处理,最后主要是对三角函数方程进行求解. 当直接使用圆和平面作为参数时,IntAna_IntConicQuad重载了函数Perform来对圆和平面进行求交计算,这时的算法与前面解三角函数不同,代码如下: void IntAna_IntC

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

任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { double[] Xs = new double[] { 30, 260, 130, 350, 250, 330, 320, 180, 250, 50, 70, 60, 30, 260 }; double[] Ys = new double[] { 140, 260, 110, 150, 230, 210, 140, 260 }; int m = Xs.Len

POJ1408-Fishnet(线段求交)

Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1788   Accepted: 1144 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previous night he had enc

ray与triangle/quad求交二三事

引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做ray与quad的求交,发现方程里不仅有u和v,还有uv,没法变换成线性方程组的形式.本以为引擎中quad中四个点可以不共面,看过接口,不然,“不共面和退化的多边形不保证正确结果“.而后又有两个问题,一是,与一个quad求交比与两个三角形求交快吗?二是,如果前面的问题答案为否,即两个三角形更快,为何

三角形求交算法

在光线追踪中,我们常常要处理对于Mesh的渲染,由于Mesh一般由一个个三角形所构成,因此需要我们去计算光线和Mesh每个三角形之间是否存在交点.这可以看做是一个射线和三角形的求交问题.<Fundamentals of Computer Graphics (3rd edition)>中提出了一个in-place的算法,在这里予以介绍. 设光线的起点为e,方向为d,三角形三个顶点为a,b,c.那么可以得到: e+td=a+β(b-a)+γ(c-a) 其中,β.γ为三角形的重心坐标.β+γ<

【模板】线性基求交

线性基求交 struct lb{ ll p[63]; lb(){ memset(p,0,sizeof(p)); } void clear(){ memset(p,0,sizeof(p)); } void ins(ll x){ for(int i=60;i>=0;i--) if((x>>i)&1){ if(!p[i]){ p[i]=x; return; }else x^=p[i]; } } }; lb merge(lb a,lb b){ lb g=lb(),tmp=a; ll cu

osgUtil::PolygonIntersector多面体与模型求交

osg3.4版本的有问题,特别是一个比较大的三角形包含一部分多面体,他的计算过程是每次计算三角形的一条边与多面体求交,这种情况就无法计算多面体内部覆盖的三角部分 osg3.6.4版本更新了计算方法,但是有个Bug,需要修改PolygonIntersectorUtil::IntersectFunctor::contains()中,dest.swap(src)之后,添加: src.push_back(src.front()); 即新计算的点需要形成闭环,否则计算结果不正确 原文地址:https://

You can Solve a Geometry Problem too(线段求交)

http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8861    Accepted Submission(s): 4317 Problem Description Many

面向对象 (11)求交并集 判断字符形式

题目1:创建两个线性表,分别存储{“chen”,“wang”,“liu”,“zhang”}和{“chen”,“hu”,“zhang”},求这两个线性表的交集和并集. 一.源程序 /**两个线性表{“chen”,“wang”,“liu”,“zhang”}和{“chen”,“hu”,“zhang”}的交集和并集 * 1个方法 */ package cn.edu.ccut.w1125t1; import java.util.ArrayList; public class Main { public s