ZetCode

JavaScript Canvas closePath 教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas closePath 方法。此方法对于完成路径和在 HTML canvas 上创建闭合图形至关重要。理解 closePath 对于绘制多边形和复杂图形至关重要。

基本定义

closePath 方法用直线将路径的最后一个点连接到第一个点,从而创建一个闭合图形。它不同于手动绘制一条线到起点,因为它会处理子路径。

当与 beginPathlineTo 等路径绘制方法一起使用时,closePath 会完成当前子路径。这对于填充或描边闭合图形特别有用。

基本的 closePath 用法

本示例演示了如何使用 closePath 绘制一个简单的三角形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic closePath</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(50, 50);
    ctx.lineTo(150, 150);
    ctx.lineTo(250, 50);
    ctx.closePath();
    ctx.stroke();
</script>

</body>
</html>

在此基本示例中,我们创建了一个 canvas 元素并获取其 2D 上下文。我们使用 beginPath 开始一个路径并移动到起点。

绘制两条线来创建三角形的两条边。closePath 会自动绘制第三条边来完成图形。最后,我们描边路径使其可见。

使用 closePath 填充图形

本示例展示了 closePath 如何创建可以填充的闭合图形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Filled Shape with closePath</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(50, 50);
    ctx.lineTo(150, 150);
    ctx.lineTo(250, 50);
    ctx.closePath();
    
    ctx.fillStyle = 'lightblue';
    ctx.fill();
    ctx.strokeStyle = 'blue';
    ctx.stroke();
</script>

</body>
</html>

在这里,我们创建了与之前相同的三角形,但现在我们用颜色填充它。closePath 确保图形已正确闭合以便填充。

我们设置浅蓝色填充颜色并调用 fill,然后添加蓝色描边轮廓。这演示了 closePath 如何同时实现图形的填充和描边。

使用 closePath 的多个子路径

本示例演示了在单个图形中使用 closePath 的多个子路径。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Multiple Subpaths</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    // First triangle
    ctx.moveTo(50, 50);
    ctx.lineTo(100, 150);
    ctx.lineTo(150, 50);
    ctx.closePath();
    
    // Second triangle
    ctx.moveTo(200, 50);
    ctx.lineTo(250, 150);
    ctx.lineTo(300, 50);
    ctx.closePath();
    
    ctx.fillStyle = 'pink';
    ctx.fill();
    ctx.strokeStyle = 'red';
    ctx.stroke();
</script>

</body>
</html>

此示例通过多次调用 moveToclosePath 在一个路径中创建两个独立的三角形。每个三角形都是一个独立的子路径。

两个子路径一起被填充和描边。closePath 确保每个三角形在移动到下一个图形之前都已正确闭合。

使用 closePath 的复杂图形

本示例展示了如何使用 closePath 创建更复杂的图形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Complex Shape</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    // Main rectangle
    ctx.moveTo(100, 50);
    ctx.lineTo(300, 50);
    ctx.lineTo(300, 200);
    ctx.lineTo(100, 200);
    ctx.closePath();
    
    // Cutout triangle
    ctx.moveTo(150, 100);
    ctx.lineTo(250, 100);
    ctx.lineTo(200, 175);
    ctx.closePath();
    
    ctx.fillStyle = 'lightgreen';
    ctx.fill();
    ctx.strokeStyle = 'darkgreen';
    ctx.lineWidth = 3;
    ctx.stroke();
</script>

</body>
</html>

在这里,我们使用两个子路径创建一个带有三角形镂空的矩形。首先绘制主矩形并使用 closePath 闭合。

然后我们添加一个三角形子路径,当填充时它将作为镂空。偶数-奇数填充规则(默认)使三角形显示为矩形中的一个孔。

closePath 与弧线

本示例演示了如何使用 closePath 与弧线段创建图形。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>closePath with Arcs</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    // Start at top center
    ctx.moveTo(200, 50);
    // Draw right semicircle
    ctx.arc(200, 150, 100, -Math.PI/2, Math.PI/2);
    // Draw left semicircle
    ctx.arc(200, 150, 50, Math.PI/2, -Math.PI/2, true);
    ctx.closePath();
    
    ctx.fillStyle = 'rgba(200, 200, 0, 0.5)';
    ctx.fill();
    ctx.strokeStyle = 'orange';
    ctx.lineWidth = 4;
    ctx.stroke();
</script>

</body>
</html>

本示例通过弧线和 closePath 创建了一个顶部平坦的甜甜圈形状。我们从顶部中心开始,并沿相反方向绘制两个半圆。

closePath 将最后一个弧线的末端连接回起点,从而创建了一个完整的图形。结果用半透明的黄色填充,并用橙色描边。

来源

MDN Canvas closePath 文档

在本文中,我们探讨了使用 closePath 在 HTML canvas 上创建闭合图形的各种技术。掌握此方法对于在 Web 应用程序中绘制多边形和复杂图形至关重要。

作者

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

列出 所有 JS Canvas 教程