Canvas绘图基础:坐标、线条与圆形的艺术

在Canvas绘图的世界里,理解坐标系统是绘制一切图形的基础。就像在地图上找位置需要经纬度一样,在Canvas中绘制图形也需要精确的坐标定位。今天,我们将深入探索Canvas的坐标系统,并学习如何利用这个系统绘制线条和圆形------这两种构成复杂图形的基本元素。

Canvas坐标系统

基本概念

Canvas使用基于左上角的二维笛卡尔坐标系,这与我们数学中常见的坐标系有所不同:

  • 原点(0,0) :位于画布的左上角
  • X轴:向右为正方向
  • Y轴:向下为正方向
HTML 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas坐标系统演示</title>
    <style>
        canvas {
            border: 1px solid #333;
            background: #f9f9f9;
        }
    </style>
</head>
<body>
    <canvas id="coordinateCanvas" width="600" height="400"></canvas>

    <script>
        const canvas = document.getElementById('coordinateCanvas');
        const ctx = canvas.getContext('2d');
        
        // 绘制坐标轴
        ctx.strokeStyle = '#333';
        ctx.lineWidth = 1;
        
        // X轴
        ctx.beginPath();
        ctx.moveTo(0, 200);
        ctx.lineTo(600, 200);
        ctx.stroke();
        
        // Y轴
        ctx.beginPath();
        ctx.moveTo(300, 0);
        ctx.lineTo(300, 400);
        ctx.stroke();
        
        // 标记原点
        ctx.fillStyle = 'red';
        ctx.fillRect(298, 198, 4, 4);
        ctx.fillText('原点 (0,0)', 310, 190);
        
        // 标记坐标点示例
        ctx.fillStyle = 'blue';
        ctx.fillRect(100, 100, 4, 4); // 点(100,100)
        ctx.fillText('(100,100)', 110, 90);
        
        ctx.fillStyle = 'green';
        ctx.fillRect(400, 300, 4, 4); // 点(400,300)
        ctx.fillText('(400,300)', 410, 290);
    </script>
</body>
</html>

绘制线条

基本语法

绘制线条需要使用路径(Path) API,遵循以下步骤:

  1. beginPath() - 开始新路径
  2. moveTo(x, y) - 移动到起点
  3. lineTo(x, y) - 绘制到终点
  4. stroke() - 描边路径

线条样式属性:

属性名 说明 可选值/示例
lineWidth 设置线条的宽度(单位:像素) 3510
strokeStyle 设置线条的颜色或样式 'red''#ff0000''rgba(255,0,0,0.5)'
lineCap 设置线条末端的样式 'butt'(平直)、'round'(圆形)、'square'(方形)
lineJoin 设置两条线段连接处的样式 'miter'(尖角)、'round'(圆角)、'bevel'(斜角)
setLineDash() 设置虚线模式 [5, 3](5px实线,3px空白)

绘制圆形和圆弧

基本语法

Canvas使用arc()方法绘制圆形和圆弧:

javascript 复制代码
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);

属性说明:

参数名 说明 例子
x 圆心的X坐标 100
y 圆心的Y坐标 150
radius 圆的半径 50
startAngle 起始角度(弧度制) 0
endAngle 结束角度(弧度制) Math.PI * 2
anticlockwise 绘制方向 false

角度与弧度转换

Canvas使用弧度制而非角度制:

  • 180° = π 弧度
  • 360° = 2π 弧度
  • 转换公式:弧度 = 角度 * (Math.PI / 180)

代码示例:绘制完整圆形,圆形边框,半圆,四分之一圆,复杂圆弧(扇形),使用arcTo绘制圆角

HTML 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas圆形绘制</title>
    <style>
        canvas {
            border: 1px solid #333;
            background: #fff;
        }
    </style>
</head>
<body>
    <canvas id="circleCanvas" width="600" height="400"></canvas>

    <script>
        const canvas = document.getElementById('circleCanvas');
        const ctx = canvas.getContext('2d');
        
        // 示例1:绘制完整圆形(填充)
        ctx.beginPath();
        ctx.arc(100, 100, 60, 0, Math.PI * 2); // 完整圆形
        ctx.fillStyle = 'rgba(52, 152, 219, 0.7)';
        ctx.fill();
        
        // 示例2:绘制圆形边框
        ctx.beginPath();
        ctx.arc(250, 100, 60, 0, Math.PI * 2);
        ctx.strokeStyle = '#e74c3c';
        ctx.lineWidth = 5;
        ctx.stroke();
        
        // 示例3:绘制半圆
        ctx.beginPath();
        ctx.arc(400, 100, 60, 0, Math.PI); // 0到π = 180度
        ctx.fillStyle = '#2ecc71';
        ctx.fill();
        
        // 示例4:绘制四分之一圆
        ctx.beginPath();
        ctx.arc(100, 250, 60, 0, Math.PI / 2); // 0到π/2 = 90度
        ctx.strokeStyle = '#f39c12';
        ctx.lineWidth = 5;
        ctx.stroke();
        
        // 示例5:绘制复杂圆弧(扇形)
        ctx.beginPath();
        ctx.moveTo(250, 250); // 移动到圆心
        ctx.arc(250, 250, 60, Math.PI / 4, Math.PI * 1.5); // 45度到270度
        ctx.closePath(); // 连接回圆心形成扇形
        ctx.fillStyle = 'rgba(155, 89, 182, 0.7)';
        ctx.fill();
        
        // 示例6:使用arcTo绘制圆角
        ctx.beginPath();
        ctx.moveTo(350, 200);
        ctx.arcTo(450, 200, 450, 300, 30); // 创建圆角
        ctx.lineTo(450, 300);
        ctx.strokeStyle = '#34495e';
        ctx.lineWidth = 3;
        ctx.stroke();
        
        // 添加说明文字
        ctx.fillStyle = '#333';
        ctx.font = '12px Arial';
        ctx.fillText('完整圆形', 80, 180);
        ctx.fillText('圆形边框', 230, 180);
        ctx.fillText('半圆', 385, 180);
        ctx.fillText('四分之一圆', 75, 330);
        ctx.fillText('扇形', 240, 330);
        ctx.fillText('arcTo圆角', 370, 330);
    </script>
