OpenCASCADE开发指南<七>:OCC 中的数学基本类型和数学算法

1 标准对象的集合容器

  在处理现实问题时,经常将问题抽象成一个数学模型,接着对模型求解, 然后将解提取出来以解决现实问题。 其实在 CAD 软件中, 主要解决的就是数学模型。因此,本节将描述 OCC 的数学基本类型和数学算法。它们包括向量和矩阵类、基本几何类型和常用数学算法。

在这里插入图片描述

1.1 向量和矩阵类

  向量和矩阵组件为向量和矩阵提供了 C++实现。 这个组件通常用来定义更复杂的数据结构。向量和矩阵类支持由实数组成的向量和矩阵的标准操作,如加、乘、转置、求逆等。向量和矩阵的范围是任意的, 但必须在声明的时候就定义好, 并且定义后不能更改,如例 3.18 所示。

例 3.18:

math_Vector v(1, 3);
//一个三维向量,索引区间为(1,3)。
math_Matrix m(0, 2, 0, 2);
//一个 3x3 的矩阵,行区间和列区间都为(0,2)。
math_Vector v(N1, N2);
//一个(N2-N1+1)维的向量,索引区间为(N1,N2)。

向量和矩阵对象遵循语意值,即它们不能被共享,也不能通过赋值来拷贝,如例 3.19 所示。

例 3.19:

math_Vector v1(1, 3), v2(0, 2);
v2 = v1;
// 将 v1 的值拷贝给 v2;对 v1 的改变不会影响 v2。

可以使用索引(必须在定义的范围内) 来初始化或包含向量和矩阵值, 如例3.20 所示。

例 3.20:

math_Vector v(1, 3);
math_Matrix m(1, 3, 1, 3);
Standard_Real value;
v(2) = 1.0;
value = v(1);
m(1, 3) = 1.0;
value = m(2, 2);

在向量和矩阵对象上的有些操作可能是不合法的。 这种情况下, 系统会产生异常,如例 3.21 所示。可能用到的两种标准异常有:

(1) Standard_DimensionError 异常。当两个矩阵或者向量的维数不同时,系统产生 Standard_DimensionError 异常。
(2) Standard_RangeError 异常。如果向量或矩阵的索引在定义的范围外,系统将产生 Standard_RangeError 异常。

例 3.21:

math_Vector v1(1, 3), v2(1, 2), v3(0, 2);
v1 = v2;
//错误,将产生 Standard_DimensionError 异常。
v1 = v3;
//可以,尽管索引区间不相等,但维数是一样的。
v1(0) = 2.0;
//错误,将产生 Standard_RangeError 异常。

1.2 基本几何类型

  在创建一个几何对象前,必须知道这个对象是 2D 的还是 3D 的,以及将如何使用这个对象。

  gp 包为二维和三维对象提供了一些通过值处理的类。它定义了一些基本的非持久几何实体;这些实体在二维和三维的代数计算和基本几何结构分析中用到。 它也提供一些基本的几何转换, 如等价、 旋转、 平移、 镜像、 缩放、 复合变换等。

  注意: gp 包中的实体是通过值处理的。gp 包中可实现的几何实体有:二维和三维直角坐标(x, y, z)、矩阵、笛卡尔点、 向量、 方向、 轴、 直线、 圆、 椭圆、 双曲线、 抛物线、 平面、 无穷圆柱曲面、球面、螺旋面和圆锥面。

  在创建一个几何对象前, 必须知道它是二维的还是三维的, 以及将如何使用它。 如果需要的不是某种基本几何类型的单个实例, 而是某种几何类型的一系列实例,那么 TColgp 包能够处理这样的集合容器,并且提供一些必要的功能。特别地, 这个包为通用类中那些标准的和经常使用的实例化提供几何对象。 TColgp包为 TCollection 类的实例化提供类(来自 gp 包, 如 XY、 XYZ、 Pnt、 Pnt2d、Vec、 Vec2d、 Lin、 Lin2d、 Circ、 Circ2d 等; 这些类是非持久的)。

1.3 常用数学算法

  常用数学算法组件为一些经常使用的数学算法提供 C++实现。它们包括:

(1)求解线性方程组的算法;
(2) 寻找一元或多元函数最小值的算法;
(3)求解非线性方程或非线性方程组的算法;
(4)寻找矩阵特征值和特征向量的算法。

  所有的数学算法都是采用相同的规则来实现的。这些规则包括:

  (1)构造函数。在给定合适的参数后,构造函数完成算法需要实现的所有
或者大部分算法。 所有相关信息存储在构造的对象中。 因此后发计算或后发问题将以最有效的方式解决。
  (2) IsDone 函数。如果计算成功, IsDone 函数将返回布尔真值。
  (3)对每一种算法的都提供了一套函数;每套函数能够包含多个结果。只有 IsDone 函数返回真值时, 才可以调用函数。 否则将产生 StdFail_NotDone 异常。

  例 3.22 说明了 Gauss 类(用来实现线性方程组的高斯解法)的用法。例中的声明是从 math_Gauss 类的头文件中提取出来的。

