1. 程式人生 > >svg畫五角星,關於fill-rule的理解

svg畫五角星,關於fill-rule的理解

先上程式碼
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="300px">
  <polygon points="100,0 160,180 10,60 190,60 40,180" style="fill:red;stroke:black;stroke-width:1;fill-rule:nonzero"/>
</svg>

畫出來是這樣的


把fill-rule改成evenodd後,是這樣的


先看看官方文件裡面fill-rule兩個屬性的解釋,

nonzero—這個規則通過從canvas上的某個點往任一方向繪製射線到無窮遠,然後檢查圖形的線段和射線相交的點,來確定“內部區域”。從

0開始計數,每次路徑線段是從左到右穿過射線就加一,從右到左的就減一。通過計算交叉點,如果結果是0,則這個點在路徑外邊,不然,就是在裡邊。


evenodd—這個規則通過從canvas上某個點往任一方向繪製射線到無窮遠,然後計算給定圖形上線段路徑和該射線交叉點的數量。如果這個數是奇數,那麼該點在圖形內部;如果是偶數,該點在圖形外部。


一看兩幅圖,你可能會有兩個疑問,這些線段的箭頭是什麼?兩組圖形的第三幅圖為什麼是一樣的?其實這些線段的方向是由我們給出的座標的順序決定的,points="100,0 160,180 10,60 190,60 40,180",起始點是最上方的點,然後是右下,最左邊,最右邊,再到左下。把這些點按順序連起來就變成了五角星。

先在圖上隨機取幾個點,藍色射線的起始點就是隨機的點,射線1,2,3,4穿過的圖形線段數分別是1,2,3,4,如圖


先看nozero時,怎麼判斷點是否在內部區域。射線1和圖形線段只有一個交點,為從左到右,所以結果是1,判定為內部區域;射線2有兩個交點,都是從左到右,結果是2,內部區域;射線3有三個交點,兩個從左到右,一個從右到左,結果是1,內部區域;射線4有四個交點,兩個從左到右,兩個從右到左,結果是0,所以是外部區域。

evenodd時,只判斷交點個數,所以1,3都是內部區域,2,4都是外部區域。

結果就很清楚啦,那兩組圖的第三個圖為什麼是一樣的,也一目瞭然啦,在圓環內的點,與圖形線段的交點有兩個,一左進右出,一右進左出,所以兩種判定方式下都是外部區域。

因為方向沒固定,所以從一個點可以作出無數條射線,那會不會出現不同射線有不同結果的情況呢?我嘗試去掉了一個角

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="300px">
  <polygon points="135,104 100,0 40,180 190,60 10,60 100,132" style="fill:red;stroke:black;stroke-width:1;fill-rule:evenodd;"/>
</svg>


結果是這樣的,我認為這裡右下角的線段其實應該算是兩條,畫圖時兩次經過了這個地方,所以應該不能算一條線段,而是兩條,所以按上面講的規則,還是沒錯。暫時想不到會產生不一樣結果射線的點。

學到這裡,仍存在兩個問題:

1、是否有某些點畫出來的射線會得到不同的結果,而最終的結果又是根據哪個?

2、簡單的圖形容易判斷,那複雜的圖形呢?怎麼才能直觀的理解這兩個規則?比如下圖:


以上內容皆為個人理解,若有錯誤,請指教。謝謝。

相關推薦

svg五角星關於fill-rule理解

先上程式碼<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300px" height="300px">   <polygon points="100,0 160,180 10,60

svgfill-rule屬性解析

fill-rule屬性規定了svg圖形的填充規則 fill-rule 有效值 nonzero / evenodd / inherit 預設值 nonzero 應用於 shape形狀類元素和文字內容類元素

色度訊號亮度訊號等概念的理解

畫素(pixel):  一個畫素通常被視為影象的最小的完整取樣 我們若把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成,這些小方點就是構成影像的最小單位“畫素”(Pixel)。這種最小的圖形的單元能在螢幕上顯示通常是單個的染色點。越高位的畫素,其擁有的色

android使用canvas位移旋轉繪製五角星

    為了提高自己的開發水平,就想系統地學習一下Android自定義控制元件。首先呢就要從Paint和canvas學起了,與本文主題相關的有關於canvas的畫線:                                                      

android中 mdpihdpixhdpixxhdpi檔案理解圖片理解

