最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【Aegisub】真正正確的ASSDraw3填充規(guī)則

2021-07-26 21:18 作者:多華宮與火火里  | 我要投稿

可能絕大部分的人并不清楚ASSDraw3繪圖的填充規(guī)則,最多也就知道所謂的“反向掏空”了。但是實際上出現(xiàn)相反的路徑也不一定會有掏空。很多人不知道自交圖形的填充情況,也不知道帶有同向包含圖形的填充情況。因為我沒見過有人正確地講過ASSDraw3的填充規(guī)則,所以我還是專門寫一篇專欄來介紹一下。

ASSDraw3的填充規(guī)則實際上和svg的non-zero規(guī)則完全一樣,知道svg的人可能會懂non-zero規(guī)則,但是如果不知道也沒關(guān)系,因為我接下來就是要講non-zero規(guī)則

現(xiàn)在我舉一些各自有特點、有代表的例子。

首先,對于填充效果來說,未封閉的路徑肯定是按照封閉路徑來填充的,因為不然的話,未封閉的路徑得填充成什么樣?所以,如圖1.01和圖1.02,一個是未封閉的一個是封閉的,但填充結(jié)果一樣。

圖1.01

圖1.01:m 0 0 l 28 1 l 26 18 l -2 17? ? ? ? ? ? ? ? ? ? ? ?? ? 圖1.02:m 0 0 l 28 1 l 26 18 l -2 17 l 0 0?

圖1.02

圖1.01和圖1.02的路徑本身是有區(qū)別的,圖1.01和圖1.02的路徑可以畫成圖1.03和圖1.04這樣:

圖1.03

圖1.03就對應(yīng)圖1.01的路徑,圖1.04就對應(yīng)圖1.02的路徑

圖1.04

所以第一點就是所有未封閉路徑的繪圖都會按照封閉路徑的繪圖來填充

好,那么接下來看圖1.05,講一下為什么會填充成這樣:

圖1.05

為什么圖1.05會出現(xiàn)掏空呢?現(xiàn)在先將圖1.05的路徑畫出來(未封閉的繪圖現(xiàn)在就一律畫成封閉的了),并且隨便作一條水平線L,咱們來觀察一下處于這一條水平線位置的填充情況,如圖1.06

圖1.06

現(xiàn)在很清楚的看到,此時狀況是繪圖由兩個m構(gòu)成,第一個m路徑順時針第二個m逆時針,然后在水平線L這個位置,點A到點B之間是填充的,點B到點C之間是未填充的,點C與點D之間是填充的,那么為什么處于水平線L這個位置的填充情況是這樣的?就是因為繪圖填充規(guī)則是non-zero規(guī)則:要知道水平線L處的填充情況,就讓水平線L與繪圖求交點(遍歷每條路徑即可求得交點),然后此時水平線和繪圖有4個交點,將交點按照x從小到大的順序排序,得到4個點A、B、C、D。然后開始交點計數(shù)(計數(shù)當(dāng)然從0開始計了),第一個交點A,A所處路徑向上(當(dāng)然從坐標(biāo)系來看是向下的,因為y的方向是反的,但這不重要),向上則計數(shù)變量cnt就加1,所以cnt=cnt+1=1,那么non-zero規(guī)則就來了,cnt只要不為0則該交點到下一個交點之間就是填充的!所以,點A到點B之間填充。那么繼續(xù),現(xiàn)在到B點了,B點處的路徑方向向下,則cnt減1,即cnt=cnt-1=0,欸,B點處的cnt等于0了,那么由于是non-zero規(guī)則,所以只要計數(shù)變量cnt只要為0,則該交點到下一個交點之間就不填充!所以,點B到點C之間不填充。那么現(xiàn)在繼續(xù)到了C點,此時C點所處路徑方向向上,cnt加1即cnt=cnt+1=1,所以cnt≠0,所以點C到點D之間是填充的。這樣,我們就用non-zero(非零)規(guī)則分析出了在水平線L這個位置的填充情況,當(dāng)然顯然,僅僅是這一條水平線不足以代表整個繪圖的填充情況,而是僅僅代表這個水平線所處的位置的填充情況!

所以現(xiàn)在再分析一下另一條水平線L處的填充情況,如圖1.07

圖1.07

好,直接分析。現(xiàn)在水平線L和繪圖有兩個交點,將交點按照x從小到大排序,得到點A和點B然后在A點處的路徑方向向上,cnt=cnt+1=0+1=1,則點A到下一個交點B之間填充。當(dāng)然B處的路徑向下,cnt=cnt-1=1-1=0,所以B的右邊不填充?,F(xiàn)在顯然,在這一條水平線L所處位置的填充情況就和剛剛不一樣了。所以,現(xiàn)在很明白了,一個繪圖整體的填充結(jié)果就可以由從上到下的水平掃描線得到!咱們現(xiàn)在得到了兩條水平線所處位置的填充情況,那整個繪圖的填充情況當(dāng)然就可以由從上到下的一條條掃描線得到。

那么知道了non-zero規(guī)則(非零規(guī)則)以后,就可以看看自交圖形是怎么填充的了,比如下圖1.08是一個有自交的繪圖

圖1.08

圖1.08的繪圖代碼是:m 0 0 l 28 1 l 28 22 l -2 23 l 0 0 m 20 4 l 7 4 l 21 18 l 5 17?

