【Aegisub】拆分、分割貝塞爾曲線簡(jiǎn)單介紹

????????簡(jiǎn)單地水一下,簡(jiǎn)單介紹一下貝塞爾曲線怎么分割、把一條n階貝塞爾曲線拆成兩條n階貝塞爾曲線。如圖1.01中,左邊是一條6階貝塞爾曲線、它的控制多邊形的頂點(diǎn)是00、01、02、03、04、05、06這幾個(gè)點(diǎn),然后假設(shè)在 t (t∈[0,1]) 處將其拆分成兩條6階貝塞爾曲線,然后就慢慢地算啊算,最后就得到了右邊的兩條6階貝塞爾曲線

細(xì)分出來的第一條6階貝塞爾曲線的控制多邊形頂點(diǎn)是00、10、20、30、40、50、60,細(xì)分出來的第二條6階貝塞爾曲線的控制多邊形頂點(diǎn)是60、51、42、33、24、15、06
????????拆分n階貝塞爾曲線的算法非常簡(jiǎn)單,直接利用de Casteljau算法即可
????????如圖1.02,剛剛最開始的曲線的控制多邊形頂點(diǎn)是下圖的第一列,而分割以后,得到的第一條曲線的控制多邊形的頂點(diǎn)就是紅色的這一邊、第二條曲線的控制多邊形的頂點(diǎn)就是藍(lán)色的這一邊,所以只需要用第一列一點(diǎn)點(diǎn)地加、加出一列列的即可得到最后需要的這兩條邊

假設(shè)要在 t?處將曲線拆分為兩條曲線,則根據(jù)第一列可得第二列,00乘以(1-t)加上01乘以t就能得到10(即00點(diǎn)的x乘以(1-t)加上01點(diǎn)的x乘以t就得到了10點(diǎn)的x,然后10點(diǎn)的y同理可得),然后01點(diǎn)來乘以(1-t)加上02點(diǎn)來乘以t就能得到11點(diǎn)了。也就是說,為了得到第二列,需要遍歷第一列的點(diǎn)(for i=1,n-1 do),這個(gè)點(diǎn)來乘以(1-t)加上這一列的下一個(gè)點(diǎn)來乘以t,就得到了下一列的相應(yīng)的點(diǎn)。比如n階貝塞爾曲線的控制多邊形頂點(diǎn)的x坐標(biāo)數(shù)值裝在表x里、y坐標(biāo)裝在y里,那么你要得到第二列就可以是這樣的:

這樣就得到了第二列的點(diǎn)(每個(gè)點(diǎn)的x和y都有了,list_x和list_y),然后第二列也就可以以同樣的方式加出第三列,比如10乘以(1-t)加上11乘以t就得到了20,當(dāng)最后得到這些所有列的時(shí)候,就有了兩邊咱們需要的東西了。所以從一列加得下一列需要一個(gè)for循環(huán),所以要得到所有的列就要兩個(gè)for循環(huán),這很簡(jiǎn)單吧,for里面一個(gè)for而已,也就是:
for i=1,n-1 do
????for i2=1,n-i do
????????巴拉巴拉劈里啪啦
????end
end
(總共有n列,但是因?yàn)榈谝涣幸呀?jīng)有了,所以還需要加出n-1列,所以外層循環(huán)是for i=1,n-1 )
那么其實(shí)要得到最后的兩邊(即圖1.02中的紅色邊和藍(lán)色邊)也很容易嘛,你算出來一列、這一列的第一個(gè)點(diǎn)就是紅色需要的、這一列的最后一個(gè)點(diǎn)就是藍(lán)色需要的。所以如果你不在意原本的曲線的x、y表改變的話,代碼就可以像圖1.03這么寫:

其中f指的是first、s指的second,所以f_x裝的是拆分出來的第一條曲線的控制多邊形頂點(diǎn)的x,然后當(dāng)然第二條曲線的控制多邊形頂點(diǎn)直接這么用就會(huì)是反過來的(曲線的方向反了,因?yàn)樘砑拥臅r(shí)候控制多邊形的頂點(diǎn)順序反過來了),比如本來要得到的控制多邊形頂點(diǎn)是60、51、42、33、24、15、06,但是現(xiàn)在這么添加的話,second里面就是06、15、24、33、42、51、60了,那么這樣的話曲線方向就和60、51、42、33、24、15、06的相反了,所以如果你想兩條細(xì)分出來的曲線的方向是舒暢的話,就可以把得到的s_x表和s_y表給反轉(zhuǎn)一下即可
????????當(dāng)然如果你不想分割的時(shí)候改變?cè)瓉淼膞表和y表(即記錄原本曲線的控制多邊形頂點(diǎn)坐標(biāo)的兩個(gè)表)的話,也可以比如這么寫:

所以知道了n階貝塞爾曲線可以拆分為兩條n階貝塞爾曲線,那么當(dāng)然想在t處拆分一條三階貝塞爾曲線就一樣的簡(jiǎn)單了。還有,既然可以在t處拆分曲線,那么你就可以得到一條曲線的子曲線(subcurve)了不是嗎?也就是說,你可以得到比如在 t1 到 t2 這一段的曲線,如圖1.04和圖1.05


顯然這一段就是從?t1到t2 的曲線的子曲線了
????????其它代碼啥的就在視頻里講了