SVG坐標系統及圖形變換

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/09/08/7493364.html
-Advertisement-
Play Games

[1]坐標定位 [2]四個坐標系 [3]圖形變換 [4]居中變換 ...


前面的話

  前面介紹過SVG視野後,本文將開始介紹SVG坐標系統及圖形變換

 

坐標定位

  對於所有元素,SVG使用的坐標系統或者說網格系統,和Canvas用的差不多(所有電腦繪圖都差不多)。這種坐標系統是:以頁面的左上角為(0,0)坐標點,坐標以像素為單位,x軸正方向是向右,y軸正方向是向下

  定義一個矩形,即從左上角開始,向右延展100px,向下延展100px,形成一個100*100大的矩形

<rect x="0" y="0" width="100" height="100" />

 

四個坐標系

  SVG中的四個坐標系包括用戶坐標系、自身坐標系、前驅坐標系和參考坐標系。其中,用戶坐標系和自身坐標系是客觀的坐標系,而前驅坐標系和參考坐標系是相對的坐標系

【用戶坐標系】

  SVG的世界是無窮大的,世界裡面的坐標系就是用戶坐標系

  viewBox的設置就是觀察用戶坐標系的哪個區域。比如設置viewBox = "0 0 200 150",即觀察用戶坐標系裡的這個區域


  用戶坐標系是最原始的坐標系,其他的坐標系都是基於用戶坐標系產生的。因此,用戶坐標系也被稱為原始坐標系

【自身坐標系】

  自身坐標系是每個SVG圖形或圖形分組與生俱來的坐標系

  比如一個矩形設置為<rect x="0" y="0" width="100" height="100"/>,其位置和尺寸的定義都是基於其自身坐標系來描述的

【前驅坐標系】

  前驅坐標系即該元素的父元素的坐標系

  如下所示,矩形rect的父元素是SVG元素,即其前驅坐標系是用戶坐標系

<svg version="1.1" width="300" height="70" xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="100" height="50"/>
</svg> 

坐標變換

  所謂坐標變換,指前驅坐標系經過元素的變換後,得到元素的自身坐標系

  如下所示,加入transform屬性之後,rect元素就是相對於其前驅坐標系發生了坐標變換,得到了自身坐標系

【參考坐標系】

  使用其他坐標系來觀察自身元素坐標位置時使用

  如下所示,rect元素定義的坐標是(0,0)。如果以用戶坐標系作為參考坐標系,則rect元素在參考坐標系中的坐標是(50,50)

 

圖形變換

  在SVG中,坐標變換是對一個坐標繫到另一個坐標系的變換的描述

  在2D平面上,一般採用線性變換來滿足變換的需求。SVG中的線性變換使用transform屬性來完成

  SVG中的transform屬性與CSS3中的transform樣式裡面的一些基本的變換類型是一樣的,包括:位移translate, 旋轉rotate, 縮放scale, 斜切skew以及直接矩陣matrix。但只局限於2D層面的變換。SVG似乎只支持二維變換,且類似translateXrotateX也都是不支持的

【平移】

  translate()變形方法把元素移動一段距離,可以根據相應的屬性定位它

<rect x="0" y="0" width="10" height="10" transform="translate(30,40)" />

  該示例將呈現一個矩形,移到點(30,40),而不是出現在點(0,0)

  [註意]如果沒有指定第二個值,它預設被賦值0

【旋轉】

  使用rotate()變形旋轉一個元素

<rect x="20" y="20" width="20" height="20" transform="rotate(45)" />

  該示例顯示了一個方形,旋轉了45度。rotate()的值是用角度數指定的

【縮放】

  scale()變形改變了元素的尺寸。它需要兩個數字,作為比率計算如何縮放。0.5表示收縮到50%。如果第二個數字被忽略了,它預設等於第一個值

<rect x="20" y="20" width="20" height="20" transform="scale(0.5)" />

【斜切】

  在前面的一些變換中,例如位移、縮放之類是不支持translateXscaleX這種CSS常見用法的,但是這裡的skew卻有點不同:不支持skew(x[, y])這種語法,而只能是skewX或者skewY

  利用一個矩形製作一個斜菱形。可用skewX()變形和skewY()變形。每個需要一角度以確定元素斜切到多遠

