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年發表。貝塞爾曲線廣泛應用於...