opencascade Bnd_Range源码学习区间计算

news/2024/11/14 20:45:15/文章来源:https://www.cnblogs.com/yzxxty/p/18423043

opencascade Bnd_Range

前言

这个类描述了由两个实数值限定的 1D 空间中的区间。
一个区间可以是无效的,这表示区间中不包含任何点。

方法

1

默认构造函数。创建一个无效区间。
Bnd_Range() ;

2

构造函数。创建最小最大值区间
Bnd_Range(const Standard_Real theMin, const Standard_Real theMax) ;

3

替换为和 theOther 的交集。
void Common(const Bnd_Range& theOther);

4

将 *this 和 theOther 合并为一个区间。
用结果替换 *this。
如果操作无法完成(例如,输入参数为空或分离),则返回 false。 使用方法 ::Add() 以无条件合并两个区间。
Standard_Boolean Union(const Bnd_Range& theOther);

5

通过 theVal 值将 分割为多个子区间
例如,区间 [3, 15] 将通过 theVal 5 被分割为两个区间:[3, 5] 和 [5, 15])。
新的区间将被推入 theList(在调用此方法之前,theList 必须正确初始化)。
如果 thePeriod != 0.0,则至少有一个新的区间边界(如果 <this> 交叉 theVal+kthePeriod)
将等于 theVal+thePeriod*k,其中 k 是一个整数(k = 0, +/-1, +/-2, ...)。
(假设上面的 thePeriod 为 4 ==> 我们将获得四个区间:[3, 5]、[5, 9]、[9, 13] 和 [13, 15])。
void Split(const Standard_Real theVal,
NCollection_List<Bnd_Range>& theList,
const Standard_Real thePeriod = 0.0) const;

6

检查 是否与如下形式的值相交:
//! theVal+kthePeriod,其中 k 是一个整数(k = 0, +/-1, +/-2, ...)。
//! 返回:
//! 0 - 如果 不与 theVal+k
thePeriod 相交。
//! 1 - 如果 与 theVal+kthePeriod 相交。
//! 2 - 如果 myFirst 或/和 myLast 等于 theVal+k
thePeriod。
//!
//! 注意!!!
//! 如果 (myFirst == myLast),则此函数仅返回 0 或 2。
Standard_EXPORT Standard_Integer
IsIntersected(const Standard_Real theVal,
const Standard_Real thePeriod = 0.0)

7

//! 扩展 以包含 theParameter。
void Add(const Standard_Real theParameter)

8

//! 扩展此区间以包含两个区间。
//! @sa 使用方法 ::Union() 检查两个区间是否重叠。
void Add (const Bnd_Range& theRange)

9

//! 获取 的最小边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetMin(Standard_Real& thePar)

10

//! 获取 的最大边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetMax(Standard_Real& thePar)

11

//! 获取 的最小和最大边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetBounds(Standard_Real& theFirstPar,
Standard_Real& theLastPar)

12

//! 获取满足方程的 theParameter 值
//! (theParameter-MIN)/(MAX-MIN) == theLambda。
//! * theLambda == 0 --> 返回最小边界;
//! * theLambda == 0.5 --> 返回中点;
//! * theLambda == 1 --> 返回最大边界;
//! * theLambda < 0 --> 返回小于最小值的值;
//! * theLambda > 1 --> 返回大于最大值的值。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetIntermediatePoint(const Standard_Real theLambda,
Standard_Real& theParameter)

13

//! 返回区间值 (MAX-MIN)。对于无效区间,返回负值。
Standard_Real Delta() const

14

//! 判断 是否已初始化。
Standard_Boolean IsVoid() const

15

//! 使用默认参数初始化 。将 设置为无效。
void SetVoid()

16

//! 扩展区间以包含给定值(向两边扩展)。
void Enlarge(const Standard_Real theDelta)

17

//! 返回偏移 theVal 后的 <*this> 的副本。
Bnd_Range Shifted(const Standard_Real theVal)

18

