w3c標(biāo)準(zhǔn)圖示:
evenodd
fillrule-evenodd.png
nonzero;
fillrule-nonzero.png
要判斷一個點是否在圖形內(nèi),需要從該點作任意方向的一條射線,然后檢測射線與圖形路徑的交點值,假設(shè)為x,x初始值為0。
對于evenodd,每相交一次,x+1,最后的結(jié)果如果x為奇數(shù)則該點在圖形內(nèi),如果為偶數(shù)則在圖形外。
對于nonzero,情況則復(fù)雜一些,每相交一次,x的值也會變化,不過這個變化和你的射線同路徑相交的方向有關(guān)。要知道路徑本身是一個向量(也就是有方向的線段),你畫的射線也有方向,則射線同路徑相交的方向一定會有兩種方向,從路徑左側(cè)相交和右側(cè)相交。你可以任意假設(shè)一個方向為正,那么另一個相交方向為負(fù),比如我假設(shè)左相交為正,那么右相交則為負(fù)。此時,計算x的方法是,正相交+1,負(fù)相交-1,看最后x的值,如果為0,則該點在圖形外,如果不為0則在圖形內(nèi)。
最后,不要去鉆相切的牛角尖,因為射線是任意的,如果有相切,那么換個方向再畫。
這是用我自己的方式理解的fill-rule屬性。