OpenCASCADE点向平面投影

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

其中点向平面投影是最简单的情况,本文主要介绍点向平面投影的注意事项。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有如下构造函数:

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

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

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

l 基于平面的系数方程,即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.));
}
}

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

OpenCASCADE点向平面投影的更多相关文章

  1. OpenCASCADE圆与平面求交

    OpenCASCADE圆与平面求交 eryar@163.com 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的 ...

  2. OpenCASCADE直线与平面求交

    OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...

  3. OpenCASCADE点向直线投影

    OpenCASCADE点向直线投影 eryar@163.com 在GeomLib_Tool类中提供了计算指定点在曲线.曲面上的参数,这个算法具有通用性,即对任意曲线.曲面来反求点的参数. 本文主要结合 ...

  4. OpenCASCADE PCurve of Topological Face

    OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...

  5. OpenGL ES 2.0 摄像机与投影

    1.摄像机的设置 摄像机的位置坐标 摄像机的位置 摄像机up方向 Matrix.setLookAtM( mVMatrix, //存储生成矩阵元素的float[]类型数组 0, //填充起始偏移量 cx ...

  6. vtkPlane和vtkPlaneSource

    1.vtkPlane vtkPlane provides methods for various plane computations. These include projecting points ...

  7. FPS中受伤UI在VR游戏中的实现思路

    FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...

  8. 什么是UV?

    转自http://www.cnblogs.com/jenry/p/4083415.html 1.什么是UV?   对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV ...

  9. 坐标系统与投影变换及在ArcGIS桌面产品中的应用

    坐标系统与投影变换及在ArcGIS桌面产品中的应用 1.地球椭球体(Ellipsoid) 2.大地基准面(Geodetic datum) 3.投影坐标系统(Projected Coordinate S ...

随机推荐

  1. mybatis 按照条件查询

    mybatis 按照条件查询 @Autowired private StudentMapper studentMapper; @Override public Map getStudentList(i ...

  2. 2015 Multi-University Training Contest 4 hdu 5334 Virtual Participation

    Virtual Participation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  3. codevs——T2488 绿豆蛙的归宿

    http://codevs.cn/problem/2488/  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descri ...

  4. HDU 4300 Contest 1

    扩展KMP很容易就明白过来了. 注意的是,后面明文的长度要少于密文,而且当前K+Extend[k]>=L 输出时犯了很多次二,后来人注意吧. #include <cstdio> #i ...

  5. Android动态加载字节码

    概述 面对App业务逻辑的频繁变更,如果每一次改变都对App进行一次升级,会降低App的用户体验,那么App进行模块化升级(这里与增量升级是不同的)是很好的解决方案,让用户在完全无感觉的情况下改变Ap ...

  6. JSP简单练习-上传文件

    注意:在编写上传文件的代码时,需确保"WEB-INF/lib"下含有jspsmartupload.jar包.否则会出错. jspSmartupload.jar下载 <!-- ...

  7. m_Orchestrate learning system---七、如何快速学好前端

    m_Orchestrate learning system---七.如何快速学好前端 一.总结 一句话总结:看视频啊,系统看视频啊 1.如何解决单词数字太长超出边界的问题? word-wrap 把编辑 ...

  8. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  9. 14.MongoDBUtils工具类

    1. public class DbUtils { public static MongoCollection<Document> getMongoCollection(String lo ...

  10. MVC开发模式详解

    转自:https://blog.csdn.net/qq_33991989/article/details/78966071 MVC设计模式详解 1.Model-View-Controller(模型-视 ...