//! 偏移 <*this> by theVal。
void Shift(const Standard_Real theVal)

19

//! 通过给定的下限修剪区间的最小值。
//! 如果给定的下限大于区间最大值,则标记区间为无效。
void TrimFrom (const Standard_Real theValLower)

20

//! 通过给定的上限修剪区间的最大值。
//! 如果给定的上限小于区间最大值,则标记区间为无效。
void TrimTo (const Standard_Real theValUpper)

21

//! 如果值超出此区间,则返回 True。
Standard_Boolean IsOut (Standard_Real theValue)

22

//! 如果给定的区间超出此区间,则返回 True。
Standard_Boolean IsOut (const Bnd_Range& theRange)

23

//! 如果 theOther 等于 <*this> 则返回 TRUE。
Standard_Boolean operator==(const Bnd_Range& theOther)

24

//! 将内容输出到流中。
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1)

使用例子

Bnd_Range 类表示一维空间中的一个区间,用于定义范围或区间,并提供了多种操作方法。下面是一个使用 Bnd_Range 类的简单例子,演示如何创建区间、合并区间、检查相交、分割区间等操作。

#include <iostream>
#include <Bnd_Range.hxx>
#include <NCollection_List.hxx>int main()
{// 创建一个区间 [2.0, 5.0]Bnd_Range range1(2.0, 5.0);std::cout << "Range1: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;// 创建另一个区间 [3.0, 7.0]Bnd_Range range2(3.0, 7.0);std::cout << "Range2: [" << range2.GetMin() << ", " << range2.GetMax() << "]" << std::endl;// 合并两个区间if (range1.Union(range2)) {std::cout << "Union of Range1 and Range2: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;} else {std::cout << "Union operation failed." << std::endl;}// 检查区间是否相交Standard_Integer isIntersected = range1.IsIntersected(4.0);std::cout << "Range1 intersects with 4.0: " << (isIntersected ? "Yes" : "No") << std::endl;// 分割区间NCollection_List<Bnd_Range> splitRanges;range1.Split(4.0, splitRanges);std::cout << "Split Range1 at 4.0:" << std::endl;for (auto it = splitRanges.cbegin(); it != splitRanges.cend(); ++it) {std::cout << "  [" << it->GetMin() << ", " << it->GetMax() << "]" << std::endl;}// 扩展区间range1.Enlarge(1.0);std::cout << "Enlarged Range1: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;// 移动区间range1.Shift(2.0);std::cout << "Shifted Range1 by 2.0: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;return 0;
}

示例说明:

  1. 创建区间:我们创建了两个 Bnd_Range 对象 range1range2,分别表示区间 [2.0, 5.0][3.0, 7.0]

  2. 合并区间:使用 Union 方法合并 range1range2。如果两个区间相交,它们将合并为一个新的区间。

  3. 检查相交:使用 IsIntersected 方法检查 range1 是否与 4.0 相交。

  4. 分割区间:使用 Split 方法在 4.0 处将 range1 分割为多个子区间,并将结果存储在 splitRanges 列表中。

  5. 扩展区间:使用 Enlarge 方法将 range1 向两边扩展 1.0

  6. 移动区间:使用 Shift 方法将 range1 向右移动 2.0

输出示例:

Range1: [2.0, 5.0]
Range2: [3.0, 7.0]
Union of Range1 and Range2: [2.0, 7.0]
Range1 intersects with 4.0: Yes
Split Range1 at 4.0:[2.0, 4.0][4.0, 7.0]
Enlarged Range1: [1.0, 8.0]
Shifted Range1 by 2.0: [3.0, 10.0]

这个例子展示了 Bnd_Range 的一些基本操作,涵盖了创建、合并、相交检查、分割、扩展和移动区间等常见使用场景。

参考opencascade Bnd_Range

前言

在这里插入图片描述

这个类描述了由两个实数值限定的 1D 空间中的区间。
一个区间可以是无效的,这表示区间中不包含任何点。

方法

1

