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

news2024/11/15 7:03:42

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.coloradmin.cn/o/1516148.html

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

相关文章

短剧小程序开发:探索剧情新纪元,随时随地畅享精彩短剧

随着移动互联网的快速发展&#xff0c;人们对碎片化时间的利用越来越高效。短剧小程序应运而生&#xff0c;为用户带来了一种全新的娱乐方式。我们致力于开发一款功能丰富、体验优越的短剧小程序&#xff0c;让您随时随地畅享精彩剧情。 短剧小程序将汇聚众多优质短剧资源&…

科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处

科技成果鉴定测试&#xff0c;作为科技领域中一项重要的质量检验手段&#xff0c;具有广泛的应用范围。旨在为科技成果的研发者和使用者提供客观、科学、权威的鉴定结果&#xff0c;从而评估科技成果的技术水平和市场竞争力。   科技成果鉴定测试是对科技成果进行系统、全面的…

【小工具】一键美化nvidia-smi,查看GPU运行状态,无须配置

pip install nvitop可以在远程console看&#xff0c;是动态的。 鼠标滚轮控制显示哪个进程。

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)上篇

提供具有网页显示能力的Web组件&#xff0c;ohos.web.webview提供web控制能力。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。示例效果请以真机运行为准&#xff0c;当前IDE预览器不支持。 需要权…

大型污水处理站运维公司怎么选择

大型污水处理站运维公司的选择是关乎环境保护和城市发展的重要决策。在如今污水治理领域日益重要的背景下&#xff0c;选择一家专业的运维公司对于确保污水处理站的高效运行、提高处理效果和保护环境具有关键意义。那么&#xff0c;我们应该如何选择适合自己的大型污水处理站运…

OpenCV读取tensorflow神经网络模型:SavedModel格式转为frozen graph的方法

本文介绍基于Python的tensorflow库&#xff0c;将tensorflow与keras训练好的SavedModel格式神经网络模型转换为frozen graph格式&#xff0c;从而可以用OpenCV库在C 等其他语言中将其打开的方法。 如果我们需要训练并使用一个神经网络模型&#xff0c;一般情况下都是首先借助Py…

如何保证缓存与数据库的双写一致性?(史上最全)

目录 一、面试官心理分析 1. Cache Aside Pattern 2. 最初级的缓存不一致问题及解决方案 3. 比较复杂的数据不一致问题分析 一、面试官心理分析 你只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问…

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用&#xff0c;用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性&#xff0c;并提高代码的可读性。 安装 要使用 django-comment-migrate&#xff0c;您需要…

使用大型语言模型进行实体提取

原文地址&#xff1a;Using A Large Language Model For Entity Extraction LLM 能否比传统 NLP 方法更好地提取实体&#xff1f; 2022 年 7 月 12 日 Large Language Models for Generative Information Extraction: A Survey 实体简介 使用Co:here大型语言模型。 实体可以被视…

Qt学习--自定义命名空间

假设我们要创建一个命名空间来包含与圆形相关的功能。我们可以命名这个命名空间为 Cir &#xff1a; 在这个头文件中&#xff0c;我们定义了一个名为 Cir 的命名空间&#xff0c;其中包含了计算圆的面积和周长的函数&#xff0c;以及 圆周率常量 PI 。 使用命名空间 在…

软考73-上午题-【面向对象技术2-UML】-UML中的图4

一、构件图&#xff08;组件图&#xff09; 1-1、构件图的定义 展现了&#xff0c;一组构件之间的组织和依赖。 构件图专注于系统的静态实现图。 构件图与类图相关&#xff0c;通常把构件映射为一个、多个类、接口、协作。 【回顾】&#xff1a; 类图展示了一组对象、接口、…

学生时期学习资源同步-1 第一学期结业考试题4

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了

【Java - 框架 - Mybatis】(02) SpringBoot整合Mybatis操作Mysql - 快速上手

“SpringBoot"整合"Mybatis"操作"Mysql” - 快速上手&#xff1b; 环境 Java版本"1.8.0_202"&#xff1b;Spring Boot版本"2.5.9"&#xff1b;Windows 11 专业版_22621.2428&#xff1b;IntelliJ IDEA 2021.1.3(Ultimate Edition)&a…

VC++ BitBlt函数学习

1 BitBlt BitBlt函数执行与像素矩形相对应的颜色数据的位块传输,从指定的源设备上下文传输到目标设备上下文。 把位块从一个DC传到另一个DC; VC单文档工程,写3句代码如下; void CDeskdcView::OnDraw(CDC* pDC) {CDeskdcDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);//…

mac输入su命令报错如何重置密码

diannao1xiejiandeMacBook-Air ~ % su Password: su: Sorry输入 sudo passwd 命令重置密码即可。

Seata 2.x 系列【10】回滚日志表 undo_log

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 表语句…

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…

手把手带你实现大模型检索增强生成RAG(一)——数据清洗准备

首先&#xff0c;需要整理一大堆可以用来检索的文本数据&#xff0c;这些数据可以是网页、论文、报告、电影脚本、电视剧脚本等等。这些数据可以是原始的文本数据&#xff0c;也可以是经过清洗、处理过的文本数据。 作为IT打工仔&#xff0c;我从二道贩子处购入一本软考秘籍。…

【Numpy】基础学习:一文了解np.expand_dims的作用、用法

【Numpy】基础学习&#xff1a;一文了解np.expand_dims的作用、用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…