U3D 無限階貝塞爾曲線

2021-10-05 19:29:22 字數 3841 閱讀 1633

local bezier = {}

--【無限階貝塞爾曲線】

--@params t 整條線上對應的百分比位置

--@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.getpascal********(count)

local fs = {}

for i = 1,count do

local f = bezier.getformula(vecs[i],rank,i,pts[i],t)

table.insert(fs,f)

endfor i = 1,#fs do

ret = ret + fs[i].caclu()

endreturn 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

endreturn n

endfunction 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

endreturn ret

endfunction bezier.getpascal********(n)

local ret = {}

local t = {}

for i = 1,n do

t[i] = {}

for j = 1,i do

if j == 1 or j == i then

t[i][j] = 1

else

t[i][j] = t[i - 1][j - 1] + t[i - 1][j]

endend

endfor i = 1,n do

table.insert(ret,t[n][i])

endt = nil

return ret

end------------------------測試函式------------------------

function bezier.test()

local go = gameobject()

go.name = "測試點"

go.transform.position = vector3.zero

local go1 = gameobject()

go1.name = "測試點1"

go1.transform.position = vector3(-17.4,0,0)

go1.transform:setparent(go.transform)

local go2 = gameobject()

go2.name = "測試點2"

go2.transform.position = vector3(-9.52,0,-3.84)

go2.transform:setparent(go.transform)

local go3 = gameobject()

go3.name = "測試點3"

go3.transform.position = vector3(-2.88,0,5.94)

go3.transform:setparent(go.transform)

local go4 = gameobject()

go4.name = "測試點4"

go4.transform.position = vector3(1.7,0,0)

go4.transform:setparent(go.transform)

local go5 = gameobject()

go5.name = "測試點5"

go5.transform.position = vector3(9.95,0,-4.91)

go5.transform:setparent(go.transform)

local go6 = gameobject()

go6.name = "測試點6"

go6.transform.position = vector3(15.38,0,5.46)

go6.transform:setparent(go.transform)

local linecount = 20

go:addcomponent(typeof(unityengine.linerenderer))

local lr = go:getcomponent("linerenderer")

lr.positioncount = linecount + 1

for i = 0,linecount do

lr:setposition(i,bezier.beziercurve(i / linecount,go1.transform.position,

go2.transform.position,

go3.transform.position,

go4.transform.position,

go5.transform.position,

go6.transform.position))

endendreturn bezier

//n階貝塞爾

public class bezier

for (int i = 0; i < fs.count; i++)

return ret;

}public static vector3 beziercurve(float t, params vector3 vecs)

for (int i = 0; i < fs.count; i++)

return ret;

}public static listcaclupascal********(int n)

else}}

for (int i = 0; i < n; i++)

return ret;

}public class formula

public float exponentiation(float num, int power)

for (int i = 0; i < power; i++)

return n;

}public vector3 caclu()

}}

演算法 N階貝塞爾曲線程式設計

最近在研究捕魚的路徑點問題。上司要求路徑由幾個貝塞爾曲線的特徵點來生成魚的路徑。倒騰了一會 真沒想到自己寫出來了。也算是自己畢業後寫的第乙個有關遊戲的演算法。寫這篇日誌做乙個筆記。這裡只放出關鍵 首先它肯定需要乙個遞迴呼叫,因為每個比例都要生成乙個點,然而,每次計算都要從n個點計算為n 1個點,最後...

N階貝塞爾曲線繪製 C C

貝塞爾是很經典的東西,輪子應該有很多的。求n階貝塞爾曲線用到了 德卡斯特里奧演算法 de casteljau s algorithm 要完成的功能是根據起點,終點和控制點,繪製n階貝塞爾曲線 首先看n階貝塞爾曲線的公式 公式中用了組合數,大數組合數計算也有演算法 簡言之就是把 大數乘以大數除以大數 ...

Python繪製三階貝塞爾曲線

作者本科畢業設計是做機械人軌跡跟蹤控制,軌跡由函式曲線來描述,本文選取三階貝塞爾曲線為代表進行講解,並展示部分基於python tkinter的實現 首先簡單了解一下什麼是貝塞爾曲線 余弦函式曲線我就不多說了哈!貝塞爾曲線又稱貝茲曲線,是法國工程師皮埃爾.貝塞爾於1962年發表。貝塞爾曲線廣泛應用於...