默认构造函数。创建一个无效区间。
Bnd_Range() ;

2

构造函数。创建最小最大值区间
Bnd_Range(const Standard_Real theMin, const Standard_Real theMax) ;

3

替换为和 theOther 的交集。
void Common(const Bnd_Range& theOther);

4

将 *this 和 theOther 合并为一个区间。
用结果替换 *this。
如果操作无法完成(例如,输入参数为空或分离),则返回 false。 使用方法 ::Add() 以无条件合并两个区间。
Standard_Boolean Union(const Bnd_Range& theOther);

5

通过 theVal 值将 分割为多个子区间
例如,区间 [3, 15] 将通过 theVal 5 被分割为两个区间:[3, 5] 和 [5, 15])。
新的区间将被推入 theList(在调用此方法之前,theList 必须正确初始化)。
如果 thePeriod != 0.0,则至少有一个新的区间边界(如果 <this> 交叉 theVal+kthePeriod)
将等于 theVal+thePeriod*k,其中 k 是一个整数(k = 0, +/-1, +/-2, ...)。
(假设上面的 thePeriod 为 4 ==> 我们将获得四个区间:[3, 5]、[5, 9]、[9, 13] 和 [13, 15])。
void Split(const Standard_Real theVal,
NCollection_List<Bnd_Range>& theList,
const Standard_Real thePeriod = 0.0) const;

6

检查 是否与如下形式的值相交:
//! theVal+kthePeriod,其中 k 是一个整数(k = 0, +/-1, +/-2, ...)。
//! 返回:
//! 0 - 如果 不与 theVal+k
thePeriod 相交。
//! 1 - 如果 与 theVal+kthePeriod 相交。
//! 2 - 如果 myFirst 或/和 myLast 等于 theVal+k
thePeriod。
//!
//! 注意!!!
//! 如果 (myFirst == myLast),则此函数仅返回 0 或 2。
Standard_EXPORT Standard_Integer
IsIntersected(const Standard_Real theVal,
const Standard_Real thePeriod = 0.0)

7

//! 扩展 以包含 theParameter。
void Add(const Standard_Real theParameter)

8

//! 扩展此区间以包含两个区间。
//! @sa 使用方法 ::Union() 检查两个区间是否重叠。
void Add (const Bnd_Range& theRange)

9

//! 获取 的最小边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetMin(Standard_Real& thePar)

10

//! 获取 的最大边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetMax(Standard_Real& thePar)

11

//! 获取 的最小和最大边界。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetBounds(Standard_Real& theFirstPar,
Standard_Real& theLastPar)

12

//! 获取满足方程的 theParameter 值
//! (theParameter-MIN)/(MAX-MIN) == theLambda。
//! * theLambda == 0 --> 返回最小边界;
//! * theLambda == 0.5 --> 返回中点;
//! * theLambda == 1 --> 返回最大边界;
//! * theLambda < 0 --> 返回小于最小值的值;
//! * theLambda > 1 --> 返回大于最大值的值。
//! 如果 是无效的,方法返回 false。
Standard_Boolean GetIntermediatePoint(const Standard_Real theLambda,
Standard_Real& theParameter)

13

//! 返回区间值 (MAX-MIN)。对于无效区间,返回负值。
Standard_Real Delta() const

14

//! 判断 是否已初始化。
Standard_Boolean IsVoid() const

15

//! 使用默认参数初始化 。将 设置为无效。
void SetVoid()

16

//! 扩展区间以包含给定值(向两边扩展)。
void Enlarge(const Standard_Real theDelta)

17

//! 返回偏移 theVal 后的 <*this> 的副本。
Bnd_Range Shifted(const Standard_Real theVal)

18

//! 偏移 <*this> by theVal。
void Shift(const Standard_Real theVal)

19

//! 通过给定的下限修剪区间的最小值。
//! 如果给定的下限大于区间最大值,则标记区间为无效。
void TrimFrom (const Standard_Real theValLower)

20

