Canvas學習:繪製箭頭 主標籤

2021-02-18 W3cplus

在這篇文章中主要來聊在Canvas中怎麼繪製箭頭。在Canvas的CanvasRenderingContext2D對象中是沒有提供繪製箭頭的方法,言外之意,在Canvas中要繪製箭頭是需要自己封裝函數來處理。那今天的主題就是來看怎麼封裝繪製箭頭的函數。

了解一些基礎知識

平常我們常常看到的一些箭頭樣式如下圖所示:

在繪製箭頭最關鍵之處就是處理箭頭:

其包括幾個部分:

從上圖上我們可以看出,控制一個箭頭,可以通過這幾個參數來控制:

起點P1((fromX, fromY))

終點P2((toX, toY))

斜線率headlen

夾角theta(θ)

對於箭頭的P3和P4點,我們就需要通過相應的三角函數計算得來。

那麼P3的坐標可以輕易計算出來:

用同樣的方法可以計算出P4坐標:

除此之外,還有一個關鍵,就是箭頭的角度。獲取箭頭的角度,可以直接通過atan2(y,x)來獲取。這也就涉及到三角函數中的反正切函數。

在三角函數中,兩個參數的函數atan2是正切函數tan的一個變種。對於任意不同時等於0的實參數x和y,atan2(y,x)所表達的意思是坐標原點為起點,指向(x,y)的射線在坐標平面上與x軸正方向之間的角的角度。當y>0時,射線與x軸正方向的所得的角的角度指的是x軸正方向繞逆時針方向到達射線旋轉的角的角度;而當y<0時,射線與x軸正方向所得的角的角度指的是x軸正方向繞順時針方向達到射線旋轉的角的角度。

在幾何意義上,atan2(y, x) 等價於 atan(y/x),但 atan2 的最大優勢是可以正確處理 x=0 而 y≠0 的情況,而不必進行會引發除零異常的 y/x 操作。

簡單的用下圖來闡述:

在一個單位圓內atan2函數在各點的取值。圓內標註代表各點的取值的幅度表示。圖片中,從最左端開始,角度的大小隨著逆時針方向逐漸從-π增大到+π,並且角度大小在點位於最右端時,取值為0。另外要注意的是,函數atan2(y,x)中參數的順序是倒置的,atan2(y,x)計算的值相當於點(x,y)的角度值。

簡單的了解了反正切函數,我們回到我們的主題中。

先來看一張圖:

通過Math.atan2()函數計算出angle:

為了和θ的單位值相匹配,將上面的公式進行一下轉換:

除此之外,還需要計算出箭頭兩條側邊線的夾角:

感覺有點零亂,其實我自己也瞎折騰了好幾天。如果上面的內容不太好理解,建議你移步閱讀這篇文章。

封裝繪製箭頭函數

通過前面的內容,可能對繪製箭頭有一定的理論基礎,接下來,我們看如何封裝箭頭函數。

這裡我們傳了九個參數:

ctx:Canvas繪圖環境

fromX, fromY:起點坐標(也可以換成p1,只不過它是一個數組)

toX, toY:終點坐標 (也可以換成p2,只不過它是一個數組)

theta:三角斜邊一直線夾角

headlen:三角斜邊長度

width:箭頭線寬度

color:箭頭顏色

根據前面的內容,我們可以這樣來寫這個函數:

這個時候,只需要調用這個封裝好的函數,我們就可以輕鬆的繪製一條向右的箭頭:

改變不同的坐標,可以得到不同方向的箭頭:

有的時候,我們需要線的兩頭都要有箭頭形狀,在上面的基礎上,稍加修改,增加一個反項的代碼即可:

調用函數:

看到的效果如下:

上面我們看到的僅是一種箭頭方式,文章開頭,提到箭頭方式有多種方式。那麼我們可以將drawArrow功強變得更為強大一些。比如@Patrick Horgan在他的文章中提到的方法:

由於代碼較多,這裡就不展示出來了,不過可以在對應的CodePen示例中查看到代碼:

總結

這篇文章主要介紹了通過三角函數的一些知識,封裝了一個箭頭函數,用來幫助我們在Canvas中更輕易的繪製出箭頭。因為在Canvas中沒有直接提供繪製箭頭的函數或者說方法。那麼三角在實際中有什麼哪些運用呢?大家可以發揮想像力,思考一下,寫寫實例。在最後一個方法中,我們其實還運用到了Canvas中的貝塞爾曲線繪製的方法。在下一節中,我們就來學習在Canvas中怎麼繪製貝塞爾曲線。

