2.坐标系

2 阅读2分钟

Canvas 的坐标系可以理解为以像素为单位,原点在左上角的数学坐标系

核心规则

  1. 原点位置:原点 (0,0) 位于画布的左上角
  2. 轴方向
    • X 轴:水平向右为正方向。
    • Y 轴:垂直向下为正方向。
  3. 单位:单位是像素,非矢量单位。
  4. canvas 坐标系是以像素的宽高为基底的
  5. 栅格: 每一个格子就是一个像素,像素具有rgba 数据。
  6. canvas 画布的像素的数量: 等于画布的宽度乘以高度。

直观示意

假设一个 width=300, height=200 的画布:

(0,0) --- X+ ---> (300,0)
  |
  Y+
  |
  v
(0,200)         (300,200)

与数学直角坐标系的区别

这是初学者最需要留意的区别:

特性数学标准坐标系Canvas 坐标系
原点左下角左上角
Y轴方向向上为正向下为正
角度逆时针为正顺时针为正(因为Y轴反向)

例如,在 Canvas 上绘制圆弧或旋转图形时,0 弧度指向右方(3点钟方向),π/2 弧度指向下方(6点钟方向)。

2D 坐标变换

Canvas 提供了变换方法,可以将这个坐标系“改造”成你更熟悉的形式:

  • 平移ctx.translate(x, y) —— 移动原点位置。
  • 旋转ctx.rotate(angle) —— 绕原点旋转坐标系。
  • 缩放ctx.scale(x, y) —— 缩放坐标单位。

技巧:模拟数学坐标系

如果你更习惯数学中的笛卡尔坐标系(原点在左下,Y轴向上),可以这样做:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <canvas id="myCanvas"></canvas>
    <script>
        const canvas = document.getElementById('myCanvas');
        canvas.width = 500;
        canvas.height = 500;
        const ctx = canvas.getContext('2d');
        // 添加canvas背景色
        ctx.fillStyle = '#ADD8E6';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        
        
       // 1. 将原点平移到左下角
        ctx.translate(0, canvas.height);
        // 2. 将Y轴反转,使其向上为正
        ctx.scale(1, -1);

        // 现在,画布的原点就在左下角,Y轴向上为正
        ctx.fillRect(20, 20, 50, 50); // 矩形将绘制在左下角向上的位置
    </script>
</body>
</html>

注意:反转 Y 轴后,文本和图片会颠倒。绘制它们前需要临时恢复坐标系或单独处理。

总结

  • 记住:Canvas 坐标 = 左上角原点 + Y轴向下
  • 注意:由此带来的角度方向(顺时针为正)。
  • 进阶:熟练使用 translatescalerotate 可以极大地简化复杂绘图逻辑。

如果你在三维 Canvas 上下文中(如使用 WebGL),还会有更复杂的 3D 坐标系,但标准 2D Canvas 遵循以上规则。