首页 > 其他分享 >Open CASCADE学习|GeomFill_Frenet

Open CASCADE学习|GeomFill_Frenet

时间:2024-03-31 14:00:39浏览次数:21  
标签:Frenet GeomFill const gp Standard CASCADE Vec include Open

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

标签:Frenet,GeomFill,const,gp,Standard,CASCADE,Vec,include,Open
From: https://blog.csdn.net/T20151470/article/details/137197284

相关文章

  • Python之Opencv进阶教程(2):统计图片灰度级别的像素数量
    1、什么是灰度像素数量在OpenCV中,可以使用**cv2.calcHist()**函数来计算图像的直方图。直方图是一种图形统计表,用于表示图像中每个灰度级别(或颜色通道)的像素数量或密度分布。以下是一个示例代码,演示了如何使用OpenCV计算和绘制图像的直方图:2、代码importcv2ascvimpor......
  • Python之Opencv进阶教程(1):图片模糊
    1、Opencv提供了多种模糊图片的方法加载原始未经模糊处理的图片importcv2ascvimg=cv.imread('../Resources/Photos/girl.jpg')cv.imshow('girl',img)1.1平均值关键代码#Averaging平均值a......
  • Python之Opencv教程(5):识别视频中的人脸
    1、识别效果2、识别代码importcv2ascvdefface_detect_demo(img):#将图片灰度gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#加载特征数据face_detector=cv.CascadeClassifier("data//haarcascade_frontalface_alt.xml")fac......
  • [转帖]openEuler 22.03 LTS 内核基础页大小配置选项讨论
    https://gitee.com/openeuler/kernel/issues/I4HDHZ 简介页表在操作系统中作为最基础的内存分配结构,ARM64支持4K、16K、64K不同大小的页表。当前页表大小只支持静态配置,不支持动态修改。OS一旦选定一个页表大小,为了兼容性考虑,在该版本生命周期内,一般不会再修改。openEul......
  • Open CASCADE学习|自定义圆柱螺旋线
    由《OpenCASCADEBRepFormat》中可知,圆柱面的参数方程为:通过控制圆柱面的参数空间[u,v]便可以得到任意圆柱螺旋线。本例先根据参数生成圆柱面上的点,再把点拟合成空间曲线,从而得到螺旋线。#include<Geom_CylindricalSurface.hxx>#include<gp_Ax3.hxx>#include<GeomAP......
  • ubuntu编译与安装 OpenSSL-1.0.0
    apt-getpurgeopensslrm-rf/etc/ssl#删除配置文件编译与安装OpenSSLprefix是安装目录,openssldir是配置文件目录,另外建议安装两次,shared作用是生成动态连接库。(需要同时指定prefix与openssldir,否则可能会因为找不到文件而报错)wgetftp://ftp.openssl.org/source/op......
  • 使用OpenEuler x86_64 实现Bouncycastle SM4加解密功能
    使用OpenEulerx86_64实现BouncycastleSM4加解密功能一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文......
  • 使用OpenEuler x86_64 实现Bouncycastle SM3哈希功能
    使用OpenEulerx86_64实现BouncycastleSM3哈希功能一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文件......
  • Python之Opencv教程(2):图像边缘检测
    1、什么是边缘检测OpenCV中的边缘检测是一种常见的图像处理技术,用于检测图像中物体边缘的位置。常用的边缘检测算法包括Sobel算子、Scharr算子、Laplacian算子和Canny边缘检测算法等。下面将介绍使用OpenCV实现这些边缘检测算法的方法。2、边缘检测的作用边缘检测是图像......
  • 使用OpenEuler x86_64 实现Bouncycastle SM2加解密
    使用OpenEulerx86_64实现BouncycastleSM2加解密一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文件用......