zoukankan      html  css  js  c++  java
  • OpenCASCADE点向平面投影

    OpenCASCADE点向平面投影

    OpenCASCADEProjLib类提供了解析曲线(直线、圆、椭圆、抛物线、双曲线)向解析曲面(平面、圆柱面、圆锥面、球面、圆环面)投影的功能,主要用来计算三维曲线在二维参数空间的参数。

     

    其中点向平面投影是最简单的情况,本文主要介绍点向平面投影的注意事项。ProjLib类是个工具类,因为其函数都是静态函数。点向平面投影很简单,直接用ProjLib::Project(aPlane, aPoint)即可。

     

    其实现代码如下:

    gp_Pnt2d  ProjLib::Project(const gp_Pln& Pl, const gp_Pnt& P)
    {
      Standard_Real U, V;
      ElSLib::Parameters(Pl, P, U, V);
      return gp_Pnt2d(U,V);
    }
    
    inline void ElSLib::Parameters(const gp_Pln& Pl,
    			       const gp_Pnt& P,
    			       Standard_Real& U,
    			       Standard_Real& V) {
    
      ElSLib::PlaneParameters(Pl.Position(),P,U,V);
    }
    
    void ElSLib::PlaneParameters (const gp_Ax3& Pos,
    			      const gp_Pnt& P,
    			      Standard_Real& U,
    			      Standard_Real& V)
    {
      gp_Trsf T;
      T.SetTransformation (Pos);
      gp_Pnt Ploc = P.Transformed (T);
      U = Ploc.X();
      V = Ploc.Y();
    }
    

    从上面的代码可以看出,点向平面投影实现就是将点变换到平面所在的坐标系中。使用这个类向平面投影要注意的事项是平面的构造。平面gp_Pln有如下构造函数:

     

    默认构造函数:构造了一个XOY平面

    基于一个坐标系gp_Ax3构造平面

    基于一个点和一个方向构造平面

    基于平面的系数方程,即AX+BY+CZ+D=0

    前两个构造函数很清晰,而第三个构造函数即基于一个点和一个方向构造平面的方式没有明确,注释不清晰。这里的方向指定了平面的法向,但是还缺少一个方向来确定一个坐标系,所以使用这个构造函数来生成平面的时候,需要理解其生成另外一个方向的算法是不是自己需要的。

    gp_Pln::gp_Pln (const gp_Pnt& P,
    		const gp_Dir& V)
    {
      Standard_Real A = V.X();
      Standard_Real B = V.Y();
      Standard_Real C = V.Z();
      Standard_Real Aabs = A;
      if (Aabs < 0) Aabs = - Aabs;
      Standard_Real Babs = B;
      if (Babs < 0) Babs = - Babs;
      Standard_Real Cabs = C;
      if (Cabs < 0) Cabs = - Cabs;
    
      //  pour determiner l'axe X :
      //  on dit que le produit scalaire Vx.V = 0. 
      //  et on recherche le max(A,B,C) pour faire la division.
      //  l'une des coordonnees du vecteur est nulle. 
    
      if( Babs <= Aabs && Babs <= Cabs) {
        if (Aabs > Cabs)  pos = gp_Ax3 (P, V, gp_Dir (-C,0., A));
        else              pos = gp_Ax3 (P, V, gp_Dir ( C,0.,-A));
      }
      else if( Aabs <= Babs && Aabs <= Cabs) {
        if (Babs > Cabs)  pos = gp_Ax3 (P, V, gp_Dir (0.,-C, B));
        else              pos = gp_Ax3 (P, V, gp_Dir (0., C,-B));
      }
      else {
        if (Aabs > Babs)  pos = gp_Ax3 (P, V, gp_Dir (-B, A,0.));
        else              pos = gp_Ax3 (P, V, gp_Dir ( B,-A,0.));
      }
    }
    

    当这里确定平面坐标系的方式与需要的不一致时,在使用投影算法的时候就会产生问题。

  • 相关阅读:
    TextBox 只有下划线
    can't find web control library(web控件库)
    DropDownListSalesAC”有一个无效 SelectedValue,因为它不在项目列表中。
    IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型
    如何打印1px表格
    CSS控制打印 分页
    Virtual Server could not open its emulated Ethernet switch driver. To fix this problem, reenable the Virtual Server Emulated Et
    Xml中SelectSingleNode方法中的xpath用法
    热带水果莫入冰箱?水果存放冰箱大法
    探索Asp.net的Postback机制
  • 原文地址:https://www.cnblogs.com/opencascade/p/ProjLib.html
Copyright © 2011-2022 走看看