例 3.22:

class Gauss
{
public:
Gauss (const math_Matrix& A);
Standard_Boolean IsDone() const;
void Solve (const math_Vector& B,
math_Vector& X) const;
};

假设要用高斯类解方程 ax1=b1 和 ax2=b2, 那么程序实现如例 3.23 所示。

例 3.23:

#include <math_Vector.hxx>
#include <math_Matrix.hxx>
main ()
{
math_ Matrix a(1, 3, 1, 3);
math_Vector b1(1, 3), b2(1, 3);
math_Vector x1(1, 3), x2(1, 3);
// a, b1 和 b2 设有相应的值。
math_Gauss sol(a);
//计算系数矩阵 A 的 LU 分解。
if(sol.IsDone())
{ //是否分解成功?
sol.Solve(b1, x1);
//分解成功,则计算第一组解 x1。
sol.Solve(b2, x2);
//接着计算第二组解 x2。
...
}
else
{ //分解不成功。
//分析错误原因。
sol.Solve(b1, x1);
//错误,产生 StdFail_NotDone 异常。}
}
}

  例 3.24 说明了 BissecNewton 类(实现了 Newton 和 Bissection 算法的结合,用来解一个具有指定边界的函数)的用法。

例 3.24:

class BissecNewton
{
public:
BissecNewton (math_FunctionWithDerivative& f,
const Standard_Real bound1,
const Standard_Real bound2,
const Standard_Real tolx);
Standard_Boolean IsDone() const;
Standard_Real Root();
};

  抽象类 math_FunctionWithDerivative 描述了这样一些服务,这些服务在BissecNewton 算法用到的 f 函数中必须被实现。例 3.25 中的声明来自抽象类math_FunctionWithDerivative 的头文件。

例 3.25:

class math_FunctionWithDerivative
{
public:
virtual Standard_Boolean Value (const Standard_Real x, Standard_Real& f) = 0;
virtual Standard_Boolean Derivative (const Standard_Real x,
Standard_Real& d) = 0;
virtual Standard_Boolean Values (const Standard_Real x,
Standard_Real& f,
Standard_Real& d) = 0;
};

  下面的测试例子(例 3.26)用 BissecNewton 类来解方程 f(x)=x**2-4,其中x 在区间[1.5, 2.5]取值。这个待解函数在 myFunction 类中实现,而 myFunc- tion类是 math_FunctionWithDerivative 的派生类。 Main 函数将找到所需的根。

例 3.26:

#include <math_BissecNewton.hxx>
#include <math_FunctionWithDerivative.hxx>
class myFunction : public math_FunctionWithDerivative
{
Standard_Real coefa, coefb, coefc;
public:myFunction (const Standard_Real a, const Standard_Real b,
const Standard_Real c) : coefa(a), coefb(b), coefc(c)
{}
virtual Standard_Boolean Value (const Standard_Real x,
Standard_Real& f)
{
f = coefa * x * x + coefb * x + coefc;
}
virtual Standard_Boolean Derivative (const Standard_Real x,
Standard_Real& d)
{
d = coefa * x * 2.0 + coefb;
}
virtual Standard_Boolean Values (const Standard_Real x,
Standard_Real& f, Standard_Real& d)
{
f = coefa * x * x + coefb * x + coefc;
d = coefa * x * 2.0 + coefb;
}
};
main()
{
myFunction f(1.0, 0.0, 4.0);
math_BissecNewton sol(F, 1.5, 2.5, 0.000001);
if(Sol.IsDone())
{ //条件是否为真?
Standard_Real x = sol.Root();
//条件为真则执行该语句。
}
else
{ //条件是假的。
//这里需要一些代码,用来尝试别的方法或者产生异常。
}
. . .
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

【LeetCode每日一题】2789. 合并后数组中的最大元素

文章目录 [2789. 合并后数组中的最大元素](https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/)思虑&#xff1a;代码&#xff1a; 2789. 合并后数组中的最大元素 思虑&#xff1a; 1.因为要合并的条件之一是&#xff0c;num[i]<num[i1].所…

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

c++11语法特性

c11 1.c11发展简介 ​ 第一个比较正式的c标准是1998提出的c98标准。之后定了5年计划&#xff0c;每5年来一次大更新。在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C…

RabbitMQ 模拟实现【三】:存储设计

文章目录 数据库设计SQLite配置数据库实现 数据库关于哈希表等复杂类的存储启动数据库 文件设计消息持久化消息属性格式核心方法消息序列化消息文件回收 统一硬盘存储管理内存存储管理线程安全数据结构实现 数据库设计 数据库主要存储交换机、队列、绑定 SQLite 此处考虑的是…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

Chitosan-PEG-DSPE 壳聚糖修聚乙二醇磷脂 DSPE-PEG-Chitosan

产品简称&#xff1a;DSPE-PEG-Chitosan、Chitosan-PEG-DSPE、DSPE-PEG-CS、CS-PEG-DSPE 产品中文名称&#xff1a;壳聚糖-聚乙二醇-磷脂、磷脂-聚乙二醇-壳聚糖 分子量&#xff1a;可以根据要求定制 保存条件&#xff1a; -20干燥保存 有效期&#xff1a; 一年 纯度&…

创建SpringCloudGateWay

创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…

C++进阶--mep和set的模拟实现

红黑树链接入口 底层容器 模拟实现set和map时常用的底层容器是红黑树。 红黑树是一种自平衡的搜索二叉树&#xff0c;通过对节点进行颜色标记来保持平衡。 在模拟实现set和map时&#xff0c;可以使用红黑树来按照元素的大小自动排序&#xff0c;并且保持插入和删除操作的高效…

Set cancelled by MemoryScratchSinkOperator

Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…

微信名【无感】的同学,你还好吗?

今天遇到个选择了微信一对一服务的同学&#xff0c;问Python问题&#xff0c;问题比较简单。 回答完问题&#xff0c;我就说了一句&#xff1a;问题比较简单&#xff0c;随意打赏一个红包就行了。 然后我就被拉黑了&#xff0c;然后我的解答问题&#xff0c;收到了一堆投诉&…

深入解析Java中锁机制以及底层原理

一、概述 1.1 背景 概念&#xff1a;锁是多线程编程中的机制&#xff0c;用于控制对共享资源的访问。可以防止多个线程同时修改或读取共享资源&#xff0c;从而保证线程安全。 作用&#xff1a;锁用于实现线程间的互斥和协调&#xff0c;确保在多线程环境下对共享资源的访问顺…

Flutter开发入门——Widget和常用组件

1.什么是Widget&#xff1f; 在Flutter中几乎所有的对象都是一个 widget 。与原生开发中“控件”不同的是&#xff0c;Flutter 中的 widget 的概念更广泛&#xff0c;它不仅可以表示UI元素&#xff0c;也可以表示一些功能性的组件如&#xff1a;用于手势检测的 GestureDetecto…

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…

ChatGPT浪潮来袭!谁先掌握,谁将领先!

任正非在接受采访时说 今后职场上只有两种人&#xff0c; 一种是熟练使用AI的人&#xff0c; 另一种是创造AI工具的人。 虽然这个现实听起来有些夸张的残酷&#xff0c; 但这就是我们必须面对的事实 &#x1f4c6; 对于我们普通人来说&#xff0c;我们需要努力成为能够掌握…

基于STM32的智慧农业管理系统设计与实现

文章目录 一、前言1.1 项目介绍【1】项目功能【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 传感器功能介绍1.4 开发工具的选择 二、EMQX开源MQTT服务器框架三、购买ECS云服务器3.1 登录官网3.2 购买ECS服务器3.3 配置安全组3.4 安装FinalShell3.5 远程登录到云服…

xsslabs靶场通关(持续更新)

文章目录 前言一、level1思路实现 二、levle2思路 三、level3思路实现 四、level4思路实现 五、level5思路实现 六、level6思路实现 七、level7思路实现 八、level8思路实现 九、level9思路实现 前言 本篇文章将介绍在xsslabs这个靶场&#xff08;在不知道源码的前提下&#x…

Linux从0到1——Linux环境基础开发工具的使用(上)

Linux从0到1——Linux环境基础开发工具的使用&#xff08;上&#xff09; 1. Linux软件包管理器yum1.1 yum介绍1.2 用yum来下载软件1.3 更新yum源 2. Linux编辑器&#xff1a;vi/vim2.1 vim的基本概念2.2 vim的基本操作2.3 vim正常模式命令集2.4 vim底行模式命令集2.5 视图模式…

Java初阶数据结构队列的实现

1.队列的概念 1.队列就是相当于排队打饭 2.在排队的时候就有一个队头一个队尾。 3.从队尾进对头出 4.所以他的特点就是先进先出 所以我们可以用链表来实现 单链表实现要队尾进队头出{要有last 尾插头删} 双向链表实现效率高&#xff1a;不管从哪个地方当作队列都是可以的&…

OpenMP 编程模型

OpenMP 内存模型 共享内存模型&#xff1a; OpenMP 专为多处理器/核心、共享内存机器设计&#xff0c;底层架构可以是共享内存UMA或NUM OpenMP 执行模型 基于线程的并行&#xff1a; OpenMP 程序基于多线程来实现并行&#xff0c; 线程是操作系统可以调度的最小执行单元。 …