OpenCASCADE Trihedron Law

eryar@163.com

Abstract. In differential geometry the Frenet-Serret formulas describe the kinematic properties of a particle moving along a continuous, differentiable curve in 3d space, or the geometric properties of the curve itself irrespective of any motion. More specifically, the formulas describe the derivatives of the so-called Tangent, Normal and Binormal unit vectors in terms of each other.

Key Words. Frenet-Serret Frame, TNB frame, Trihedron Law

1. Introduction

参数曲线上的局部坐标系,也称为标架Frame,OpenCASCADE中叫Trihedron。这个局部坐标系随着曲线上点的运动而运动,所以也称为活动坐标系。活动坐标系中各坐标轴的选取:

l T是参数曲线的切线方向;

l N是曲线的主法线方向,或称主法矢;主法矢总是指向曲线凹入的方向;

l B是副法矢;当T 和N确定后,通过叉乘即得到B。

Figure 1. T, N, B frame of a curve (from wiki)

定义一个活动标架有什么作用呢?把这个问题先保留一下。本文先介绍OpenCASCADE中的标架规则Trihedron Law。

2.Trihedron Law

在OpenCASCADE中,类GeomFill_TrihedronLaw定义了曲线活动标架。其类图如下所示:

Figure 2. Trihedron Law define Trihedron along a Curve

从基类GeomFill_TrihedronLaw派生出了各种标架,如:

l GeomFill_Fixed:固定的活动动标架,即标架沿着曲线移动时,标架的三个方向是固定的;

l GeomFill_Frenet: Frenet标架;

l GeomFill_Darboux :Darboux标架;

l GeomFill_ConstantBiNormal:副法矢固定的标架;

3. Code Demo

下面通过示例代码来显示出曲线上的Frenet标架,GeomFill_TrihedronLaw子类的用法类似。

/*
Copyright(C) 2018 Shing Liu(eryar@163.com) Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions : The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/ #include <TColgp_Array1OfPnt.hxx> #include <math_BullardGenerator.hxx> #include <GCPnts_UniformAbscissa.hxx>
#include <GCPnts_UniformDeflection.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <GCPnts_QuasiUniformDeflection.hxx> #include <Geom_BSplineCurve.hxx> #include <GeomAdaptor_HCurve.hxx> #include <GeomAPI_PointsToBSpline.hxx> #include <GeomFill_Fixed.hxx>
#include <GeomFill_Frenet.hxx>
#include <GeomFill_ConstantBiNormal.hxx>
#include <GeomFill_CorrectedFrenet.hxx>
#include <GeomFill_Darboux.hxx>
#include <GeomFill_DiscreteTrihedron.hxx>
#include <GeomFill_GuideTrihedronAC.hxx>
#include <GeomFill_GuideTrihedronPlan.hxx> #include <BRepBuilderAPI_MakeEdge.hxx> #include <BRepTools.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib") #pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib") void test()
{
TColgp_Array1OfPnt aPoints(, );
math_BullardGenerator aBullardGenerator;
for (Standard_Integer i = aPoints.Lower(); i <= aPoints.Upper(); ++i)
{
Standard_Real aX = aBullardGenerator.NextReal() * 50.0;
Standard_Real aY = aBullardGenerator.NextReal() * 50.0;
Standard_Real aZ = aBullardGenerator.NextReal() * 50.0; aPoints.SetValue(i, gp_Pnt(aX, aY, aZ));
} GeomAPI_PointsToBSpline aBSplineFitter(aPoints);
if (!aBSplineFitter.IsDone())
{
return;
} std::ofstream aTclFile("d:/tcl/trihedron.tcl"); aTclFile << std::fixed;
aTclFile << "vclear" << std::endl; Handle(Geom_BSplineCurve) aBSplineCurve = aBSplineFitter.Curve();
Handle(GeomAdaptor_HCurve) aCurveAdaptor = new GeomAdaptor_HCurve(aBSplineCurve); BRepBuilderAPI_MakeEdge anEdgeMaker(aBSplineCurve);
BRepTools::Write(anEdgeMaker, "d:/edge.brep"); aTclFile << "restore " << " d:/edge.brep e" << std::endl;
aTclFile << "incmesh e " << " 0.01" << std::endl;
aTclFile << "vdisplay e " << std::endl; Handle(GeomFill_Frenet) aFrenet = new GeomFill_Frenet();
aFrenet->SetCurve(aCurveAdaptor); GCPnts_UniformAbscissa aPointSampler(aCurveAdaptor->Curve(), 5.0);
for (Standard_Integer i = ; i <= aPointSampler.NbPoints(); ++i)
{
Standard_Real aParam = aPointSampler.Parameter(i);
gp_Pnt aP = aCurveAdaptor->Value(aParam); gp_Vec aT;
gp_Vec aN;
gp_Vec aB; aFrenet->D0(aParam, aT, aN, aB); // vtrihedron in opencascade draw 6.9.1
/*aTclFile << "vtrihedron vt" << i << " " << aP.X() << " " << aP.Y() << " " << aP.Z() << " "
<< " " << aB.X() << " " << aB.Y() << " " << aB.Z() << " "
<< " " << aT.X() << " " << aT.Y() << " " << aT.Z() << std::endl;*/ // vtrihedron in opencascade draw 7.1.0 has bug.
/*aTclFile << "vtrihedron vt" << i << " -origin " << aP.X() << " " << aP.Y() << " " << aP.Z() << " "
<< " -zaxis " << aB.X() << " " << aB.Y() << " " << aB.Z() << " "
<< " -xaxis " << aT.X() << " " << aT.Y() << " " << aT.Z() << std::endl;*/ // vtrihedron in opencascade draw 7.2.0
aTclFile << "vtrihedron vt" << i << " -origin " << aP.X() << " " << aP.Y() << " " << aP.Z() << " "
<< " -zaxis " << aB.X() << " " << aB.Y() << " " << aB.Z() << " "
<< " -xaxis " << aT.X() << " " << aT.Y() << " " << aT.Z() << std::endl;
aTclFile << "vtrihedron vt" << i << " -labels xaxis T 1" << std::endl;
aTclFile << "vtrihedron vt" << i << " -labels yaxis N 1" << std::endl;
aTclFile << "vtrihedron vt" << i << " -labels zaxis B 1" << std::endl; aTclFile << "vsize vt" << i << "" << std::endl;
}
} int main(int argc, char* argv[])
{
test(); return ;
}

