NURBS备忘录(一)

本文介绍了NURBS曲线评估点的方法,通过优化避免无用计算,提高效率。包括使用静态变量加速,避免临时变量和无谓循环。同时,详细展示了findSpan的二分查找实现和basisFuns的计算细节,强调了对等于重节点情况的处理。
摘要由CSDN通过智能技术生成

这里只是想记录一下积累的NURBS的相关知识,所以不打算介绍基础知识。如果大家有兴趣,可以去找些书看。The NURBS Book是本好书,就是国内没有卖……

首先是求点的方法,按照书上的递归公式当然是可行的,笔者也试过。但是仔细一看会有很多无用的计算。下面的代码展示了一种别的方法:

 
pt3d::Point3d NURBSCurve::evalPoint(double u) const
{
    static std::vector<double> Nb;
    int spanIndex = findSpan(u);

    using namespace pt3d;
    basisFuns(u, spanIndex, Nb);
    Point3d p;
    double bottom = 0;
    for(int i = m_degree; i >= 0; --i)
    {
        p += m_ctrlPoints[spanIndex - m_degree + i] * Nb[i] * m_weights[spanIndex - m_degree + i];
        bottom += Nb[i] * m_weights[spanIndex - m_degree + i];
    }
    p /= bottom;
    return p;
}

可以看出,这里只计算了degree+1个顶点。值得注意的是Nb是个静态变量而不是临时变量,这样做的目的是为了提高速度,这里的方法都需要被多次调用,所以这些细小的优化也是很重要得。比如临时变量,无谓的循环等等是要尽量避免的。

findS

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值