今天,孤陋寡聞數學不好的我,才知道n階bezier 曲線是有乙個通用公式的。
我先把這個公式截圖放在這裡,留作備忘
感覺就這麼乙個公式,說的就比較明確了,用**實現起來也比較簡單。
稍微解釋一下:
上面的公式,說的是 2d 場景下, 每個點的插值座標,是怎麼算的。
首先得有乙個所有點集合的陣列。陣列裡包括 起點、控制點x n,終點。
比如有 3個控制點, 加上 起點終點,這個 陣列長度就是5, 這個bezier 曲線就叫做 4階貝塞爾曲線。
上面公司描述的是,在 整條曲線區間裡 [0,1] ,的 其中某乙個時刻, 曲線上的點的位置,是怎麼計算得來的。
網上找的那些實現的部落格,寫的爛七八糟,就是不把公式帖明白。**寫的可讀性差的可以。找來找去還是就這麼2張說的最明白。
放在這裡備忘
補充每次自己想寫 的時候 ,看到自己的部落格 也暈頭轉向,都得 重新梳理一遍 .中間用 c++ , c# 甚至是 bolo 各種語言都實現過一次. 這次用 lua 重新實現的,把**貼在這裡 ,方便自己將來做參考
local bezier2d = {}
bezier2d.__index = bezier2d
local function factorial(n)
local result = 1
for i = 1,n do
result = result * i
endreturn result
endlocal function pow(num,powernum)
local r = 1
for i = 1,powernum do
r = r * num
endreturn r
end--[[
ctrlpoints:[,...]
[1] is start point
[n] is end point
]]function bezier2d.new(ctrlpoints)
local o = setmetatable({},bezier2d)
assert(#ctrlpoints >= 2)
o:init(ctrlpoints)
return o
endfunction bezier2d:init(ctrlpoints)
self.ctrlpoints = ctrlpoints
self.from = self.ctrlpoints[1]
self.to = self.ctrlpoints[#self.ctrlpoints]
self.n = #self.ctrlpoints - 1
end--[[
t: [0,1]
]]function bezier2d:getpoint(t)
local x = self:getx(t)
local y = self:gety(t)
return
endfunction bezier2d:getx(t)
local r = 0
for i = 0,self.n do
local kbd = self:getkbd(i,self.n)
local pow1minust = pow(1 - t,self.n - i)
local powt = pow(t,i)
local temppoint = self.ctrlpoints[i + 1]
local value = kbd * pow1minust * powt * temppoint.x
r = r + value
endreturn r
endfunction bezier2d:gety(t)
local r = 0
for i = 0,self.n do
local kbd = self:getkbd(i,self.n)
local pow1minust = pow(1 - t,self.n - i)
local powt = pow(t,i)
local temppoint = self.ctrlpoints[i + 1]
local value = kbd * pow1minust * powt * temppoint.y
r = r + value
endreturn r
endfunction bezier2d:getkbd(i,n)
return factorial(n) / (factorial(i) * factorial(n - i))
end_g.bezier2d = bezier2d
_g.factorial = factorial
_g.pow = pow
測試用例:
local points = ,,,
}local bezier = bezier2d.new(points)
local duration = 1
local function getobj()
local charid = 2
local char = _g.charactermanagerins.characters[charid]
return char.heromodel.prefab
endveasync(function()
px.warning("done.")
end,function()
local elapsed = 0
while elapsed < duration do
local point = bezier:getpoint(elapsed / duration)
local go = getobj()
gameobjectsetposition(go,point.x , point.y, 0)
vesleep(0.02)
elapsed = elapsed + 0.02
endend)
Bezier(貝塞爾曲線通用規律演算法 DEMO)
之前也看過一些相關貝塞爾曲線的知識,但就是一直沒有實踐應用 一些數學比較牛x的,說了用2階,或是3階的貝塞爾就夠了,於是好奇,自己花了一些時間去研究 現在對曲線的繪製規律 演算法 大概的有了一些認識 感謝這位部落格的分離裡看到,在裡面看到了這麼一張圖 這是張貝塞爾n階的效果圖 用as3寫了乙個dem...
演算法 N階貝塞爾曲線程式設計
最近在研究捕魚的路徑點問題。上司要求路徑由幾個貝塞爾曲線的特徵點來生成魚的路徑。倒騰了一會 真沒想到自己寫出來了。也算是自己畢業後寫的第乙個有關遊戲的演算法。寫這篇日誌做乙個筆記。這裡只放出關鍵 首先它肯定需要乙個遞迴呼叫,因為每個比例都要生成乙個點,然而,每次計算都要從n個點計算為n 1個點,最後...
N階貝塞爾曲線繪製 C C
貝塞爾是很經典的東西,輪子應該有很多的。求n階貝塞爾曲線用到了 德卡斯特里奧演算法 de casteljau s algorithm 要完成的功能是根據起點,終點和控制點,繪製n階貝塞爾曲線 首先看n階貝塞爾曲線的公式 公式中用了組合數,大數組合數計算也有演算法 簡言之就是把 大數乘以大數除以大數 ...