Intersection between 2d conic in OpenCASCADE

简介: Intersection between 2d conic in OpenCASCADE eryar@163.com   Abstract. OpenCASCADE provides the algorithm to implement of the intersection between two 2d conic curve.

Intersection between 2d conic in OpenCASCADE

eryar@163.com

 

Abstract. OpenCASCADE provides the algorithm to implement of the intersection between two 2d conic curve. The conic is defined by its implicit quadaratic equation, so the intersection problem is become a polynomial roots finding problem. The paper focus on the two conic curve intersection algorithm implementation.

 

Key Words. 2d conic intersection, conic equation,

 

1.Introduction

高中的时候学习了直线Line、圆Circle、圆锥曲线Conic(椭圆Ellipse、双曲线Hyperbola和抛物线parabola)等二维曲线的方程及特性,也可以对他们之间的相交情况进行计算。如何编程实现任意两个圆锥曲线相交呢?本文通过对OpenCASCADE中二维圆锥曲线相交代码的分析来理解其实现原理。

wps72EF.tmp 

Figure 1. 圆锥曲线相交

 

 

2.Conic Implicit Equation

圆锥曲线一般的代数表示方法为:

wps7300.tmp

OpenCASCADE中使用类IntAna2d_Conic来表示圆锥曲线的代数方程。并提供了将二维曲线(直线、圆、椭圆、抛物线、双曲线)转换成代数方程的方法,相关代码如下所示:

IntAna2d_Conic::IntAna2d_Conic (const gp_Lin2d& L) {

 

  a = 0.0;

  b = 0.0;

  c = 0.0;

  L.Coefficients(d,e,f);

  f = 2*f;

}

 

IntAna2d_Conic::IntAna2d_Conic (const gp_Circ2d& C) {

 

  C.Coefficients(a,b,c,d,e,f);

}

 

IntAna2d_Conic::IntAna2d_Conic (const gp_Elips2d& E) {

 

  E.Coefficients(a,b,c,d,e,f);

}

 

IntAna2d_Conic::IntAna2d_Conic (const gp_Parab2d& P) {

  P.Coefficients(a,b,c,d,e,f);

}

 

IntAna2d_Conic::IntAna2d_Conic (const gp_Hypr2d& H) {

  H.Coefficients(a,b,c,d,e,f);

}

 

 

3.Intersection between Circle and Conic

当对二维圆和圆锥曲线进行求交时,先得到圆的半径和圆锥曲线的一般式方程。将圆用参数方程表示并代入圆锥曲线的一般式方程中得到:

wps7311.tmp
所以圆和圆锥曲线求交问题转换为三角函数方程求解的问题。OpenCASCADE的math包中提供了类math_TrigonometricFunctionRoots来求解如下三角函数方程的根:

wps7312.tmp

直接将对应的系数传入即可对如上形式的三角函数方程进行求根。OpenCASCADE中圆和圆锥曲线求交的代码如下所示:

void IntAna2d_AnaIntersection::Perform(const gp_Circ2d& Circle,

  const IntAna2d_Conic& Conic)

{

   Standard_Boolean CIsDirect = Circle.IsDirect();

   Standard_Real A,B,C,D,E,F;

   Standard_Real pcc,pss,p2sc,pc,ps,pcte;

   Standard_Real radius=Circle.Radius();

   Standard_Real radius_P2=radius*radius;

   Standard_Integer i;

   Standard_Real tx,ty,S;

 

   done = Standard_False;

   nbp  = 0;

   para = Standard_False;

   empt = Standard_False;

   iden = Standard_False;

 

   gp_Ax2d Axe_rep(Circle.XAxis());

   

   Conic.Coefficients(A,B,C,D,E,F);

   Conic.NewCoefficients(A,B,C,D,E,F,Axe_rep);

  

   // Parametre a avec x=Radius Cos(a)  et y=Radius Sin(a)

 

   pss = B*radius_P2;

   pcc = A*radius_P2 - pss;                            // COS ^2

   p2sc =C*radius_P2;                                  // 2 SIN COS

   pc  = 2.0*D*radius;                                 // COS

   ps  = 2.0*E*radius;                                 // SIN

   pcte= F + pss;                                      // 1

 

   math_TrigonometricFunctionRoots Sol(pcc,p2sc,pc,ps,pcte,0.0,2.0*M_PI);

 

   if(!Sol.IsDone()) {

     cout << "\n\nmath_TrigonometricFunctionRoots -> NotDone\n\n"<<endl;

     done=Standard_False;

     return;

   }

   else { 

     if(Sol.InfiniteRoots()) {

       iden=Standard_True;

       done=Standard_True;

       return;

     }

     nbp=Sol.NbSolutions();

     for(i=1;i<=nbp;i++) {

       S = Sol.Value(i);

       tx= radius*Cos(S); 

       ty= radius*Sin(S); 

       Coord_Ancien_Repere(tx,ty,Axe_rep);

       if(!CIsDirect) 

S = M_PI+M_PI-S;

       lpnt[i-1].SetValue(tx,ty,S);

     }       

     Traitement_Points_Confondus(nbp,lpnt);

   }       

   done=Standard_True;

 }

