OpenCASCADE Interpolations and Approximations

eryar@163.com

Abstract. In modeling, it is often required to approximate or interpolate points to curves and surfaces. In interpolation, the process is complete when the curve or surface passes through all the points; in approximation, when it is as close to these points as possible. The paper is the translation of the OpenCASCADE Modeling Data user guide.

Key Words. Interpolation, Approximation, Fitting

1.Introduction

在几何造型中,经常会需要根据点去拟合(插值Interpolation或逼近Approximation)曲线曲面。插值要求拟合所得的曲线或曲面必须通过所有拟合点;而逼近要求拟合所得曲线或曲面尽可能地靠近全部拟合点。OpenCASCADE中提供了曲线曲面拟合的功能有:

v 对二维点进行二维B样条或Bezier曲线插值;

v 对二维点进行二维B样条或Bezier曲线逼近;

v 对三维点进行三维B样条或Bezier曲线或B样条曲面插值;

v 对三维点进行三维B样条或Bezier曲线或B样条曲面逼近;

程序中使用拟合功能有两种方式:

v 使用高级功能:提供简单的方法调用来获得拟合结果;

v 使用低级功能:专为想对拟合有更多控制的用户设计;

插值和逼近也是数值分析或计算方法中的主要内容。用B样条作为插值或逼近函数是数值分析中的一个具体方法。通过对OpenCASCADE中插值和逼近算法的学习,加深对一些算法,如最小二乘法,多元函数求极值等数学知识的理解。

本文主要是对OpenCASCADE的文档Modeling Data 中的插值和逼近部分进行翻译,并给出了使用其低级功能具体的代码示例。

2.Analysis of a set of points

包GProp中的类PEquation提供了对点集、点云数据进行分析的功能,可以用来验证在给定的精度范围内是否重合、共线或共面等,如果检测结果是,那么算法将计算出这些点的重合点、线或面。如果检测结果不是,则算法会计算出点集或点云的包围盒。

3.Basic Interpolation and Approximation

包Geom2dAPI和GeomAPI提供了拟合(逼近和插值)简单的方法。

v 2D Interpolation: 类Geom2dAPI_Interpolate可以用于生成一条通过一系列点的二维B样条曲线。如果需要,还可以设置点相应的切矢及参数来对插值曲线做进一步的约束。

v 3D Interpolation: 类GeomAPI_Interpolate可以用于生成一条通过一系列点的三维B样条曲线。如果需要,还可以设置点相应的切矢及参数来对插值曲线做进一步的约束。因为是高级功能,所以需要很少的代码就可以得到插值曲线,用法如下:

GeomAPI_Interpolate Interp(Points);

Handle_Geom_BSplineCurve C = Interp.Curve();

v 2D Approximation: 类Geom2dAPI_PointsToBSpline可以用于生成逼近一系列点的二维B样条曲线。你需要定义曲线次数范围,连续性和容差。容差值只是用来检查逼近点之间是不是有重合点,或者切矢是否太小。逼近曲线将会是C2连续或2次曲线,当有切矢约束时,将会得到C1连续的曲线。

v 3D Approximation:类GeomAPI_PointsToBSpline可以用于生成逼近一系列点的三维B样条曲线。你需要定义曲线次数范围,连续性和容差。容差值只是用来检查逼近点之间是不是有重合点,或者切矢是否太小。逼近曲线将会是C2连续或2次曲线,当有切矢约束时,将会得到C1连续的曲线。类的用法如下:

GeomAPI_PointsToBSpline Approx(Points, DegMin, DegMax, Continutity, Tol);

Handle_Geom_BSplineCurve K = Approx.Curve();

v Surface Approximation:类GeomAPI_PointsToBSplineSurface可以用于根据点集拟合B样条曲面。

4.Advanced Approximation

包AppDef和AppParCurves提供了低级的功能,允许对拟合有更多地控制。低级功能提供了如下函数接口API:

v 定义拟合切矢的规则,这些切矢有原点和极值;

v 根据各自参数平行地拟合一系列曲线;

v 光滑拟合:生成光顺(faired curve)的曲线。

注:包AppDef和AppParCurves中通过宏定义实现了一种类似多态的功能,但是程序调试不方便,导致一些类名没有看到声明文件,对程序的理解造成一些不便。

4.1 Approximation by multiple point constraints

包AppDef中提供了低级工具用于对带约束的点集进行Bezier或B样条曲线拟合。其中的功能有:

v 定义一组约束点,使用类AppDef_MultiPointConstraint;

v 定义一组约束线,使用类AppDef_MultiLine;

v 拟合Bezier曲线,使用类AppDef_Compute;

v 拟合B样条曲线,使用类AppDef_BSplineCompute;

v 定义变分标准Variational Criteria;

注:在类AppDef_Variational中可以看到Variational Optimization变分优化。对于工科出来的人来说,这些概念还真是有些陌生,还是学数学的人厉害!

其中类AppDef_MultiLine的用法也有点特别,通过文档中的图来理解下:

其中:Pi, Qi, Ri, ..., Si可以是二维点或三维点;

按组来定义,其中Pn, Qn, Rn, ..., Sn都是在类AppDef_MultiPointConstraint中定义;

P1, P2, .., Pn或Q, R,..., S的点系列用来拟合。

类AppDef_Compute用Bezier曲线来拟合点;