顯然該繪圖的第二個m的路徑?jīng)]有封閉,但是這無所謂,因為咱們在填充的時候會直接當(dāng)做封閉路徑來進(jìn)行填充。那么現(xiàn)在就標(biāo)記好路徑信息,然后來看看如圖1.09中水平線L所處位置的填充情況吧

圖1.09

現(xiàn)在水平線L和繪圖求交點,得到交點按x從小到大排序,有交點A、B、C、D。計數(shù)變量cnt初始值等于0,然后開始到第一個交點A,A所在路徑是P4P1,該路徑方向向上,所以計數(shù)變量cnt=cnt+1=0+1=1,非零啦非零啦,所以A到下一個交點B之間填充。繼續(xù),到B了,點B所處路徑P8P5同樣是方向向上的,所以,cnt=cnt+1=1+1=2,非零啦非零啦,所以B到下一個交點C之間是填充的。繼續(xù),到了點C了,點C所處的路徑P6P7的方向向下,所以計數(shù)變量cnt=cnt-1=2-1=1,非零啦非零啦,所以C到下一個交點D之間是填充的。這樣,這一條水平線L所處位置的填充情況就分析清楚了。

那么,咱們再來看看另一條水平線L它的所處位置的填充情況是什么樣的,如圖1.10

圖1.10

現(xiàn)在水平線L和繪圖求得4個交點A、B、C、D。首先,A點處的路徑P4P1方向向上,計數(shù)變量cnt=cnt+1=1,所以cnt非零,所以A到下一個交點B之間填充。然后B點處路徑P6P7方向向下,計數(shù)變量cnt=cnt-1=1-1=0,所以cnt為零,所以B點到下一個交點C之間不填充。然后C點的路徑P8P5方向向上,cnt=cnt+1,所以cnt非零,所以C到下一個交點D之間填充。這樣,我們就分析出了現(xiàn)在這一條水平線位置的填充情況,那么整個繪圖的填充情況就還是像前面說的,用從上到下的水平掃描線就可以得到了。可見,對于有自交的圖形來說,它的填充結(jié)果咱們用non-zero非零規(guī)則,就能迅速判斷,因為什么,就是因為ASSDraw3的填充規(guī)則實際上和svg的non-zero規(guī)則完全一樣啊。

再來看最后一個例子,一起分析一下圖1.11的填充情況

圖1.11

圖1.11的繪圖代碼為:m 0 0 l 28 1 l 28 22 l -2 23 l 0 0 m 4 3 l 21 4 l 24 18 l 2 20 m 17 7 l 7 8 l 7 16 l 19 16?
還是一樣的,未封閉的繪圖一律“自動”封閉了。然后畫出路徑信息,咱們來看看如圖1.12的水平線L所處的位置的填充情況

圖1.12

顯然,這樣很清楚,該繪圖總共有3個m構(gòu)成。第一個m的路徑方向是順時針的,第二個m的路徑方向也是順時針的,第三個m的路徑方向是逆時針的。現(xiàn)在水平線L和繪圖求交點,并將求得的交點按x的升序排序,得到6個交點A、B、C、D、E、F。首先,點A處路徑方向向上,所以cnt=cnt+1=1,所以AB之間填充。然后B點時路徑方向向上,所以cnt=cnt+1=2,所以BC之間填充。然后C處路徑方向向下,所以cnt=cnt-1=1,所以CD之間填充。然后D點處的路徑方向向上,所以cnt=cnt+1=2,所以DE之間填充。然后E時的路徑方向向下,所以cnt=cnt-1=1,所以EF之間填充。這樣,這一條水平線所處位置的填充情況就迅速地分析出來了。顯然,這個繪圖里的m有路徑相反的情況,但是,卻沒有出現(xiàn)掏空,這就如本文一開始所說,出現(xiàn)相反的路徑也不一定會有掏空。所以ASSDraw3繪圖的填充情況并不是簡單的一句“反向掏空”就能完全概況的。因為,因為啊,ASSDraw3的填充規(guī)則就和svg的non-zero規(guī)則完全一樣呀

那么非零填充規(guī)則應(yīng)該大概講清楚了,下面畫幾個圖,大家自己練習(xí)一下,想想這些圖會填充成什么樣。

根據(jù)所畫路徑判斷繪圖填充情況:

題目1,如圖1.13

圖1.13

題目2,如圖1.14

圖1.14

最后還是總結(jié)一下,non-zero規(guī)則:一、封閉所有未封閉的繪圖。二、從上到下用水平線掃描。三、求水平線和繪圖的交點并根據(jù)交點處的路徑方向計數(shù),計數(shù)變量非零則填充,為0則不填充。

【Aegisub】真正正確的ASSDraw3填充規(guī)則的評論 (共 條)

分享到微博請遵守國家法律
封丘县| 正阳县| 图们市| 千阳县| 辽阳县| 田林县| 合水县| 务川| 乌拉特后旗| 合川市| 承德县| 赣州市| 工布江达县| 贵港市| 建阳市| 烟台市| 广东省| 克什克腾旗| 景谷| 南平市| 垦利县| 兴城市| 阳曲县| 祥云县| 霞浦县| 南皮县| 石门县| 嵊州市| 松桃| 新宁县| 奉贤区| 沙田区| 巫山县| 日喀则市| 潜江市| 南华县| 肃宁县| 海兴县| 玉田县| 诸城市| 德格县|