文章涉及到圖片和代碼,如果展示不全給您帶來不好的閱讀體驗,歡迎點擊文章底部的 閱讀全文。如果您覺得小站的內容對您的工作或學習有所幫助,歡迎關注此公眾號。

W3cplus.com

————————————

記述前端那些事,引領web前沿

長按二維碼,關注W3cplus

長按二維碼,關注"大漠扯CSS"小密圈

相關焦點

  • Canvas 教程:如何繪製帶箭頭的曲線
    我們只有兩個點的相對偏移量(offset),思路就是以這兩個點作為對角,創建一個絕對定位的 Canvas,然後在兩點中繪製一條曲線(Curve),最後在終點處繪製箭頭(Arrow)。繪製曲線代碼繪製箭頭繪製箭頭的步驟稍微複雜一點點,因為涉及到數學運算。
  • html中繪製圖形標籤的詳細介紹
    本篇將介紹的是html中<canvas>標籤的用法,感興趣的朋友可以一起研究一下!在html5中,新增了很多實用的標籤,今天為大家介紹的是html5新增標籤<canvas>,<canvas>標籤只是一個容器,對內容並沒有樣式的更改。那它在html中有什麼用,接下來我們就一起來看看吧!
  • html5 canvas畫布繪製矩形和圓形
    html5為我們提供了非常有特色的標籤,canvas標籤為我們可以實現在網頁中畫畫提供了便利,接下來我們列舉他的常用操作。新建一個html5的文檔,建立一個canvas畫布,設置長寬,這裡需要特別注意,canvas標籤可以在標籤內設置width,height,也能通過css來設置,但是通過css來設置的標籤,當繪製圖形的時候會變形,所以我們建議直接在標籤內設置。
  • Canvas學習:繪製文本
  • 開發者值得關注的HTML5新特性Canvas
    本文將帶領初學者學習Canvas的入門知識。  走近Canvas 元素標籤  官方對Canvas元素標籤的定義為:Canvas(畫布)可以用來進行繪製圖形,繪製遊戲的圖案或者其他圖形圖案,允許使用腳本動態渲染點陣圖像。簡單來說,Canvas就是允許你在HTML5中,使用Javascript去繪製你喜歡的任何圖形了,包括文字,圖片、線、點、各種形狀等。
  • canvas文本繪製自動換行、字間距、豎排等實現
    您可以狠狠的點擊這裡:自動換行擴展API wrapText演示demo下面截圖就是demo頁面繪製效果(截自IE9瀏覽器):可以看到上方繪製的文字在核實位置自動換行了,您可以修改<textarea>中的文字內容,點擊「繪製」按鈕體驗下其他文本內容的自動換行繪製效果。2.
  • HTML5新標籤——canvas
    canvas簡介HTML5 標籤用於繪製圖像(通過腳本,通常是 JavaScript)。不過, 元素本身並沒有繪製能力(它僅僅是圖形的容器) - 您必須使用腳本來完成實際的繪圖任務。,默認顏色是黑色參數:第一個參數起始點的x坐標,第二個參數是起始點的y坐標,第三個參數是矩形的寬度,第四個參數是矩形的高度stroke()作用:會實際地繪製出通過 moveTo() 和 lineTo() 方法定義的路徑。
  • H5的新功能,canvas畫布的矩形繪製,看了就會!
    繪製矩形canvas提供了三種方法繪製矩形: ---->繪製一個填充的矩形(填充色默認為黑色) fillRect(x, y, width, height)> ---->繪製一個矩形的邊框(默認邊框為:一像素實心黑色) strokeRect(x, y, width, height) ---->清除指定矩形區域,讓清除部分完全透明。
  • 「強烈建議收藏」小程序canvas繪製帶二維碼海報全流程(枚舉踩坑,詳解解決方案)
    ✅② taro-vue 初始化獲取不到canvas上下文怎麼辦,完全繪製不出來圖片?✅小程序canvas遇到的坑③ 關於canvas 寬高以及縮放比問題,繪製的元素變形,畫布的高度真得等於cavans標籤設置的寬高麼?✅④ canvas怎麼繪製疊在一起的兩張圖片,並控制層級?✅⑤ 如何用canvas繪製,多行文本?
  • 微信小程序canvas繪製海報並保存本地相冊
    在做微信小程序電商項目中,想要分享一款商品,使用最多並且最簡便的方法就是使用小程序自帶的分享api進行分享,但是分享出去的頁面比較難看;另一種方法就是自己使用小程序canvas繪製分享的海報,這個海報可以保存在相冊裡,而且可以按照自己的需求效果進行頁面繪製。
  • matplotlib如何實現圖形繪製在tkinter的Canvas中?
    matplotlib如何實現圖形繪製在tkinter的Canvas中?今天番茄加速就來分享一下。下面就是最重要的tkinter和matplotlib集成部分,matplotlib提供FigureCanvasTkAgg對象,只需三行代碼,實現圖形繪製在tkinter的Canvas中:canvas_l = FigureCanvasTkAgg(figure_l, frame_l)# 用draw代替canvas_l.draw()canvas_l.get_tk_widget
  • HTML5常用的標籤
    目錄:HTML5新結構標籤HTML5新其他標籤HTML5新input
  • 用一天入門 canvas 和 JavaScript
    相對適宜的等級和學習曲線,使我寫下整個過程。HTML canvas 用最簡單的方式,使web 開發者能夠通過JavaScript在網頁上繪製圖形。這樣,HTML 元素變得更加有趣。<canvas> 元素只是個容器,你總是需要使用 JavaScript 來準確繪製圖形。有人可能會說,我們總是可以添加這些點,也可以添加SVG,但這又會多麼有趣?
  • 用 Canvas 編織璀璨星空圖
    是不是還蠻酷的呢?本文我們就來一點一點分析怎麼實現它!開始 CodingHTML 部分這部分我就簡單放了一個 標籤,設置樣式使其填充全屏。首先我們要得到那個 canvas 並得到繪製上下文:var canvasEl = document.getElementById('canvas');var ctx = canvasEl.getContext('2d');var mousePos = [0, 0];緊接著我們聲明兩個變量,分別用於存儲
  • CAD裡怎麼繪製箭頭?
    在CAD裡怎麼畫箭頭?箭頭是cad繪圖的時候經常用得到的,但是很多人不知道怎麼繪製,下面分享cad中箭頭的繪製方法,以後做圖的時候有可能會用到,不會的朋友可以進來看一下初學CAD時,需要箭頭的畫法,以後作圖會需要。1、在CAD界面裡直接輸入命令【PL】,然後按空格鍵。
  • CAD製圖繪製彎曲引線箭頭的方法步驟
    怎麼在CAD製圖時繪製彎曲引線箭頭?在我們繪製CAD建築平面圖的時候,一些引線箭頭能夠幫我們整理好圖紙的方向,避免參考時出現錯誤。本期,模型雲就為您帶來畫CAD彎曲引線箭頭的方法,一起來看看吧!怎麼在CAD製圖時繪製彎曲引線箭頭?步驟一、打開CAD軟體,我們來進行彎曲引線箭頭的繪製。直接輸入CAD箭頭命令「pl」,回車,在cad中確定彎曲箭頭的起點,這時不能急著定第二個點,因為我們我們先要畫一條彎曲的弧線,所以在下方的「指定下一點」,我們要選擇"A」。
  • 讓我們掌握如何在Excel中繪製線條和箭頭
    如何在Excel中繪製線條和箭頭在圖中,「線」可以說是具有高繪圖頻率且具有繪圖輔助作用的圖形。關鍵是「如何按線型繪製的差異」和「如何與其他圖形連接」。線型Excel 2016中的操作屏幕繪製直線,箭頭,雙頭箭頭要繪製「直線」「箭頭」「
  • Canvas入門實戰之實現一個圖形驗證碼
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文主要介紹用canvas實現圖形驗證碼的一些思路以及如何用javascript面向對象的方式更友好的實現canvas的功能,關於canvas的一些基本使用方法和API我整理了一個思維導圖,大家感興趣的可以參考學習
  • 教程|PPT繪製箭頭最全攻略,收藏一下
    首先,PPT繪製箭頭有哪些方法呢?接下來,我們詳細介紹下不同類型箭頭具體怎麼畫第1種:表示光線的波浪狀箭頭第一步:通過曲線工具繪製需要的曲線走向如上圖中的兩種類型的紅色箭頭,有自己形狀的箭頭,就比較難繪製,我們這兒分別做個解析。
  • 告別手動繪製箭頭和字母 CAD機械版教你快速進行剖切的方向標註
    CAD圖紙的標註可以說是比較繁瑣的工作之一,早前跟大家介紹過,中望CAD機械版的智能標註基本能實現一鍵標註,效率能得到大大的提高除此之外,關於剖切的方向標註,也有很多小夥伴不知道該如何快速進行標註,那麼今天就跟大家一起學習一下,關於剖切的方向標註