类AppDef_BSplineCompute用B样条曲线来拟合点;

注:需要仔细理解AppDef_MultiPointConstraint和AppDef_MultiLine的用法。

4.2  Example: How to approximate a curve with low-level tools

使用低级功能的过程可分为如下几步:

v 定义拟合点;

v 根据拟合点创建MultiLine;

v 使用AppDef_Compute或AppDef_BSplineCompute来拟合曲线;

下面给出使用低级功能的代码示例:

/*
* Copyright (c) 2016 Shing Liu All Rights Reserved.
*
* File : main.cpp
* Author : Shing Liu(eryar@163.com)
* Date : 2016-03-17 21:00
* Version : OpenCASCADE6.9.0
*
* Description : test the low-level tools of approximation.
*/ #define WNT #include <TColgp_Array1OfPnt.hxx> #include <AppDef_MultiPointConstraint.hxx>
#include <AppDef_MultiLine.hxx>
#include <AppDef_Compute.hxx>
#include <AppDef_BSplineCompute.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKGeomBase.lib") void testBezierApprox()
{
TColgp_Array1OfPnt aPoints(, );
aPoints.SetValue(, gp_Pnt(0.0, 0.0, 0.0));
aPoints.SetValue(, gp_Pnt(1.0, 0.0, 0.0));
aPoints.SetValue(, gp_Pnt(1.0, 1.0, 0.0)); AppDef_MultiLine aMultiLine(aPoints); AppDef_Compute aBezierApprox(aMultiLine);
aBezierApprox.Value().Dump(std::cout); } void testBSplineApprox()
{
AppDef_MultiLine aMultiLine(); AppDef_MultiPointConstraint aMPC1(, );
AppDef_MultiPointConstraint aMPC2(, );
AppDef_MultiPointConstraint aMPC3(, ); aMPC1.SetPoint(, gp_Pnt(0.0, 0.0, 0.0));
aMPC1.SetPoint(, gp_Pnt(0.0, 2.0, 0.0)); aMPC2.SetPoint(, gp_Pnt(1.0, 0.0, 0.0));
aMPC2.SetPoint(, gp_Pnt(1.0, 2.0, 0.0)); aMPC3.SetPoint(, gp_Pnt(1.0, 1.0, 0.0));
aMPC3.SetPoint(, gp_Pnt(1.0, 3.0, 1.0)); aMultiLine.SetValue(, aMPC1);
aMultiLine.SetValue(, aMPC2);
aMultiLine.SetValue(, aMPC3); AppDef_BSplineCompute aBSplineApprox(aMultiLine);
aBSplineApprox.Value().Dump(std::cout);
} int main(int argc, char* argv[])
{
testBezierApprox(); testBSplineApprox(); return ;
}

程序运行结果如下图所示:

5.Conclusion

关于点的插值和逼近是《数据逼近》或《数值分析》或《计算方法》书中关注的内容。从文档中可以看到包AppDef中的一些关键字:Gradient, BFGS, LeastSquare等,根据这些关键字可以看出OpenCASCADE中逼近使用的算法了。

通过使用AppDef_MultiPointConstraint及AppDef_MultiLine等低级接口,来理解拟合数据点输入及拟合结果的输出。进而去学习BFGS、LeastSquare等数学理论工具在实际中的应用。对于多元函数,梯度及BFGS等概念还好接受,对于变分法优化之类理论已经超出了工科数学的范围,不过结合实际去学习这些概念应该会更有效率。

OpenCASCADE Interpolations and Approximations的更多相关文章

  1. OpenCASCADE Gauss Integration

    OpenCASCADE Gauss Integration eryar@163.com Abstract. Numerical integration is the approximate compu ...

  2. OpenCASCADE AIS Manipulator

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

  3. 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 ...

  4. OpenCASCADE Shape Location

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

  5. OpenCASCADE BRep Projection

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

  6. OpenCASCADE Expression Interpreter by Flex & Bison

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

  7. OpenCASCADE Data Exchange - 3D PDF

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

  8. OpenCASCADE Ring Type Spring Modeling

    OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...

  9. OpenCASCADE Interpolation - Lagrange

    OpenCASCADE Interpolation - Lagrange eryar@163.com Abstract. Power basis polynomial is the most simp ...

随机推荐

  1. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. H5坦克大战之【建造敌人的坦克】

      公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...

  3. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  4. ASP.NET Aries 入门开发教程9:业务表单的开发

    前言: 经过前面那么多篇的列表的介绍,终于到了大伙期待的表单开发了. 也是本系列的最后一篇文章了! 1:表单页面的权限设置与继承 对于表单页面,权限的设置有两种: 1:你可以选择添加菜单(设置为不显示 ...

  5. Android业务组件化之现状分析与探讨

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  6. jQuery学习之路(7)- 用原生JavaScript实现jQuery的某些简单功能

    ▓▓▓▓▓▓ 大致介绍 学习了妙味,用原生的JavaScript实现jQuery中的某些部分功能 定义自己的函数库lQuery ▓▓▓▓▓▓ $()选择器的实现 jQuery是面向对象的,所以自己编写 ...

  7. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  8. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  9. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  10. centos 6 安装配置openvpn

    下载地址:http://swupdate.openvpn.org/community/releases/http://www.oberhumer.com/opensource/lzo/download ...