ZetCode

JavaScript Canvas 弧教程

最后修改于 2025 年 4 月 3 日

在本文中,我们探讨 JavaScript 中的 Canvas 弧方法。这些方法对于在 HTML canvas 上绘制圆、弧和饼图至关重要。掌握弧形对于创建圆形图形和可视化至关重要。

基本定义

Canvas 弧是指圆周的片段。arc 方法可以绘制完整的圆、部分圆和饼形楔形。弧形由中心点、半径、起始角和结束角以及方向定义。

主要的 arc 方法是 arc(),它创建一个圆形弧。arcTo() 方法在两个切线之间创建弧。角度以弧度测量(完整圆为 0 到 2π)。

基本圆绘制

此示例演示了如何在 canvas 上绘制一个简单的圆。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic Canvas Circle</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.arc(150, 100, 50, 0, Math.PI * 2);
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 3;
    ctx.stroke();
</script>

</body>
</html>

在这个基本示例中,我们创建了一个 canvas 元素并获取其 2D 渲染上下文。我们开始一个路径并调用 arc() 方法来定义一个圆。

弧形中心位于 (150,100),半径为 50。角度从 0 到 2π (Math.PI * 2) 创建一个完整的圆。然后我们用蓝色和 3px 的宽度描边路径。

部分弧绘制

此示例展示了如何绘制一个部分弧(一个半圆)。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Partial Arc</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.arc(150, 100, 60, 0, Math.PI); // 0 to π radians (180 degrees)
    ctx.strokeStyle = 'red';
    ctx.lineWidth = 5;
    ctx.stroke();
</script>

</body>
</html>

在这里,我们通过指定从 0 到 π 弧度(180 度)的角度来绘制一个半圆。弧形中心位于 (150,100),半径为 60 像素。

请注意,弧形是从起始角到结束角顺时针绘制的。为了更好的可见性,线条样式为红色和 5px 宽度。

填充弧(饼图切片)

此示例演示了如何创建一个填充的饼图切片。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Filled Pie Slice</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.moveTo(150, 100); // Center point
    ctx.arc(150, 100, 70, 0, Math.PI / 2); // 0 to 90 degrees
    ctx.closePath(); // Connect back to center
    
    ctx.fillStyle = 'rgba(0, 128, 0, 0.7)';
    ctx.fill();
    ctx.strokeStyle = 'darkgreen';
    ctx.stroke();
</script>

</body>
</html>

这通过首先移动到中心点,然后绘制一个 90 度弧(0 到 π/2 弧度),然后将路径闭合回中心点来创建饼图切片。

切片以半透明的绿色填充,并以深绿色勾勒。此技术对于创建饼图和圆形图很有用。

逆时针弧

此示例展示了如何以逆时针方向绘制弧形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Counter-Clockwise Arc</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.arc(150, 100, 60, 0, Math.PI / 2, true); // Counter-clockwise
    ctx.strokeStyle = 'purple';
    ctx.lineWidth = 4;
    ctx.stroke();
    
    // Draw reference lines
    ctx.beginPath();
    ctx.moveTo(150, 100);
    ctx.lineTo(210, 100);
    ctx.moveTo(150, 100);
    ctx.lineTo(150, 40);
    ctx.strokeStyle = 'gray';
    ctx.stroke();
</script>

</body>
</html>

这里的关键区别在于 arc() 的第六个参数设置为 true,这使得弧形以逆时针方向绘制。我们还绘制了参考线来可视化角度。

灰色线条显示了弧形的起始(3 点钟位置)和结束(12 点钟)点。紫色弧形沿与默认顺时针行为相反的方向绘制。

ArcTo 方法示例

此示例演示了 arcTo() 方法用于创建圆角。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>arcTo Method</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Draw a rectangle with rounded corner using arcTo
    ctx.beginPath();
    ctx.moveTo(50, 50);
    ctx.lineTo(250, 50);
    ctx.arcTo(300, 50, 300, 100, 50); // Top-right corner
    ctx.lineTo(300, 200);
    ctx.arcTo(300, 250, 250, 250, 50); // Bottom-right corner
    ctx.lineTo(50, 250);
    ctx.arcTo(0, 250, 0, 200, 50); // Bottom-left corner
    ctx.lineTo(0, 100);
    ctx.arcTo(0, 50, 50, 50, 50); // Top-left corner
    ctx.closePath();
    
    ctx.strokeStyle = 'orange';
    ctx.lineWidth = 3;
    ctx.stroke();
</script>

</body>
</html>

arcTo() 方法在两条线(切线)之间创建弧。它接受五个参数:两个控制点、一个终点和一个半径。

此示例绘制了一个所有四个角都圆化的矩形。每个角使用 50px 半径的 arcTo()。该方法自动计算平滑连接线的弧形。

来源

MDN Canvas arc 文档

在本文中,我们探索了在 HTML canvas 上绘制弧形和圆形的各种技术。这些方法对于在 Web 应用程序中创建圆形图形、饼图和圆角形状至关重要。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 JS Canvas 教程