程序通过拟合几个随机产生的点生成B样条曲线,再将曲线按弧长等距采样,将得到的参数计算出曲线上的点,及Frenet标架。再生成Draw脚本文件,最后将生成的Draw脚本文件trihedron.tcl加载到Draw Test Harness中显示结果如下图所示:

Figure 3. Frenet Frame

由上图可知,局部坐标系的T方向为曲线的切线方向。主法向N总是指向曲线凹侧。

4. Conclusion

曲线的活动标架是《微分几何》中一个很基础的概念。有了曲线的活动标架,扫掠造型Sweep算法的实现有了一些思路。当给定一个轮廓线后,将轮廓线沿着路径曲线扫掠可以理解为将轮廓线变换到曲线的活动标架中。

本文主要演示了Frenet活动标架的例子,读者可以将GeomFill_TrihedronLaw其他的子类表示的其他类型活动标架自己实现,加深理解。

5. References

1. 赵罡, 穆国旺, 王拉柱. 非均匀有理B样条. 清华大学出版社. 2010

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

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

OpenCASCADE Trihedron Law的更多相关文章

  1. OpenCascade Law Function

    OpenCascade Law Function eryar@163.com 1.Introduction 在OpenCASCADE的TKGeomAlgo Toolkit中提供了一个Law Packa ...

  2. OpenCascade Sweep Algorithm

    OpenCascade Sweep Algorithm eryar@163.com Abstract. Sweeps are the objects you obtain by sweeping a ...

  3. OpenCASCADE AIS Manipulator

    OpenCASCADE AIS Manipulator eryar@163.com Abstract. OpenCASCADE7.1.0 introduces new built-in interac ...

  4. Convert BSpline Curve to Arc Spline in OpenCASCADE

    Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...

  5. OpenCASCADE Shape Location

    OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...

  6. OpenCASCADE BRep Projection

    OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...

  7. OpenCASCADE Expression Interpreter by Flex & Bison

    OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...

  8. OpenCASCADE Data Exchange - 3D PDF

    OpenCASCADE Data Exchange - 3D PDF eryar@163.com Abstract. Today most 3D engineering model data are ...

  9. OpenCASCADE Interpolations and Approximations

    OpenCASCADE Interpolations and Approximations eryar@163.com Abstract. In modeling, it is often requi ...

随机推荐

  1. 【noip模拟】Fantasia

    Time Litmit: 1000ms      Memory Limit: 256MB Description 给定一张 $N$ 个点.$M$ 条边的无向图 $G$ .每个点有个权值$W_i$. 我 ...

  2. IDEA 使用tomcat7-maven-plugin

    使用了这个插件就不需要配置tomcat了,直接用maven去run就行 配置方法:pom里添加:(之所以用tomcat7是因为如果直接用依赖下载很难下载到tomcat8-maven-plugin,详情 ...

  3. Red Hat Enterprise Linux7 配置Tomcat

    笔者是Java前端的一个萌新,电脑刚刚经历了一番脱胎换骨,然后重新装了Win10Pro,所有的开发工具都要重新安装,纠结了一番以后决定还是把一些开发工具从Windows上转移到Linux上,首先考虑了 ...

  4. Infinite Fraction Path HDU 6223 2017沈阳区域赛G题题解

    题意:给你一个字符串s,找到满足条件(s[i]的下一个字符是s[(i*i+1)%n])的最大字典序的长度为n的串. 思路:类似后缀数组,每次倍增来对以i开头的字符串排序,复杂度O(nlogn).代码很 ...

  5. vc的环境变量配置和缺少mspdb60.dll的解决方法

    vc的编译器是cl.exe,我们如果在vc中编译就不用配置环境,但是如果要在任何位置用命令提示符打开编译器cl.exe来编译程序,那么就要配置环境了. 下面我就讲讲vc的环境变量配置和缺少mspdb6 ...

  6. 常见的if语句shell脚本

    常见的if语句shell脚本 author :headsen  chen  2017-10-17  15:00:07 1,cat if.sh 2, cat  if2.sh

  7. Ameba读写分离_mycat分库分表_redis缓存

    1 数据库的读写分离 1.1 Amoeba实现读写分离 1.1.1 定义 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy 优点: 配置读写分离时较为简单.配置 ...

  8. python初识(一)

    python语言的发展 python语言诞生于1990年,由Guido van Rossum设计并领导开发. 1989年12月,Guido为打发圣诞节时间而开发的项目. python名字的由来,由于当 ...

  9. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  10. 以@Value方式注入 properties 配置文件

    类中读取XML文件不是太方便,所以使用*.properties是比较好的办法 注入方式获取是最直接,最快捷的.这个操作主要涉三个部分,下面分别介绍: 首先,配置文件准备.这里文件名命名为applica ...