</body>
</html>

圆弧绘制方法

  1. arc() - 绘制标准圆弧,最常用
  2. arcTo() - 通过两个控制点绘制圆弧,适合创建圆角
  3. ellipse() - 绘制椭圆弧(可控制椭圆半径和旋转)
综合示例:绘制简单笑脸
HTML 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas笑脸绘制</title>
    <style>
        canvas {
            border: 1px solid #333;
            background: #fff;
        }
    </style>
</head>
<body>
    <canvas id="smileyCanvas" width="400" height="400"></canvas>

    <script>
        const canvas = document.getElementById('smileyCanvas');
        const ctx = canvas.getContext('2d');
        
        // 绘制脸部(圆形)
        ctx.beginPath();
        ctx.arc(200, 200, 150, 0, Math.PI * 2);
        ctx.fillStyle = '#FFD700'; // 金黄色
        ctx.fill();
        ctx.strokeStyle = '#D4AF37';
        ctx.lineWidth = 3;
        ctx.stroke();
        
        // 绘制左眼
        ctx.beginPath();
        ctx.arc(150, 160, 25, 0, Math.PI * 2);
        ctx.fillStyle = 'white';
        ctx.fill();
        ctx.strokeStyle = '#333';
        ctx.stroke();
        
        // 绘制左眼珠
        ctx.beginPath();
        ctx.arc(150, 160, 10, 0, Math.PI * 2);
        ctx.fillStyle = '#333';
        ctx.fill();
        
        // 绘制右眼
        ctx.beginPath();
        ctx.arc(250, 160, 25, 0, Math.PI * 2);
        ctx.fillStyle = 'white';
        ctx.fill();
        ctx.strokeStyle = '#333';
        ctx.stroke();
        
        // 绘制右眼珠
        ctx.beginPath();
        ctx.arc(250, 160, 10, 0, Math.PI * 2);
        ctx.fillStyle = '#333';
        ctx.fill();
        
        // 绘制嘴巴(微笑弧线)
        ctx.beginPath();
        ctx.arc(200, 220, 80, 0.1 * Math.PI, 0.9 * Math.PI); // 微笑弧度
        ctx.strokeStyle = '#333';
        ctx.lineWidth = 5;
        ctx.stroke();
    </script>
</body>
</html>

总结

Canvas绘图的三个核心基础:

  1. 坐标系统:理解基于左上角的坐标系是精确定位的基础
  2. 线条绘制:学会使用路径API创建直线、折线和虚线
  3. 圆形绘制 :掌握使用arc()方法绘制圆形、圆弧和扇形
相关推荐
少寒10 分钟前
async/await:异步编程的优雅解决方案
前端·javascript
华仔啊14 分钟前
CSS的clamp()函数:一行代码让网页自适应如此简单
前端·css
wordbaby17 分钟前
React 误区粉碎:useEffectEvent 是“非响应式”的,所以它不会触发重渲染?
前端·react.js
Doris89333 分钟前
【JS】Web APIs BOM与正则表达式详解
前端·javascript·正则表达式
建南教你种道德之花33 分钟前
浏览器缓存完全指南:从原理到实践
前端
1024小神41 分钟前
swiftui中view分为几种类型?各有什么特点
前端
局i1 小时前
v-for 与 v-if 的羁绊:Vue 中列表渲染与条件判断的爱恨情仇
前端·javascript·vue.js
suke1 小时前
紧急高危:Next.js 曝出 CVSS 10.0 级 RCE 漏洞,请立即修复!
前端·程序员·next.js
狮子座的男孩1 小时前
js函数高级:06、详解闭包(引入闭包、理解闭包、常见闭包、闭包作用、闭包生命周期、闭包应用、闭包缺点及解决方案)及相关面试题
前端·javascript·经验分享·闭包理解·常见闭包·闭包作用·闭包生命周期