Open CASCADE学习|GeomFill_Frenet

GeomFill_Frenet继承自GeomFill_TrihedronLaw类。GeomFill_Frenet类主要用于实现Frenet标架的计算。Frenet标架是一个沿曲线移动的局部坐标系,它由切向量、法向量和副法向量组成,常用于机器人学、计算机图形学等领域。
 

class GeomFill_Frenet : public GeomFill_TrihedronLaw
{
public:Standard_EXPORT GeomFill_Frenet();Standard_EXPORT virtual Handle(GeomFill_TrihedronLaw) Copy() const Standard_OVERRIDE;Standard_EXPORT void Init();Standard_EXPORT virtual Standard_Boolean SetCurve (const Handle(Adaptor3d_Curve)& C) Standard_OVERRIDE;Standard_EXPORT virtual Standard_Boolean D0 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal) Standard_OVERRIDE;Standard_EXPORT virtual Standard_Boolean D1 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& DTangent, gp_Vec& Normal, gp_Vec& DNormal, gp_Vec& BiNormal, gp_Vec& DBiNormal) Standard_OVERRIDE;Standard_EXPORT virtual Standard_Boolean D2 (const Standard_Real Param, gp_Vec& Tangent, gp_Vec& DTangent, gp_Vec& D2Tangent, gp_Vec& Normal, gp_Vec& DNormal, gp_Vec& D2Normal, gp_Vec& BiNormal, gp_Vec& DBiNormal, gp_Vec& D2BiNormal) Standard_OVERRIDE;Standard_EXPORT virtual Standard_Integer NbIntervals (const GeomAbs_Shape S) const Standard_OVERRIDE;Standard_EXPORT virtual void Intervals (TColStd_Array1OfReal& T, const GeomAbs_Shape S) const Standard_OVERRIDE;Standard_EXPORT virtual void GetAverageLaw (gp_Vec& ATangent, gp_Vec& ANormal, gp_Vec& ABiNormal) Standard_OVERRIDE;Standard_EXPORT virtual Standard_Boolean IsConstant() const Standard_OVERRIDE;Standard_EXPORT virtual Standard_Boolean IsOnlyBy3dCurve() const Standard_OVERRIDE;DEFINE_STANDARD_RTTIEXT(GeomFill_Frenet,GeomFill_TrihedronLaw)
protected:
private:Standard_EXPORT Standard_Boolean IsSingular (const Standard_Real U, Standard_Integer& Index) const;Standard_EXPORT Standard_Boolean DoSingular (const Standard_Real U, const Standard_Integer Index, gp_Vec& Tangent, gp_Vec& BiNormal, Standard_Integer& n, Standard_Integer& k, Standard_Integer& TFlag, Standard_Integer& BNFlag, Standard_Real& Delta);Standard_EXPORT Standard_Boolean SingularD0 (const Standard_Real Param, const Standard_Integer Index, gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal, Standard_Real& Delta);Standard_EXPORT Standard_Boolean SingularD1 (const Standard_Real Param, const Standard_Integer Index, gp_Vec& Tangent, gp_Vec& DTangent, gp_Vec& Normal, gp_Vec& DNormal, gp_Vec& BiNormal, gp_Vec& DBiNormal, Standard_Real& Delta);Standard_EXPORT Standard_Boolean SingularD2 (const Standard_Real Param, const Standard_Integer Index, gp_Vec& Tangent, gp_Vec& DTangent, gp_Vec& D2Tangent, gp_Vec& Normal, gp_Vec& DNormal, gp_Vec& D2Normal, gp_Vec& BiNormal, gp_Vec& DBiNormal, gp_Vec& D2BiNormal, Standard_Real& Delta);Standard_EXPORT Standard_Boolean RotateTrihedron (gp_Vec& Tangent, gp_Vec& Normal, gp_Vec& BiNormal, const gp_Vec& NewTangent) const;gp_Pnt P;Handle(TColStd_HArray1OfReal) mySngl;Handle(TColStd_HArray1OfReal) mySnglLen;Standard_Boolean isSngl;

GeomFill_Frenet():构造函数,用于初始化GeomFill_Frenet对象。

Copy():返回当前对象的副本。

Init():初始化函数,用于初始化GeomFill_Frenet对象的状态。

SetCurve(const Handle(Adaptor3d_Curve)& C):设置曲线,Adaptor3d_Curve是一个适配器,用于将不同类型的曲线统一到一个接口。