1, 我們在開發的時候,特別是剛開始入行的時候會有疑惑,為什麼那麼多資料夾放圖片,比如mdpi,hdpi,xhdpi,xxhdpi,從ui手裡拿到圖片我到底該放在哪呢? 今天就來分享一下,圖片應該放在哪,並分享一下圖片裡我理解的畫素點。  網上有很多描述這些檔案的文章,大家可

JNDI是什麽怎麽理解

其他應用 drp com min ons 作用 所有 director pro JNDI 是什麽 JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一,不少專家認為,沒有透徹理解JN

PHP矩形橢圓橢圓弧 餅狀圖

tro lips ade inpu 統計 起點 com eth func 1:畫矩形: imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $col ) imagere

Spring框架IOCDI概念理解

ram 方式 ins 商品 www auto 默認 use 當我 1.什麽是框架? 框架是一種重復使用的解決方案,針對某個軟件開發的問題提出的。 Spring框架,它是一個大型的包含很多重復使用的某個領域的解決方案。 Spring的理念:不要重復發明輪子。 2.S

vuex--mutationaction個人理解

通過 需要 更改 pat 流程 cnblogs 支持 操作 vue 通俗來講,vuex是設計出來核心業務是通信。 其中state為全局的數據源,支持多組件雙向綁定。 想要在任何地方更改state都需要通過commit store的mutation。 但是mutation只支

java算法面試題:設計一個快速排序。雙路快速排序簡單易於理解

面試題 != ava 思路 add bubuko 比較器 繼續 array package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Com

原生JS的地區二級聯動很好理解的邏輯

貴陽 江北區 getc width 臺灣省 mpat 泰安 漯河 廣東 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta

領域模型你真的理解的了嗎?

isp des iaas 用戶 tle 思考 管理系 關於 文章 領域模型,你真的理解的了嗎? 背景 UML比較難學,主要是其本身很復雜並且涉及到大量的概念名詞。領域模型就是其中之一,網絡上搜索到關於領域模型的知識應該是有兩種,一種是來源於最初的傳統軟件開發

叠代器生成器的理解

foreach val AC In one 理解 js對象 特性 false // for in 是js早期的特性,會將js對象的屬性及原型上可以遍歷的屬性都遍歷出來// forEach 是es5出現的// for of 是es6出現的 可以遍歷所有的可以叠代的對象 //一

ROC曲線是通過樣本點分類概率出的 例如某一個sample預測為1概率為0.6 預測為0概率0.4這樣出來此外如果曲線不是特別平滑的話,那麽很可能存在過擬合的情況

pro TE 直線 算法 false .net ear 明顯 ever ROC和AUC介紹以及如何計算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operati

HDU 1176(類似數字三角形的題很經典值得仔細理解的dp思維)

ron 接下來 開始 bre 就是 變形 style 的人 %d 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免費餡餅 Time Limit: 2000/1000 MS (Java/Others) Memo

看完你就理解什麽是數據的全量、增量、差異備份了

-a 在一起 image 所有 play raw class 完整 splay 在很遠很遠的地方,有一個帳房先生。 他每天要記很多很多的賬單。 老先生一生謹慎,為了保證賬本的安全, 便找來三個徒弟幫忙來對賬本做備份, 這樣即使賬本丟失了, 也可以用備份的賬本繼續使用。

簡單輪播

畫容( hallery.cn )0.12.0 版本中新增了一枚 輪播 物件,通過該物件我們可以超級便捷的製作輪播效果。 初識畫容,請看此文《簡單頁面開發神器——畫容》。 建立輪播物件 首先,新建一個 輪播物件,只需單擊: ———————————— 然後,進入該輪播物件的

GPUCUDAcuDNN的理解 GPUCUDAcuDNN的理解

原 GPU,CUDA,cuDNN的理解 2017年08月17日 20:29:37 AI之路 閱讀數:13155 &l

Android仿ios微信左劃條目刪除、置頂的實現程式碼簡潔更容易理解使用

<span style="font-family:Arial, Helvetica, sans-serif;"><span style="background-color: rgb(255, 255, 255);">歡迎大家</span></span

CG 領域專業術語(尺寸解析度)

一、 畫素 畫素是指由影象的小方格即所謂的畫素(pixel)組成的,這些小方塊都有一個明確的位置和被分配的色彩數值,而這些一小方格的顏色和位置就決定該影象所呈現出來的樣子。可以將畫素視為整個影象中不可分割的單位或者是元素,不可分割的意思是它不能夠再切割成更小單位抑或是元素,它是以一個