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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值