上述代码的实现过程如下:先计算出圆锥曲线在圆的坐标系下的一般式方程的系数,再用圆的参数方程代入圆锥曲线的一般式将二元二次方程转换成一元三角函数方程,最后对三角函数方程进行求解。

wps7313.tmp 
Figure 2. 圆及其参数方程

 

4.Intersection between Ellipse and Conic

二维椭圆与圆锥曲线求交的实现与圆的实现类似,唯一不同的就是椭圆的参数方程与圆的参数稍有不同。

wps7314.tmp
依然使用椭圆的参数方程将圆锥曲线的二元二次方程化为一元的三角函数方程,再对三角函数方程进行求解。相关代码如下所示:

void IntAna2d_AnaIntersection::Perform(const gp_Elips2d& Elips,

  const IntAna2d_Conic& Conic)

{

  Standard_Boolean EIsDirect = Elips.IsDirect();

  Standard_Real A,B,C,D,E,F;

  Standard_Real pcte,ps,pc,p2sc,pcc,pss;

  Standard_Real minor_radius=Elips.MinorRadius();

  Standard_Real major_radius=Elips.MajorRadius();

  Standard_Integer i;

  Standard_Real tx,ty,S;

 

  done = Standard_False;

  nbp = 0;

  para = Standard_False;

  iden = Standard_False; 

  empt = Standard_False;

 

 

  gp_Ax2d Axe_rep(Elips.XAxis());

 

  Conic.Coefficients(A,B,C,D,E,F);

  Conic.NewCoefficients(A,B,C,D,E,F,Axe_rep);  

 

  // Parametre : a avec x=MajorRadius Cos(a)  et y=MinorRadius Sin(a)

 

  pss= B*minor_radius*minor_radius;                   // SIN ^2

  pcc= A*major_radius*major_radius-pss;               // COS ^2

  p2sc=C*major_radius*minor_radius;                   // 2 SIN COS

  pc= 2.0*D*major_radius;                             // COS

  ps= 2.0*E*minor_radius;                             // SIN

  pcte=F+pss;                                         // 1

 

  math_TrigonometricFunctionRoots Sol(pcc,p2sc,pc,ps,pcte,0.0,2.0*M_PI);

 

  if (!Sol.IsDone()) {

    done=Standard_False;

    return;

  }

  else { 

    if(Sol.InfiniteRoots()) {

      iden=Standard_True;

      done=Standard_True;

      return;

    }

    nbp=Sol.NbSolutions();

    for(i=1;i<=nbp;i++) {

      S = Sol.Value(i);

      tx=major_radius*Cos(S); 

      ty=minor_radius*Sin(S);

      Coord_Ancien_Repere(tx,ty,Axe_rep);

      if(!EIsDirect) 

S = M_PI+M_PI-S;

      lpnt[i-1].SetValue(tx,ty,S);

    }

    Traitement_Points_Confondus(nbp,lpnt);

  }

  done = Standard_True;

}

 

 

 

5.Intersection between Parabola and Conic

将抛物线Parabola的标准方程代入圆锥曲线的一般式方程可将二元二次方程化成一元四次方程:

wps7315.tmp

再对这个一元四次方程进行求解,相关代码如下所示:

void IntAna2d_AnaIntersection::Perform(const gp_Parab2d& P, 

       const IntAna2d_Conic& Conic)

  {

    Standard_Boolean PIsDirect = P.IsDirect();

    Standard_Real A,B,C,D,E,F;

    Standard_Real px4,px3,px2,px1,px0;

    Standard_Integer i;

    Standard_Real tx,ty,S;

    Standard_Real un_sur_2p=0.5/(P.Parameter());

    gp_Ax2d Axe_rep(P.MirrorAxis());

 

    done = Standard_False;

    nbp = 0;

    para = Standard_False;

    empt = Standard_False;

    iden = Standard_False; 

 

    Conic.Coefficients(A,B,C,D,E,F);

    Conic.NewCoefficients(A,B,C,D,E,F,Axe_rep); 

 

    //-------- 'Parametre'  y avec y=y  x=y^2/(2 p)

   

    px0=F;

    px1=E+E;

    px2=B + un_sur_2p*(D+D);

    px3=(C+C)*un_sur_2p;

    px4=A*(un_sur_2p*un_sur_2p);

   

    MyDirectPolynomialRoots Sol(px4,px3,px2,px1,px0);

 

    if(!Sol.IsDone()) {

      done=Standard_False;

    }

    else {  

      if(Sol.InfiniteRoots()) {

iden=Standard_True;

done=Standard_True;

      }

      nbp=Sol.NbSolutions();

      for(i=1;i<=nbp;i++) {

S = Sol.Value(i);

tx=un_sur_2p*S*S;

ty=S;

Coord_Ancien_Repere(tx,ty,Axe_rep);

if(!PIsDirect) 

  S =-S;

lpnt[i-1].SetValue(tx,ty,S);

      }

      Traitement_Points_Confondus(nbp,lpnt);

    }

    done=Standard_True;

  }

 

 

 

