n階bezier曲線 通用公式說明和應用

2021-08-27 12:01:03 字數 3148 閱讀 1621

今天,孤陋寡聞數學不好的我,才知道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階貝塞爾曲線的公式 公式中用了組合數,大數組合數計算也有演算法 簡言之就是把 大數乘以大數除以大數 ...