OpenCasCade——给定B样条曲线上的一点,求出过该点的切向量或法向量

问题:

如果有这样的场景:已知一条B样条曲线,已知曲线上一个点,求过这个点的曲线的切线或法线,在OpenCasCade中如何解决?

局限性

实际上,上述求解是不存在的,或者说直接获得过这个点的曲线的法向或切向量的方法是没有的,原因之一可能是安全性考虑,比如所给点不在曲线上?虽然用户可能说我这个点就在曲线上,但是参数化的曲线可不管你怎么说。
在OpenCasCade中,要获得一条参数曲线的某个位置的法向或切向量,只能通过这个位置的参数u来实现。既然这样,那有没有什么办法可以先获得这个点的参数u,然后再将这个参数u作为自变量传递给曲线进行计算这个位置的法向或且想?

可行方法

OpenCasCade中有内置的功能是将某个点投射到曲线上,相关的类为

GeomAPI_ProjectPointOnCurve

实际上是找这个点到这条曲线上哪个点能获得最小距离或最大距离,能够获得投射点的坐标和其他变量,包括这个点的参数u。通过这个u就可以重新计算这个点的坐标(算是一种修正吧)和这个点的切向量。

实例

下图所示为一条分段Bezier曲线,白色点为各个控制点,需要在第三个控制点上画一条曲线的切线。虽然这个控制点一定在曲线上,但是参数型的曲线并不能确定某个点是否一定在曲线上或者有多大的误差。此时可以将该点投影到曲线上,获得曲线上最近的点和最远的点,如果添加一条判断语句,比如投影点与原点距离小于某个极小值,就可筛选出该点,同时可以获得该点对应的参数u。示意图如下所示:
过曲线上某点的切线
相关代码片段如下:

    AIS_ListOfInteractive aList;
    myAISContext->DisplayedObjects(aList);
    AIS_ListIteratorOfListOfInteractive aListIterator;
    for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
   
        myAISContext->Remove (aListIterator.Value(), Standard_False);
    }

    TColgp_Array1OfPnt Poles(1,9);
    Poles.SetValue(1, gp_Pnt(0,-10,0));
    Poles.SetValue(2, gp_Pnt(0,-10,5));
    Poles.SetValue(3, gp_Pnt(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值