D0, D1, D2函数:这些函数是Frenet标架计算的核心,用于获取曲线在不同阶数下的导数信息。D0:计算给定参数Param处的Frenet标架的零阶导数,即切向量(Tangent)、法向量(Normal)和副法向量(BiNormal)。D1:计算一阶导数,除了切向量(Tangent)外,还包括切向量的导数(DTangent)、法向量的导数(DNormal)和副法向量的导数(DBiNormal)。D2:计算二阶导数,包括切向量的二阶导数(D2Tangent)、法向量的二阶导数(D2Normal)和副法向量的二阶导数(D2BiNormal)。

NbIntervals和Intervals函数:这两个函数用于处理曲线分段的情况,当曲线不是单调或连续时,可能需要将其拆分成多个区间来单独处理。

NbIntervals:返回给定形状S的区间数量。Intervals:将形状S的区间填充到数组T中。

GetAverageLaw函数:计算Frenet标架的平均值,包括平均切向量(ATangent)、平均法向量(ANormal)和平均副法向量(ABiNormal)。

IsConstant和IsOnlyBy3dCurve函数:这两个函数用于查询Frenet标架的某些特定属性。IsConstant:检查Frenet标架是否是常数,即是否不随参数变化。IsOnlyBy3dCurve:检查Frenet标架是否仅由3D曲线决定,与其他因素无关。

RTTI宏:DEFINE_STANDARD_RTTIEXT(GeomFill_Frenet,GeomFill_TrihedronLaw):定义运行时类型信息,使得在运行时可以准确识别GeomFill_Frenet对象的类型。

受保护和私有成员函数IsSingular:检查给定参数U处的Frenet标架是否奇异(即无法定义或计算不稳定)。DoSingular:处理奇异点的情况,计算奇异点处的Frenet标架及其相关属性。SingularD0:可能是处理奇异点处的零阶导数的函数,但代码片段不完整,无法提供完整解释。

以下代码的主要目的是生成一组随机点,拟合一个B样条曲线,对曲线进行采样,并计算每个采样点的Frenet标架。

#include <TColgp_Array1OfPnt.hxx>
#include <math_BullardGenerator.hxx>
#include <GCPnts_UniformAbscissa.hxx>
#include <GCPnts_UniformDeflection.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <GCPnts_QuasiUniformDeflection.hxx>
#include <Geom_BSplineCurve.hxx>
#include <GeomAPI_PointsToBSpline.hxx>
#include <GeomFill_Fixed.hxx>
#include <GeomFill_Frenet.hxx>
#include <GeomFill_ConstantBiNormal.hxx>
#include <GeomFill_CorrectedFrenet.hxx>
#include <GeomFill_Darboux.hxx>
#include <GeomFill_DiscreteTrihedron.hxx>
#include <GeomFill_GuideTrihedronAC.hxx>
#include <GeomFill_GuideTrihedronPlan.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepTools.hxx>
#include <GeomAdaptor_Curve.hxx>void test()
{TColgp_Array1OfPnt aPoints(1, 6);math_BullardGenerator aBullardGenerator;for (Standard_Integer i = aPoints.Lower(); i <= aPoints.Upper(); ++i){Standard_Real aX = aBullardGenerator.NextReal() * 50.0;Standard_Real aY = aBullardGenerator.NextReal() * 50.0;Standard_Real aZ = aBullardGenerator.NextReal() * 50.0;aPoints.SetValue(i, gp_Pnt(aX, aY, aZ));}GeomAPI_PointsToBSpline aBSplineFitter(aPoints);if (!aBSplineFitter.IsDone()){return;}Handle(Geom_BSplineCurve) aBSplineCurve = aBSplineFitter.Curve();Handle(GeomAdaptor_Curve) aCurveAdaptor = new GeomAdaptor_Curve(aBSplineCurve);BRepBuilderAPI_MakeEdge anEdgeMaker(aBSplineCurve); Handle(GeomFill_Frenet) aFrenet = new GeomFill_Frenet();aFrenet->SetCurve(aCurveAdaptor); GeomAdaptor_Curve GAC(aBSplineCurve);GCPnts_UniformAbscissa aPointSampler(GAC, 5.0);for (Standard_Integer i = 1; i <= aPointSampler.NbPoints(); ++i){Standard_Real aParam = aPointSampler.Parameter(i);gp_Pnt aP = aCurveAdaptor->Value(aParam);gp_Vec aT;gp_Vec aN;gp_Vec aB;aFrenet->D0(aParam, aT, aN, aB);std::cout << "vtrihedron vt" << i << " -origin " << aP.X() << " " << aP.Y() << " " << aP.Z() << " "<< " -zaxis " << aB.X() << " " << aB.Y() << " " << aB.Z() << " "<< " -xaxis " << aT.X() << " " << aT.Y() << " " << aT.Z() << std::endl;std::cout << "vtrihedron vt" << i << " -labels xaxis T 1" << std::endl;std::cout << "vtrihedron vt" << i << " -labels yaxis N 1" << std::endl;std::cout << "vtrihedron vt" << i << " -labels zaxis B 1" << std::endl;std::cout << "vsize vt" << i << " 2" << std::endl;}
}
int main(int argc, char* argv[])
{test();return 0;
}