//! 通过给定的上限修剪区间的最大值。
//! 如果给定的上限小于区间最大值,则标记区间为无效。
void TrimTo (const Standard_Real theValUpper)

21

//! 如果值超出此区间,则返回 True。
Standard_Boolean IsOut (Standard_Real theValue)

22

//! 如果给定的区间超出此区间,则返回 True。
Standard_Boolean IsOut (const Bnd_Range& theRange)

23

//! 如果 theOther 等于 <*this> 则返回 TRUE。
Standard_Boolean operator==(const Bnd_Range& theOther)

24

//! 将内容输出到流中。
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1)

使用例子

Bnd_Range 类表示一维空间中的一个区间,用于定义范围或区间,并提供了多种操作方法。下面是一个使用 Bnd_Range 类的简单例子,演示如何创建区间、合并区间、检查相交、分割区间等操作。

#include <iostream>
#include <Bnd_Range.hxx>
#include <NCollection_List.hxx>int main()
{// 创建一个区间 [2.0, 5.0]Bnd_Range range1(2.0, 5.0);std::cout << "Range1: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;// 创建另一个区间 [3.0, 7.0]Bnd_Range range2(3.0, 7.0);std::cout << "Range2: [" << range2.GetMin() << ", " << range2.GetMax() << "]" << std::endl;// 合并两个区间if (range1.Union(range2)) {std::cout << "Union of Range1 and Range2: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;} else {std::cout << "Union operation failed." << std::endl;}// 检查区间是否相交Standard_Integer isIntersected = range1.IsIntersected(4.0);std::cout << "Range1 intersects with 4.0: " << (isIntersected ? "Yes" : "No") << std::endl;// 分割区间NCollection_List<Bnd_Range> splitRanges;range1.Split(4.0, splitRanges);std::cout << "Split Range1 at 4.0:" << std::endl;for (auto it = splitRanges.cbegin(); it != splitRanges.cend(); ++it) {std::cout << "  [" << it->GetMin() << ", " << it->GetMax() << "]" << std::endl;}// 扩展区间range1.Enlarge(1.0);std::cout << "Enlarged Range1: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;// 移动区间range1.Shift(2.0);std::cout << "Shifted Range1 by 2.0: [" << range1.GetMin() << ", " << range1.GetMax() << "]" << std::endl;return 0;
}

示例说明:

  1. 创建区间:我们创建了两个 Bnd_Range 对象 range1range2,分别表示区间 [2.0, 5.0][3.0, 7.0]

  2. 合并区间:使用 Union 方法合并 range1range2。如果两个区间相交,它们将合并为一个新的区间。

  3. 检查相交:使用 IsIntersected 方法检查 range1 是否与 4.0 相交。

  4. 分割区间:使用 Split 方法在 4.0 处将 range1 分割为多个子区间,并将结果存储在 splitRanges 列表中。

  5. 扩展区间:使用 Enlarge 方法将 range1 向两边扩展 1.0

  6. 移动区间:使用 Shift 方法将 range1 向右移动 2.0

输出示例:

Range1: [2.0, 5.0]
Range2: [3.0, 7.0]
Union of Range1 and Range2: [2.0, 7.0]
Range1 intersects with 4.0: Yes
Split Range1 at 4.0:[2.0, 4.0][4.0, 7.0]
Enlarged Range1: [1.0, 8.0]
Shifted Range1 by 2.0: [3.0, 10.0]

这个例子展示了 Bnd_Range 的一些基本操作,涵盖了创建、合并、相交检查、分割、扩展和移动区间等常见使用场景。

参考
参考链接

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

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

相关文章

P2414 [NOI2011] 阿狸的打字机

题目思路 将每一个输出的串放入一个 Trie 树中。 考虑离线处理询问 \((x, y)\),对于每一个 \(y\) 集中处理所有的 \(x\),\(y\) 在 Trie 树上走,走过的点标记一下,结果就是 \(x\) 字符串结尾节点在 fail 树上的对应节点的子树的标记数量。 记得在节点离开的时候撤销标记。 代…

