亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

繪制圓弧

1. 前言

上一節我們學習了利用 arc 方法繪制一個標準的圓或者圓弧,arc 方法依托于圓心、半徑、起始角和結束角繪制圓弧,今天我們再來學習一下繪制圓弧的方法 arcTo。

2. 利用 arcTo 方法繪制弧線

arcTo() 是利用兩條相交切線來確定圓弧的位置,開始前我們先要搞懂切線的幾個知識點。

如何確定切線?
我們都知道兩點確定一條直線,這里兩條直線相交處有一個交點,交點是兩條線共用的一個點,所以我們只需要三個點就能確定兩條切線。

根據切線如何確定圓心?
切線的性質有:
(1)切線和圓只有一個公共點。
(2)切線和圓心的距離等于圓的半徑。
(3)切線垂直于經過切點的半徑。
(4)經過圓心垂直于切線的直線必過切點。
(5)經過切點垂直于切線的直線必過圓心。

我們根據切線的垂直線必過圓心,即可確定圓心。

我們來看一張圖片:

上圖中,只要我們確定了 PA、PB 這兩條切線和圓的半徑 OA,即可確定 AB 這條弧線。上圖中,我們沿著 OP 延長線移動 O 點的位置,即可得到半徑不同的圓,也就得到了不同的 AB 弧線。

到這里我們明白了:

  • 有三個點就可以確定兩條切線。
  • 有圓的半徑就可以確定切線間的一條弧線。

arcTo 就是利用上面的原理來繪制弧線的。arcTo 方法有5個參數,前兩個參數表示的是上圖中 P 點的坐標,也就是切線的交點,第3個和第4個參數表示 PB 切線上的任意一個坐標點,第5個參數表示的是上圖中 OA 的長度,也就是繪制圓的半徑。

特別注意:
第3、4個參數表示的點不是切點!
第3、4個參數表示的點不是切點!
第3、4個參數表示的點不是切點!

arcTo 方法的參數中只有兩個點和一個半徑,我們前面講到要繪制弧線,必須是三個點,那第一個點哪兒去了呢?其實第一個點就是當前畫布中筆觸所在的位置,也就是當前畫布中已經繪制的路徑的終點。

先看整體案例:

實例演示
預覽 復制
復制成功!
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>慕課網Wiki</title>
    <style>
        #imooc{
            border:1px solid #ccc;
        }
    </style>
</head>
<body>
	
	<canvas id="imooc">您的瀏覽器不支持 HTML5 canvas 標簽</canvas>
	
	<script>
		const canvas = document.getElementById('imooc');
		canvas.width=300
		canvas.height=300
		const ctx = canvas.getContext('2d');
		
		// 繪制弧線
		ctx.beginPath();
		ctx.moveTo(40,40);
		ctx.arcTo(260,40, 260,200, 60);  //調用了繪制圓的函數
		ctx.strokeStyle = "#456795";
		ctx.lineWidth = 4;
		ctx.stroke();
		
		// ==============一下內容為復制內容=================
		// 繪制切線
		ctx.beginPath()
		ctx.strokeStyle="#ccc";
		ctx.lineWidth=1;
		ctx.moveTo(40,40);
		ctx.lineTo(260,40);
		ctx.lineTo(260,260);
		ctx.stroke();
		
		//繪制P點
		ctx.beginPath();
		ctx.arc(260,40,4,0, 2*Math.PI)
		ctx.fillStyle = "#000"
		ctx.fill()
		
		//繪制A點
		ctx.beginPath();
		ctx.arc(40,40,4,0, 2*Math.PI)
		ctx.fillStyle = "#000"
		ctx.fill()
		
		
		//繪制B點
		ctx.beginPath();
		ctx.arc(260,200,4,0, 2*Math.PI)
		ctx.fillStyle = "#000"
		ctx.fill()
		
		//繪制切點
		ctx.beginPath();
		ctx.arc(200,40,4,0, 2*Math.PI)
		ctx.fillStyle = "yellow"
		ctx.fill()
		
		
		//繪制切點
		ctx.beginPath();
		ctx.arc(260,100,4,0, 2*Math.PI)
		ctx.fillStyle = "yellow"
		ctx.fill()
		
		//繪制圓心 O 點
		ctx.beginPath();
		ctx.arc(200,100,4,0, 2*Math.PI)
		ctx.fillStyle = "blue"
		ctx.fill()
		
		//繪制輔助圓
		ctx.beginPath();
		ctx.lineWidth = 1;
		ctx.strokeStyle="#ccc"
		ctx.arc(200,100,60,0, 2*Math.PI)
		ctx.stroke()
		
	</script>