6.Conclusion

圆(椭圆)与圆锥曲线相交,将圆(椭圆)的参数方程代入圆锥曲线的一般式,将圆锥曲线方程化为三角函数方程,再对三角函数方程进行求解得到交点。

抛物线与圆锥曲线相交,将抛物线方程代入圆锥曲线的一般式,将圆锥曲线方程化为一元四次方程,再对方程进行求解得到交点。

综上所述,二维圆锥曲线相交的处理都是利用圆锥曲线的一般式与相应的参数方程化为一元函数方程,再对方程进行求解。

 

 

7.References

1. 人民教育出版社中学数学室. 数学第二册上. 人民教育出版社. 2000

2. 同济大学数学教研室. 高等数学. 高等教育出版社. 1996

3. 易大义, 沈云宝, 李有法. 计算方法. 浙江大学出版社. 2002

4. 李原, 张开富, 余剑峰. 计算机辅助几何设计技术及应用. 西北工业大学出版社. 2007

5. 丘维声. 解析几何. 北京大学出版社. 1996

 

目录
相关文章
|
存储 分布式计算 大数据
大数据处理流程包括哪些环节
大数据处理流程作为当今信息时代的关键技术之一,已经成为各个行业的必备工具。这个流程涵盖了从数据收集、存储、处理、分析到应用的各个环节,确保了数据的有效利用和价值的最大化。
|
8月前
|
人工智能 安全 测试技术
山石网科×阿里云通义灵码,开启研发“AI智造”新时代
山石网科与阿里云的合作由来已久,双方在云计算、网络安全等领域保持着紧密的合作关系。此次山石网科全面接入阿里云通义灵码专属版,是双方合作关系的进一步深化,也是双方共同推动AI技术在网络安全领域应用的一次重要实践。未来,山石网科将继续与阿里云携手共进,积极探索AI技术在网络安全领域的创新应用,不断提升产品研发效率和服务质量,为用户提供更智能、更安全的网络安全解决方案,共同守护数字世界的安全!
山石网科×阿里云通义灵码,开启研发“AI智造”新时代
|
算法 5G
|
12月前
|
安全 算法 网络安全
|
11月前
|
存储 Prometheus 监控
服务器监控软件Prometheus
【10月更文挑战第19天】
188 6
|
11月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
288 3
|
数据库 Python Windows
Python:Pycharm安装指南
1. 双击安装程序,点击Next。 2. 选择安装路径,Next。 3. 默认选项,添加环境变量,Next。 4. 保持默认设置,点击Install。 5. 安装完成后选择是否立即重启。
236 2
Python:Pycharm安装指南
|
数据采集 弹性计算 供应链
阿里云服务器节省计划、按量付费、抢占式实例、包年包月四种付费类型区别及适用场景参考
阿里云服务器ECS提供灵活的计费方式,在通过云服务器ECS产品页面购买的时候,默认可选的付费类型为包年包月、按量付费和抢占式实例,而节省计划是在已经持有一定数量的按量付费实例,希望进行成本优化时通过“节省计划购买方案测算”选择的计费模式。本文来为大家介绍一下这些付费类型的主要区别及适用场景参考。
阿里云服务器节省计划、按量付费、抢占式实例、包年包月四种付费类型区别及适用场景参考
|
存储 机器学习/深度学习 物联网
云计算的物联网应用:智能化转型的关键
本文探讨了物联网(IoT)与云计算的结合及其在数据处理中的应用。物联网通过连接设备进行数据交换,而云计算提供资源处理和存储。核心概念包括物联网的无线通信、传感、微控制器及数据技术,以及云计算的虚拟化、分布式计算、存储和网络技术。两者协同工作,云计算助力物联网处理大量数据,实现高效分析。文章还介绍了数据预处理、分析(如统计学、机器学习、深度学习)和应用的算法,以及数据应用的实例,展示了如何在智能家居系统中运用这些方法。未来,面对大数据、安全与隐私、实时性及边缘计算的挑战,物联网与云计算将继续发展。
1988 2
|
前端开发 JavaScript
webpack原理篇(五十三):Tapable插件架构与Hooks设计
webpack原理篇(五十三):Tapable插件架构与Hooks设计
446 0
webpack原理篇(五十三):Tapable插件架构与Hooks设计