ZetCode

JavaScript Canvas lineTo 教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas lineTo 方法。此方法对于在 HTML canvas 上绘制点之间的直线至关重要。掌握 lineTo 方法对于创建复杂的路径和形状至关重要。

基本定义

lineTo 方法通过连接最后一个点到指定坐标来为当前子路径添加一条直线。它不会立即绘制线条 - 您需要调用 stroke 或 fill 来渲染它。

语法是 lineTo(x, y),其中 x 和 y 是终点坐标。lineTo 与 moveTo 和 arc 等其他路径方法一起使用,以创建复杂的绘图。

基本 lineTo 用法

本示例演示了如何使用 lineTo 绘制简单的线条。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic lineTo</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(250, 150);
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 3;
    ctx.stroke();
</script>

</body>
</html>

在这个基本示例中,我们创建了一个 canvas 元素并获取了它的 2D 渲染上下文。我们使用 beginPath 开始一个新路径并设置起点。

lineTo 方法绘制一条从 (50,50) 到 (250,150) 的线。我们设置描边属性并调用 stroke 来渲染线条。这展示了最简单的 lineTo 用法。

绘制多条线

本示例展示了如何使用 lineTo 绘制多条连接的线。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Multiple Lines</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, 50);
    ctx.lineTo(150, 150);
    ctx.lineTo(50, 150);
    ctx.closePath();
    
    ctx.strokeStyle = 'red';
    ctx.lineWidth = 2;
    ctx.stroke();
</script>

</body>
</html>

在这里,我们通过绘制四条连接的线来创建一个正方形。每条 lineTo 都连接到前一个点。closePath 方法完成形状。

请注意我们如何链接多个 lineTo 调用。这会创建一个连续的路径。stroke 方法以指定的样式一次性渲染所有线条。

创建锯齿形图案

本示例演示了如何使用 lineTo 创建锯齿形图案。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Zigzag Pattern</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.beginPath();
    ctx.moveTo(50, 100);
    
    for (let i = 0; i < 8; i++) {
        const x = 50 + i * 40;
        const y = i % 2 === 0 ? 50 : 150;
        ctx.lineTo(x, y);
    }
    
    ctx.strokeStyle = 'green';
    ctx.lineWidth = 3;
    ctx.stroke();
</script>

</body>
</html>

此示例使用循环创建锯齿形图案。图案在顶部和底部点之间交替。模运算符控制交替。

每次迭代都会计算新坐标并添加线段。这展示了如何以编程方式使用 lineTo 高效地创建复杂图案。

绘制星形

本示例展示了如何使用 lineTo 绘制星形。

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

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    const centerX = 150;
    const centerY = 150;
    const radius = 100;
    const spikes = 5;
    
    ctx.beginPath();
    
    for (let i = 0; i < spikes * 2; i++) {
        const angle = (i * Math.PI / spikes) - Math.PI / 2;
        const r = i % 2 === 0 ? radius : radius / 2;
        const x = centerX + r * Math.cos(angle);
        const y = centerY + r * Math.sin(angle);
        
        if (i === 0) {
            ctx.moveTo(x, y);
        } else {
            ctx.lineTo(x, y);
        }
    }
    
    ctx.closePath();
    ctx.strokeStyle = 'purple';
    ctx.lineWidth = 4;
    ctx.stroke();
</script>

</body>
</html>

此示例使用三角学计算创建了一个五角星。我们在外点和内点之间交替以形成星形。

for 循环使用余弦和正弦计算每个点的坐标。第一个点使用 moveTo,而后续点使用 lineTo。这会创建一个连续的星形路径。

交互式线条绘制

本示例演示了使用鼠标事件进行交互式线条绘制。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Interactive Drawing</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    let isDrawing = false;
    let lastX = 0;
    let lastY = 0;
    
    canvas.addEventListener('mousedown', (e) => {
        isDrawing = true;
        [lastX, lastY] = [e.offsetX, e.offsetY];
    });
    
    canvas.addEventListener('mousemove', (e) => {
        if (!isDrawing) return;
        
        ctx.beginPath();
        ctx.moveTo(lastX, lastY);
        ctx.lineTo(e.offsetX, e.offsetY);
        ctx.strokeStyle = 'orange';
        ctx.lineWidth = 5;
        ctx.lineCap = 'round';
        ctx.stroke();
        
        [lastX, lastY] = [e.offsetX, e.offsetY];
    });
    
    canvas.addEventListener('mouseup', () => isDrawing = false);
    canvas.addEventListener('mouseout', () => isDrawing = false);
</script>

</body>
</html>

此示例创建了一个交互式绘图工具。用户可以通过单击并拖动鼠标来绘制线条。绘图会随着鼠标移动而进行。

鼠标事件控制绘图过程。mousedown 开始一个新路径,mousemove 在拖动时绘制线条,mouseup 停止绘图。lineCap 属性使线条看起来更平滑。

来源

MDN Canvas lineTo 文档

在本文中,我们探索了使用 lineTo 在 HTML canvas 上创建线条和形状的各种技术。掌握此方法对于在 Web 应用程序中创建详细图形和交互式绘图至关重要。

作者

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

列出 所有 JS Canvas 教程