U3D_无限阶贝塞尔曲线

 Lua版

local Bezier = {}

--【无限阶贝塞尔曲线】
--@params t    整条线上对应的百分比位置{0-1}
--@params node 起点,控制点1,控制点2,控制点3......,结束点
--@return ret  返回对应的点/值
function Bezier.BezierCurve(t, node)
    local vecs  = node
    local count = #vecs
    local rank  = count - 1
    local ret   = Vector3.zero
    local pts   = Bezier.GetPascalTriangle(count)
    local fs    = {}

    for i = 1,count do
        local f = Bezier.GetFormula(vecs[i],rank,i,pts[i],t)
        table.insert(fs,f)
    end
    for i = 1,#fs do
        ret = ret + fs[i].Caclu()
    end
    return ret
end

-------------------------Private---------------------------------
function Bezier.Exponentiation(num,power)
    local n = 1
    if power == 0 then return n end
    for i = 1,power do
        n = n * num
    end
    return n
end

function Bezier.GetFormula(point,rank,index,ptValue,t)
    local ret   = {}
    ret.point   = point
    ret.rank    = rank
    ret.index   = index - 1
    ret.ptValue = ptValue
    ret.t       = t
    ret.Caclu   = function()
        local t1 = Bezier.Exponentiation((1 - ret.t),(ret.rank - ret.index))
        local t2 = Bezier.Exponentiation(ret.t,ret.index)
        return ret.point * t1 * t2 * ret.ptValue
    end
    return ret
end

function Bezier.GetPascalTriangle(n)
    local ret = {}
    local t = {}
    for i = 1,n
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值