PCurve - Curve on Surface

eryar@163.com

Abstract. 本文通过给出曲面上曲线PCurve的定义来对OpenCascade中的Curve On Surface进行理解,并介绍了OpenCascade对应的类BRep_CurveOnSurface实现。通过Tcl脚本输出的球的拓朴信息,分析PCurve的实际应用。

Key words. OpenCascade, ACIS, PCurve, Curve on Surface, Parametric Surface

1. Introduction

不管是ACIS还是OpenCascade中都有PCurve这个概念,字面上来理解就是参数曲线(Parametric Curve)。在《基于ACIS的几何造型技术与系统开发》中也看到这个概念,如下图所示:

Figure 1.1 PCurve Entity of ACIS

“参数空间曲线是在参数曲面的双参数空间中的二维样条曲线。类pcurve是附加在参数曲面之间公共边上的数据结构。”看完之后,对pcurve的概念还是不太清楚。本文给出PCurve的定义,并介绍PCurve在OpenCascade中的实现。根据定义可以对PCurve有个基本认识。

2. Definition of PCurve

PCurve为曲面上的曲线(Curve on Surface),其定义为:设曲面方程为

令参数u,v又是另一参数t的函数,即

将其代入曲面方程,得到:

当t变化时,就得到曲面上的一条单参数曲线,称为曲面上的曲线或简称曲面上曲线(Curve on Surface)。若以s表示曲面上曲线的弧长,则由复合函数的求导公式可得弧长微分公式:

令:

则有:

在古典微分几何中,上式称为曲面的第一基本公式,E,F,G称为第一基本量。在曲面上,每一点的第一基本量与参数化无关,在整张曲面上,第一基本量是参数u和v的连续函数。读者注意,弧元ds是曲线的几何不变量,与曲面的参数化无关。关于曲线曲面更多的信息,请参考《微分几何》、《计算几何》之类的书籍。本文主要为了理解曲面上曲线PCurve的概念及其在OpenCascade中的实现。

目前对PCurve的应用还不太清楚,但是微分几何中引入这个概念肯定是有他的意义,就像在程序设计中引入Pimpl(pointer to implementation)这个idiom。尽管引入Pimpl idiom会增加内存的额外开销,甚至因为增加了间接层使程序代码变得不易读和不好调试,但是人们仍然乐于使用。站在API设计者的角度,它能隐藏信息、降低耦合、减少文件间的依赖,加快编译速度、且可使生成的库的兼容性更好等等,很多优点。所以在《Effective C++》和《API Design for C++》中,作者反复提到并使用Pimpl idiom。类比微分几何引入的PCurve,先在此做上标记,如果有了新的理解再做分析。

3. PCurve in OpenCascade

在OpenCascade中对应于曲面上曲线PCurve的类是BRep_CurveOnSurface,其文档中的说明为:Representation of a curve by a curve in the parametric space of a surface.

结合定义上面这句话就好理解了。现摘抄部分代码来分析PCurve的定义和使用:

//=======================================================================
//function : BRep_CurveOnSurface
//=======================================================================
BRep_CurveOnSurface::BRep_CurveOnSurface(const Handle(Geom2d_Curve)& PC,
const Handle(Geom_Surface)& S,
const TopLoc_Location& L) :
BRep_GCurve(L,PC->FirstParameter(),PC->LastParameter()),
myPCurve(PC),
mySurface(S)
{
} //=======================================================================
//function : D0
//=======================================================================
void BRep_CurveOnSurface::D0(const Standard_Real U, gp_Pnt& P) const
{
// shoud be D0 NYI
gp_Pnt2d P2d = myPCurve->Value(U);
P = mySurface->Value(P2d.X(),P2d.Y());
P.Transform(myLocation.Transformation());
}

从其构造函数来看,要生成一个PCurve必须有曲线PC和曲面S及位置L。

从求PCurve的零次微分的函数D0可以看出,只需要一个参数U就可以计算出曲面上的点P。结合前面介绍的PCurve的定义,不难理解这段代码的意义。下面通过分析球面的拓朴结构,看看PCurve的应用。

Figure 3.1 Sphere in Draw Test Harness

4. Code Demo

下面的程序生成一个球,再把其拓朴结构显示出来,可以看到其中就有PCurve的信息。使用Tcl脚本程序示例如下:

pload ALL
psphere s 1.0
dump s

以上Tcl脚本在OpenCascade的Draw Test Harness中运行结果如下所示:

Figure 4.1 PCurve in Sphere

由上图可知,球的Edge5由一个PCurve来表示。曲面上曲线PCurve在拓朴结构输出的信息位于Curve2ds中,曲面的几何数据位于surfaces中,分别如下图所示:

Figure 4.2 PCurves of Sphere

PCurve编号为4的是条直线,起点(0,-1.570796),方向为(1,0)即X方向。

Figure 4.3 Surfaces of Sphere

曲面编号为1的是一个球面,圆心(0,0,0),半径为1,坐标系与世界坐标系相同。

结合PCurve 4和曲面1及PCurve的参数范围,可以计算出曲面上的一条曲线上的坐标值。不过上面球面的例子中的Edge是degenerated边,退化成一个点了。

由上面球的拓朴信息可知,在理解了参数曲线曲面(有向性)、奇点(Singular Point),参数曲面的奇异性(Singularity)、曲面上曲线(PCurve)等概念后,OpenCascade的拓朴结构就可以基本理解了。

5. Conclusions

本文通过给出曲面上曲线PCurve的定义来对OpenCascade中的Curve On Surface进行理解,并介绍了OpenCascade对应的类BRep_CurveOnSurface实现。

通过Tcl脚本输出的球的拓朴信息,看看PCurve的实际应用,从中可以看出使用Tcl的简单与便捷。

6. References

1. 朱心雄,自由曲线曲面造型技术,科学出版社,2000

2. 王仁宏 李崇君 朱春钢,计算几何教程,科学出版社,2008

3. 陈维桓,微分几何,北京大学出版社,2006

4. 詹海生 李广鑫 马志欣,基于ACIS的几何造型技术与系统开发,清华大学出版社,2002

PCurve - Curve on Surface的更多相关文章

  1. 图形的认识(curve,surface,hypersurface)

    平滑函数(smooth function): curve:曲线: 二维平面: surface:曲面: 三维空间: hypersurface:超曲面: 更高维度: 1. surface 是对平面的泛化, ...

  2. OpenCASCADE PCurve of Topological Face

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

  3. OpenCASCADE Make Primitives-Sphere

    OpenCASCADE Make Primitives-Sphere eryar@163.com Abstract. The sphere is the simplest topology shape ...

  4. OpenCascade Primitives BRep - Sphere

    OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...

  5. OpenCascade Primitives BRep - Box

    OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is short for Boundary Representation. ...

  6. Make Helix Curve in OpenCASCADE

    Make Helix Curve in OpenCASCADE eryar@163.com Abstract. OpenCASCADE does not provide helix curve dir ...

  7. OPEN CASCADE BSpline Curve Interpolation

    OPEN CASCADE BSpline Curve Interpolation eryar@163.com Abstract. Global curve interpolation to point ...

  8. OpenCascade Primitives BRep-Cylinder

    OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep is short for Boundary Representati ...

  9. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

随机推荐

  1. oracle 抛出自定义错误(网上找的例子)

    CREATE OR REPALCE TRIGGER minimun_age_checkBEFORE INSERT ON employeeFOR EACH ROWBEGIN IF ADD_MONTHS( ...

  2. [Leetcode]String to Integer (atoi) 简易实现方法

    刚看到题就想用数组做,发现大多数解也是用数组做的,突然看到一个清新脱俗的解法: int atoi(const char *str) { ; int n; string s(str); istrings ...

  3. JAVA 求和程序

  4. (转)JQuery上传插件Uploadify使用详解

    原文地址:http://www.cnblogs.com/oec2003/archive/2010/01/06/1640027.html Uploadify是JQuery的一个上传插件,实现的效果非常不 ...

  5. 归并求逆序数(逆序对数) && 线段树求逆序数

    Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u   Java c ...

  6. XtraBackup备份笔记

    安装 rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm yum in ...

  7. android wireshark抓包和fiddler抓包

    一 wireshark 1.把电脑的网络做为热点 2.开启wifi热点后,被测手机连接到该热点: 3.启动wireshark,选择做为热点的网卡,点击start开始抓包: 4.操作手机,可以抓取到手机 ...

  8. Task Runner Explorer for vs2015找不到啊

    https://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708/view/ 编译typescri ...

  9. 讲讲HashCode的作用

    前言 Object提供给我们了一个Native的方法“public native int hashCode();”,本文讲讲Hash是什么以及HashCode的作用 Hash 先用一张图看下什么是Ha ...

  10. 解决Win7 软件图标不显示--Win7图标异常,快捷方式不显示解决方法

    电脑症状:WIN7的系统,桌面上的图标显示的不正常,快捷方式显示的是未知程序.看不到程序默认图标,快捷方式图标不显示. 解决方法:删除程序图标缓存即可.   将下面的内容复制到记事本保存为“Repai ...