PCurve - Curve on Surface
PCurve - Curve on Surface
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
PDF Version: PCurve - Curve on Surface
PCurve - Curve on Surface的更多相关文章
- 图形的认识(curve,surface,hypersurface)
平滑函数(smooth function): curve:曲线: 二维平面: surface:曲面: 三维空间: hypersurface:超曲面: 更高维度: 1. surface 是对平面的泛化, ...
- OpenCASCADE PCurve of Topological Face
OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...
- OpenCASCADE Make Primitives-Sphere
OpenCASCADE Make Primitives-Sphere eryar@163.com Abstract. The sphere is the simplest topology shape ...
- OpenCascade Primitives BRep - Sphere
OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...
- OpenCascade Primitives BRep - Box
OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is short for Boundary Representation. ...
- Make Helix Curve in OpenCASCADE
Make Helix Curve in OpenCASCADE eryar@163.com Abstract. OpenCASCADE does not provide helix curve dir ...
- OPEN CASCADE BSpline Curve Interpolation
OPEN CASCADE BSpline Curve Interpolation eryar@163.com Abstract. Global curve interpolation to point ...
- OpenCascade Primitives BRep-Cylinder
OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep is short for Boundary Representati ...
- Topology Shapes of OpenCascade BRep
Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...
随机推荐
- Session管理解决方案笔记
大型网站Session管理解决方案: 1. web服务器之间的session复制. 优点:方案成熟 缺点:复制的性能开销大 2. 减少session使用,使用客户端存储cookie ...
- ASP.NET Web服务调用发生错误,错误代码404
现象: iOS端使用ASIHTTP连接Web服务时,得到的数据是一个错误代码为404的页面,错误信息(web.config添加<customErrors mode="Off" ...
- 积木大赛 noip2013提高组day2
这道题一开始想到处理中间是0的位置,但这样时间太慢了,后来想到一种类似二分的方法,就是把这一段的最小值找到,全部减去最小值,然后有0一出现,就又递归处理前一段,每次答案就加上这一段的最小值: AC代码 ...
- VS2010 密钥问题
密钥:YCFHQ9DWCYDKV88T2TMHG7BHP ①在VS2010安装包中找到setup==>setup.sdb 的Product Key把密钥改为上面的就可以了 ②不想重装那就在控制面 ...
- [Leetcode][JAVA] Convert Sorted Array to Binary Search Tree && Convert Sorted List to Binary Search Tree
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- SQL分页常用的两个存储过程
在做数据绑定时,我们常常会遇到分页事件,下面记录一下分页常用到SQL的两个存储过程 ①/****分页数据总数****//****** 对象: StoredProcedure [dbo].[GetRe ...
- vim插件神器spf13在Linux上的安装
官网给出的安装办法很简单: curl http://j.mp/spf13-vim3 -L -o - | sh 可惜有问题: connection reset by peer 正确的姿势是: curl ...
- MYSQL中 ENUM 类型
MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...
- [java基础]文档注释
转载自:http://blog.163.com/hui_san/blog/static/5710286720104191100389/ 前言 Java 的语法与 C++ 及为相似,那么,你知道 Jav ...
- MJExtension笔记(一)
之前有说,看好的编程就去敲好的开源项目:一直觉得这个无从下手,但是这次跟着一点点敲MJExtension,我明白了这句话的深度:其实并不需要去找,每一个三方项目都有很多值得学习的地方:笔记一只记录在敲 ...