</body>
</html>
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

我們對上面的繪制弧線代碼做拆分講解:

  1. 開始一個新路徑。

    ctx.beginPath();
    
  2. 確定第一個坐標點 A 點,A 點是當前已有路徑的終點。

    ctx.moveTo(40,40);
    

    我換一個寫法:

    ctx.moveTo(40,0);
    ctx.lineTo(80,40);
    

    這時候 A 點的位置就變成了 (80, 40)。

  3. 根據切線交點、第二條切線上的某個點和半徑開始繪制弧線。

    ctx.arcTo(260,40, 260,200, 60);  //調用了繪制圓的函數
    

    這里需要注意三點:
    (1) A 點和 PA 切線的切點會被自動連接起來,但是 PB 切線上的切點和 B點不會自動連接起來。

    (2) A 點肯定在路徑上,B 點不一定在路徑上。
    (3) 切點由 canvas 自動計算。

  4. 設置繪制樣式以及開始描邊。

    ctx.strokeStyle = "#456795";
    ctx.lineWidth = 4;
    ctx.stroke();
    

我們從案例中可以看到,繪制一個圓形路徑只需要調用一個函數即可,arc 方法和我們之前學過的 rect 繪制矩形的方法類似,也是繪制了一個路徑,我們后續對路徑的描邊或者填充依然是需要調用 stroke 或者 fill 方法的。

3. 繪制圓角矩形

直接看案例:

實例演示
預覽 復制
復制成功!
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>慕課網Wiki</title>
    <style>
        #imooc{
            border:1px solid #ccc;
        }
    </style>
</head>
<body>
	
	<canvas id="imooc">您的瀏覽器不支持 HTML5 canvas 標簽</canvas>
	
	<script>
		const canvas = document.getElementById('imooc');
		canvas.width=300
		canvas.height=300
		const ctx = canvas.getContext('2d');
		
		// 繪制圓角矩形
		ctx.beginPath();
		ctx.moveTo(80,40);
		ctx.arcTo(260,40, 260,200, 40);
		ctx.arcTo(260,260, 200,260, 40); 
		ctx.arcTo(40,260, 40,100, 40); 
		ctx.arcTo(40,40, 80,40,40)
	
		ctx.strokeStyle = "#456795";
		ctx.lineWidth = 4;
		ctx.stroke();
		ctx.fillStyle = "#ccc";
		ctx.fill();
	</script>
</body>
</html>
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

4. arcarcTo 對比

相同點:

  1. 都是繪制圓弧。

不同點:

  1. arc 通過圓心 + 半徑 + 弧度繪制圓弧, arcTo 是根據切線 + 半徑繪制圓弧。
  2. arc 可以繪制任意弧度的圓弧,arcTo 只能繪制小于180度的圓弧。
  3. arc 可以不需要起點,可以直接繪制, arcTo 繪制前必須存在一個端點。
  4. arc 可以設置繪制方向,arcTo 只能由切線控制。

5. 方法整理

本小節中我們使用到一個新的繪制圓弧的方法 arcTo。

5.1 arcTo()方法

arcTo 方法作用是繪制一個切線為 PA 和 PB、半徑為 r 的圓弧,圓弧由切線控制。

變量說明:

變量名 類型 是否必須 說明
x1 Number 切線交點P的X坐標。
y1 Number 切線交點P的Y坐標。
x2 Number 指PB切線的任意一點的X坐標。
y2 Number 指PB切線的任意一點的Y坐標。
r Number 圓的半徑。

6. 總結

本小節我們主要學習了利用 arcTo 方法繪制圓弧,本節主要難點在于理解繪制的原理,希望同學們多多練習加深記憶。