OpenCASCADE Interpolations and Approximations
OpenCASCADE Interpolations and Approximations
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的更多相关文章
- OpenCASCADE Gauss Integration
OpenCASCADE Gauss Integration eryar@163.com Abstract. Numerical integration is the approximate compu ...
- OpenCASCADE AIS Manipulator
OpenCASCADE AIS Manipulator eryar@163.com Abstract. OpenCASCADE7.1.0 introduces new built-in interac ...
- 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 ...
- OpenCASCADE Shape Location
OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...
- OpenCASCADE BRep Projection
OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...
- OpenCASCADE Expression Interpreter by Flex & Bison
OpenCASCADE Expression Interpreter by Flex & Bison eryar@163.com Abstract. OpenCASCADE provide d ...
- OpenCASCADE Data Exchange - 3D PDF
OpenCASCADE Data Exchange - 3D PDF eryar@163.com Abstract. Today most 3D engineering model data are ...
- OpenCASCADE Ring Type Spring Modeling
OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...
- OpenCASCADE Interpolation - Lagrange
OpenCASCADE Interpolation - Lagrange eryar@163.com Abstract. Power basis polynomial is the most simp ...
随机推荐
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- 开源:ASP.NET Aries 开发框架
前言: 随着岁月的推进,不知不觉已在.NET这领域上战斗了十年了. 青春还没来得急好好感受,却已是步入健忘之秋的老人一枚了. 趁着还有点记忆,得赶紧把硬盘里那私藏的80G除外的东西,和大伙分享分享. ...
- jsp前端实现分页代码
前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- CSS知识总结(八)
CSS常用样式 8.变形样式 改变元素的大小,透明,旋转角度,扭曲度等. transform : none | <transform-function> <transform-fun ...
- Python 基础之一变量和赋值
变量:程序在运行的时候会用到很多临时存储数据,这个时候就用到了变量,临时数据的名字. Python中变量不需要声明,直接可以使用,变量的数据类型由赋值确定. >>> name=&qu ...
- 文档对象模型DOM通俗讲解
转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...
- JAVA的内存模型(变量的同步)
一个线程中变量的修改可能不会立即对其他线程可见,事实上也许永远不可见. 在代码一中,如果一个线程调用了MyClass.loop(),将来的某个时间点,另一个线程调用了MyClass.setValue( ...
- SQL中字符串拼接
1. 概述 在SQL语句中经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例,因为这三种数据库具有代表性. sqlserver: select '123'+'456' ...
- 在centos7(EL7.3 即 kernel-3.10.0-514.X )上安装BCM4312无线网卡驱动要注意的问题
我新装的centos7主机无法使用里面自带的网卡,查询后发现网卡型号为BCM4312.我在看资料安装的过程中遇到了些问题,纠结了好久,现在分享下要注意的点,为后来的遇到同样问题的人提供点帮助.现在开始 ...