0920

线代 舒尔公式,化上三角,下三角,对角阵 范德蒙德行列式 X型行列式,{主对角中下标之和为(2k+1)的两项乘积-副对角中下标之和为(2k+1)的两项乘积【需与前面两项下标号相同】}的连乘 宽对角,a2=4bc,a2≠4bc计组 MAR位数说明存储单元位数 MDR位数说明字长 编译器:将高级语…

DeepFM

参考资料:https://blog.csdn.net/u012328159/article/details/122938925 https://blog.csdn.net/u012328159/article/details/120684544?spm=1001.2014.3001.5501DeepFM FM部分 目前在模型层面做交叉特征的难点主要有以下两个方面:交叉特征的参数独立,强依赖于在样本中的共…

米尔STM32MP2核心板首发新品上市!高性能+多接口+边缘算力

米尔发布基于STM32MP257设计的嵌入式处理器模块MYC-LD25X核心板及开发板。核心板基于STM32MP2系列是意法半导体推出最新一代工业级64位微处理器,采用LGA 252 PIN设计,存储配置1GB/2GB LPDDR4、8GB eMMC,具有丰富的通讯接口,适用于高端工业HMI、边缘计算网关、新能源充电桩、…

Fork+GIT操作

上传分支,在主干,上传完成代码之后,点击新建分支,去一个名字,如1.0.9,双击分支,点击“push”即可将主干所以代码上传到分支上备份一个 合并分支,,双击进入分支,选中要合并的部分,右键点击“Cherry-pick”,再次点击“Push”

影像测试技能

主要分三种职业:3A算法开发、图像tuning,图像测试这三种。 3a算法:AE/AWB/AF的开发,入门难一些,资料很少。 图像tuning:在理解3A算法的基础上,调试3A参数,当前需求量还是比较大的,学习起来也不太难,难在实践积累,多看多调。 1、 AWB auto white balance 自动白平衡 …

Camstar建模表格弹出编辑

大部分都是用行内编辑,但是如果由弹出编辑的需求,也需要了解下。 以工单建模为例子。自己搞个VP。Grid是MaterialList。 此时,表格并不具备,弹出编辑的能力。改下表格的属性,DataSubmissionMode=Changed 添加WebPart编辑框开始修改,每个属性控件的,属性!不然会报错!!…

在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

异常筛选器可以捕获和处理 ASP.NET Core Web API 中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。前言 在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一…

js实现网页端录音功能

1、代码 首先安装依赖包:recorderxnpm install recorderx -S<template><div class="container"><div class="mt-30"><el-button @click="onStartRecord">开始录音</el-button><el-button @click="onStop…

教你几招,轻松设置Win11右键恢复旧版模样

大家好!今天要教大家如何把 Win11 右键菜单变回完整的展开模式哦!其实很简单,只要在 Windows 开始图标下面的运行里输入一段代码就可以啦!接下来就让我来详细地跟大家分享一下这个方法吧!Win11右键菜单恢复为完整展开模式的方法1、首先,按键盘上的【 Win + X 】组合键,或…

第三周《密码系统设计》学习总结思维导图

marmaid代码为:graph LRA[密码系统设计第三周] --> B[《Windows C/C++ 加密解密实战》]B --> C[第四章]C --> T[4.2 加密基础]W --> U[CryptoAPI介绍]T --> V[加密概念]T --> X[加密类型]X --> d[对称加密]X --> e[非对称加密]T --> f[加密场景]C …

从虚拟到现实:数字孪生与数字样机的进化之路

​数字化技术高速发展的当下,计算机辅助技术已成为产品设计研发中不可或缺的一环,数字样机(Digital Prototype, DP)与数字孪生技术便是产品研发数字化的典型方法。本文将主要介绍数字样机与数字孪生在国内外的发展,并针对其技术痛点提出一种基于国产自研仿真工具进行虚拟模…