首页 > 编程语言 >opencascade Bnd_Range源码学习区间计算

opencascade Bnd_Range源码学习区间计算

时间:2024-09-20 18:45:42浏览次数:8  
标签:Real const Standard Range 源码 opencascade 区间 Bnd

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 的一些基本操作,涵盖了创建、合并、相交检查、分割、扩展和移动区间等常见使用场景。

参考
参考链接

标签:Real,const,Standard,Range,源码,opencascade,区间,Bnd
From: https://www.cnblogs.com/yzxxty/p/18423043

相关文章

  • 基于JSP客户关系管理系统的设计与实现的计算机毕设源码+论文
    摘要:本客户关系管理系统是使用JSP编程语言和SQLServer2000数据库共同来完成的,采用面向对象方法,对客户关系管理系统进行设计与实现。分析设计了客户关系管理系统的静态模型和动态模型,完成了系统开发的分析、设计和实现的工作。本客户关系管理系统通过Web方式完成用户与系统的交互,系......
  • 首码邀请码拉新注册锁码排单系统源码开发
    首码邀请码拉新注册锁码排单系统是一种用于管理用户邀请和注册的系统,通常应用于需要通过邀请机制来控制新用户增长的应用场景。这种系统可以帮助平台更好地管理用户增长速度、防止恶意注册,并确保每个邀请码的有效性和唯一性。以下是对这种系统的源码开发案例进行分析一、系统概述首......
  • 相亲交友系统源码 连接你我,不再孤单
     在这个数字时代,人们的生活方式已经发生了巨大的变化。随着工作压力增大和社会竞争激烈化,很多人发现自己很难有时间和机会去结识新的朋友,更不用说找到适合自己的伴侣了。相亲交友系统正是在这种背景下应运而生,它不仅简化了交友过程,更为单身人士提供了一个广阔的平台,让他们有机会遇......
  • 配送跑腿小程序源码大揭秘:快速部署你的服务平台
    在配送跑腿行业的快速发展中,开发一款专属的小程序可以为您的业务带来显著提升。如何借助现成的源码进行快速开发和部署,构建高效的配送服务平台?本文将为您揭秘配送跑腿小程序的源码结构,并通过代码示例,帮助您轻松实现功能部署和业务上线。一、源码开发的核心优势使用开源代码可以显著......
  • 上门安装维修服务预约平台源码开发
    预约上门安装维修系统接单平台是一种为用户提供便捷的上门服务解决方案的应用。这种系统通常用于家电维修、家具安装、家政服务等领域,通过线上预约、派单、跟踪等流程,提高服务效率和用户体验。开发编辑wcz9563以下是对该设计的详细解析以下是对该系统的开发案例解析和源码示例。一......
  • 链动2+1模式系统发源码之区域代理架构设计与功能解析
    链动2+1模式系统开发源码中的区域代理设计,主要围绕行政区划分的省、市、区代理机制进行构建,旨在通过这一机制促进线上线下的融合,提升区域市场的覆盖。以下是对该设计的详细解析一、区域代理的设立与获取方式1. 设立原则:区域代理分为省级代理、市级代理和区县代理,每个级别均基于行......
  • 从源码看透 Ptmalloc:堆内存分配与释放的背后
    ......
  • UWB无线载波通信技术详解!【UWB人员定位系统源码】
    简介超宽带(UltraWideBand,UWB)技术是一种无线载波通信技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。尽管使用无线通信,但其数据传输速率可以达到几百兆比特每秒以上。使用UWB技术可在非常宽的带宽上传输信号,美国联邦通信委员会(FCC)对UWB技......
  • 基于微信小程序的小区租拼车管理信息系统的设计与实现-计算机毕业设计源码+LW文档
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序小区租拼车管理信息系统的开发全过程。通过分析微信小程序小区租拼车管理信息系统管理的不足,创建了一个计算机管理微信小程序小区租拼车管理信息系统的方案。文章介绍......
  • 基于JSP+SQL英语在线考试系统毕业设计整套的计算机毕设源码+论文
    摘要伴随着Internet技术在各个领域的广泛应用,当今社会已经进入信息时代,信息技术革命使社会的各个领域都发生了翻天覆地的变化,计算机,网络技术也渗透到了学校的日常管理当中去。而且网络化的管理也适合现在人的生活需求。在线考试系统以其较高的实用功能、高效率的管理手段深受各......