​部分输出:

vtrihedron vt1 -origin 14.3321 39.5759 36.4378  -zaxis 0.603904 -0.215816 -0.767283  -xaxis 0.245889 -0.865249 0.436902

vtrihedron vt1 -labels xaxis T 1

vtrihedron vt1 -labels yaxis N 1

vtrihedron vt1 -labels zaxis B 1

vsize vt1 2

vtrihedron vt2 -origin 15.5482 35.2417 38.614  -zaxis 0.606185 -0.214462 -0.765862  -xaxis 0.240416 -0.868495 0.433493

vtrihedron vt2 -labels xaxis T 1

vtrihedron vt2 -labels yaxis N 1

vtrihedron vt2 -labels zaxis B 1

vsize vt2 2

vtrihedron vt3 -origin 16.7352 30.8904 40.772  -zaxis 0.608637 -0.213027 -0.764317  -xaxis 0.234266 -0.872095 0.429616

vtrihedron vt3 -labels xaxis T 1

vtrihedron vt3 -labels yaxis N 1

vtrihedron vt3 -labels zaxis B 1

vsize vt3 2

vtrihedron vt4 -origin 17.8894 26.52 42.9092  -zaxis 0.611285 -0.211501 -0.762626  -xaxis 0.227273 -0.876125 0.42515

vtrihedron vt4 -labels xaxis T 1

vtrihedron vt4 -labels yaxis N 1

vtrihedron vt4 -labels zaxis B 1

wps_clip_image-12476

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

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

相关文章

docker 数据卷

Docker数据卷是Docker中的一个核心机制&#xff0c;用于实现容器间数据的持久化和共享。它是宿主机上的一个特殊目录&#xff0c;可以供一个或多个容器使用。容器删除时&#xff0c;不会删除其挂载的数据卷&#xff0c;也不会存在类似的垃圾机制对容器存在的数据卷进行处理。 …

每日面经分享(Spring Boot: part2 DAO层)

1. Spring Boot DAO层的作用 a. 封装数据访问逻辑&#xff1a;DAO层的主要责任是封装与数据访问相关的逻辑。负责处理与数据库的交互&#xff0c;包括数据的增删改查等操作。通过将数据访问逻辑统一封装在DAO层中&#xff0c;可以提高代码的可维护性和可重用性。 b. 解耦业务逻…

【vue3学习笔记(二)】(第141-143节)初识setup;ref函数_处理基本类型;ref函数_处理对象类型

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 本篇内容对应课程第141-143节 课程 P141节 《初识setup》笔记 1、setup是所有组合式API“表演的舞台”&#xff0c;组件中所用到的所有数据、方法、监视数据、生命周期钩子等都需要配置在setup中。 2、setup的两种返回值&…

【Linux】socket套接字

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;IP地址和端口号pid和port的关系 &#x1f449;&#x1f3fb;TCP和UDP&#x1f449;&#x1f3fb;网络字节序&…

NineData与StarRocks商业化运营公司镜舟科技完成产品兼容认证

近日&#xff0c;镜舟科技与NineData完成产品兼容测试。在经过联合测试后&#xff0c;镜舟科技旗下产品与NineData云原生智能数据管理平台完全兼容&#xff0c;整体运行高效稳定。 镜舟科技致力于帮助中国企业构建卓越的数据分析系统&#xff0c;打造独具竞争力的“数据护城河”…

2-HDFS常用命令及上传下载流程

HDFS NameNode 安全模式(safemode) 当NameNode被重启的时候&#xff0c;自动进入安全模式 在安全模式中&#xff0c;NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后&#xff0c;更新fsimage文件 更新完成之后&#xff0c;NameNode会将fsimage文件中的元数据加…

STM32——超声测距HC_SR04记录

一、HC_SR04简述 HC-SR04超声波测距模块可提供 2cm-400cm的非接触式距离感测功能&#xff0c;测距精度可达高到 3mm&#xff1b;模块包括超声波发射器、接收器与控制电路。 基本工作原理&#xff1a; (1)采用IO 口TRIG 触发测距&#xff0c;给最少10us 的高电平信呈。 (2)模块…