<rect x="20" y="20" width="20" height="20" transform="skewX(45)" />

【matrix()】

  所有上面的變形可以表達為一個2x3的變形矩陣。組合一些變形,可以直接用matrix(a, b, c, d, e, f)變形設置結果矩陣,利用下麵的矩陣,它把來自上一個坐標系統的坐標映射到新的坐標系統:

【變換列表】

  線性變換列表表示為一系列的變換,結果為變換的矩陣的乘積。要特別註意的是,後面的變換要乘在前面

 

居中變換

  像縮放、斜切這些SVG變換,想要如CSS transform-origin:50% 50%一樣的中心點變換效果,下麵有兩個思路可供參考

【原始中心位置位於SVG左上角】

  拿45度旋轉舉例,可以把元素預設就放在中心點和SVG左上角重合的位置上

<rect x="-100" y="-50"  width="200" height="100"/>

【viewBox】

  可以把元素預設掛在左上角,然後,通過設置viewBox,讓元素呈現的位置並不是真正的左上角,例如應用viewBox='-140 -105 280 210'

  此時,只需要讓元素旋轉就可以了,無需額外的做translate位移

  歡迎交流 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用 js 畫工作日曆的時候,需要用 js 計算指定月份一共有多少天 在網上找了些方法,都比較繁瑣,後來靈機一動,想到一個偷懶的辦法,分享一下 一、原理分析 要想得到某月有多少天,只需要獲取到當月最後一天的日期就行了 圍繞這一思路,靈活調用 setMonth(),getMonth(),setDate( ...
  • 學習JavaScript肯定是會遇到DOM操作,那麼什麼是DOM?它又是幹嘛用的?這篇文章為你揭曉答案。 DOM是document object model的縮寫,簡稱文檔對象模型。 簡單的說DOM是一套對文檔的內容進行抽象和概念化的方法。我們可以把HTML文檔模型化,當作對象來處理。 基本概念: ...
  • 現象:angular Cannot find module 'angular-in-memory-web-api'報錯找不動“angular-in-memory-web-api”模塊 解決:1、控制台運行 npm install angular-in-memory-web-api --save2、重 ...
  • 用途 遍歷一個jQuery對象,為每個匹配的元素執行一個函數。 語法 .each(function) 參數 function:類型為Function(Integer index,Element element),每個匹配的元素要執行的函數 可以通過讓回調函數返回false來終止迭代。 返回值 返回調 ...
  • 用途 jQuery.trim()函數用於刪除指定字元串開頭和結尾的空格。 $.trim()函數將刪除指定字元串開頭和結尾的所有的換行符、空格,以及製表符。 語法 jQuery.trim(str) 參數 str:要去除前後空格的字元串 返回值 jQuery.trim()方法返回去除了前後空格的字元串 ...
  • substring 方法用於提取字元串中介於兩個指定下標之間的字元 substring(start,end) 開始和結束的位置,從零開始的索引 返回值是一個新的字元串,該字元串值包含 stringObject 的一個子字元串 substring 方法返回的子串包括 start 處的字元,但不包括 e ...
  • 1.DOM內部插入append()與appendTo() 動態創建的元素是不夠的,它只是臨時存放在記憶體中,最終我們需要放到頁面文檔並呈現出來。那麼問題來了,怎麼放到文檔上? 這裡就涉及到一個位置關係,常見的就是把這個新創建的元素,當作頁面某一個元素的子元素放到其內部。針對這樣的處理,jQuery就定 ...
  • 近日壓力山大,找找樂子,看有沒有好的東西可以研究研究,剛好看到我的螞蟻森林居然可以種樹了,很好奇,難道馬雲真會種樹? 二話不說,利用本人專業所學(遙感專業,有木有同行??),來監測監測那些樹木長得如何了?是不是真有,二話不說,直接上圖!! 註意,這裡是螞蟻森林種植的大概範圍,我從高德地圖查詢到的,內 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...