一文教你轻松领取华为云优惠券

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人选择使用云服务来满足他们的需求。华为云作为全球领先的云服务提供商之一&#xff0c;为用户提供了丰富的产品和服务。为了帮助用户更好地体验华为云服务&#xff0c;本文将为大家详细介绍如何轻松领取华为云优惠券。…

Taskflow:限制最大并发度( Limit the Maximum Concurrency)

定义信号量Semaphore Taskflow提供了一个机制&#xff0c;tf::Semaphore&#xff0c;用于限制任务部分中的最大并发。您可以让任务在执行工作之前/之后获取/释放一个或多个信号量。一项任务可以获取和释放信号量&#xff0c;或者只是获取或只是释放它。tf::Semaphore对象以初始…

MySQL介绍

1 什么是Mysql MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用结构化查询语言&#xff08;SQL&#xff09;进行数据库管理。自上世纪90年代中期以来&#xff0c;MySQL凭借其易用性、稳定性和高效性能&#xff0c;赢得了广泛的用户群体…

政安晨:【Keras机器学习实践要点】(三)—— 编写组件与训练数据

目录 介绍 编写组件 训练模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 介绍 通过 Ker…

手写简易操作系统(十七)--编写键盘驱动

前情提要 上一节我们实现了锁与信号量&#xff0c;这一节我们就可以实现键盘驱动了&#xff0c;访问键盘输入的数据也属于临界区资源&#xff0c;所以需要锁的存在。 一、键盘简介 之前的 ps/2 键盘使用的是中断驱动的&#xff0c;在当时&#xff0c;按下键盘就会触发中断&a…

Abaqus周期性边界代表体单元Random Sphere RVE 3D (Mesh)插件

插件介绍 Random Sphere RVE 3D (Mesh) - AbyssFish 插件可在Abaqus生成三维具备周期性边界条件(Periodic Boundary Conditions, PBC)的随机球体骨料及骨料-水泥界面过渡区(Interfacial Transition Zone, ITZ)模型。即采用周期性代表性体积单元法(Periodic Representative Vol…

1.8 python 模块 time、random、string、hashlib、os、re、json

ython之模块 一、模块的介绍 &#xff08;1&#xff09;python模块&#xff0c;是一个python文件&#xff0c;以一个.py文件&#xff0c;包含了python对象定义和pyhton语句 &#xff08;2&#xff09;python对象定义和python语句 &#xff08;3&#xff09;模块让你能够有逻辑地…

Cookie 与 Session

目录 一、获取Cookie/Session 1、理解Cookie 2、理解Session 3、Cookie 和 Session 的区别 4、获取Cookie 4.1 传统获取Cookie 4.2 简洁获取Cookie 5、Session 存储和获取 5.1 Session存储 5.2 Session读取 5.3 简洁获取 Session 一、获取Cookie/Session 1、理解Co…

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件&#xff0c;要对其建立软链接&#xff0c;做法如下&#xff1a; ln就是link的意思&#xff0c;-s表示软链接&#xff0c;test.txt要建立软链接的文件名&#xff0c;后面跟上要建立的软链接文件名…

k8s1.28.8版本配置Alertmanager报警方式(邮件,企业微信)

文章目录 总结部署流程 Alertmanager 三大核心1. 分组告警2. 告警抑制3. 告警静默 报警过滤静默通知方案一&#xff1a;方案二&#xff1a; 抑制报警规则案例一 参考文档 自定义路由告警&#xff0c;分来自不同路由的告警&#xff0c;艾特不同的人员进行区分修改 alertmanager …

linux C:变量、运算符

linux C 文章目录 变量运算符 一、变量 [存储类型] 数据类型 标识符 值 标识符&#xff1a;由数字、字母、下划线组成的序列&#xff0c;不能以数字开头。 数据类型&#xff1a;基本数据类型构造类型 存储类型&#xff1a;auto static…

4月深圳振威新能源产业博览会丨千万订单采购对接会!

4月深圳振威新能源产业博览会丨千万订单采购对接会&#xff01; 目前&#xff0c;振威新能源海外招商团队已成功与俄罗斯、泰国多家组织机构建立合作联系&#xff01;已确定携多家知名企业到现场采购&#xff01; 电池与储能 同时&#xff0c;振威新能源团队也成功与泰国储能技…

【KingSCADA】播放语音

1.函数介绍 PlaySound(string strWaveFileName, int nMode);下面是官方帮助文档中的解释&#xff1a; 2.生成语音文件 3.使用脚本播放音频文件 将音频文件存放在工程目录下面&#xff0c;我存放在了…\Resources\文件夹下&#xff1a; 我简单的写了一个定时1分钟播放一次语…