canvas基础1

news2024/9/27 15:20:30

直线

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <canvas id="canvas" style="border:1px solid #ccc;margin:50px;"></canvas>

  <script>
    const canvas = document.getElementById('canvas')
    canvas.width = 1024
    canvas.height = 768
    const context = canvas.getContext('2d')

    // 绘制直线
    context.moveTo(100, 90) // 笔尖移动到 x:100 y:90 的位置
    context.lineTo(700, 600) // 画一条直线到 x: 700 y: 600 的位置
    context.lineWidth = 5  // 设置直线宽度为 5
    context.strokeStyle = '#005588'  // 设置直线颜色

    // 以上只是设置直线状态,并未开始画
    context.stroke() // 将之前描述的线条状态画出来  stroke用于绘制线条

  </script>
</body>
</html>

图示:

多边形

多边形就是多个线条连接起来

    // 绘制多边形
    context.moveTo(100, 90) // 笔尖移动到 x:100 y:90 的位置
    context.lineTo(700, 600) // 画一条直线到 x: 700 y: 600 的位置
    context.lineTo(100, 600)
    context.lineTo(100, 90)

    context.fillStyle = 'rgb(2, 100, 30)'  // 设置形状内的填充色
    context.fill()    // 填充颜色

    context.lineWidth = 5  // 设置直线宽度为 5
    context.strokeStyle = '#005588'  // 设置直线颜色

    // 以上只是设置直线状态,并未开始画
    context.stroke() // 将之前描述的线条状态画出来  stroke用于绘制线条

图示:

多个图形

后面设置的线段的宽度、颜色等会覆盖之前的设定

需要用 beginPath 和 closePath 包裹起来, 这样就不会被后面设置的状态覆盖

    // 绘制多个图形  需要用 beginPath 和 closePath 包裹起来, 这样就不会被后面设置的状态覆盖
    context.beginPath()
    context.moveTo(100, 90) // 笔尖移动到 x:100 y:90 的位置
    context.lineTo(700, 600) // 画一条直线到 x: 700 y: 600 的位置
    context.lineTo(100, 600)
    context.lineTo(100, 90)
    context.closePath()

    context.fillStyle = 'rgb(2, 100, 30)'  // 设置形状内的填充色
    context.fill()    // 填充颜色

    context.lineWidth = 5  // 设置直线宽度为 5
    context.strokeStyle = '#005588'  // 设置直线颜色

    // 以上只是设置直线状态,并未开始画
    context.stroke() // 将之前描述的线条状态画出来  stroke用于绘制线条

    context.beginPath()
    context.moveTo(200, 100)
    context.lineTo(800, 600)
    context.closePath()

    context.strokeStyle = 'black'
    context.stroke()

图示:

七巧板

七巧板本质上就是 分别由几个直线 拼成一个个图形,再将这些图形结合起来

var tangram = [
      { p: [{ x: 0, y: 0 }, { x: 800, y: 0 }, { x: 400, y: 400 }], color: "#caff67" },
      { p: [{ x: 0, y: 0 }, { x: 400, y: 400 }, { x: 0, y: 800 }], color: "#67beef" },
      { p: [{ x: 800, y: 0 }, { x: 800, y: 400 }, { x: 600, y: 600 }, { x: 600, y: 200 }], color: "#ef3d61" },
      { p: [{ x: 600, y: 200 }, { x: 600, y: 600 }, { x: 400, y: 400 }], color: "#f9f5la" },
      { p: [{ x: 400, y: 400 }, { x: 600, y: 600 }, { x: 400, y: 800 }, { x: 200, y: 600 }], color: "#a594c0" },
      { p: [{ x: 200, y: 600 }, { x: 400, y: 800 }, { x: 0, y: 800 }], color: "#fa8ecc" },
      { p: [{ x: 800, y: 400 }, { x: 800, y: 800 }, { x: 400, y: 800 }], color: "#f6ca29" }
    ]
    const canvas = document.getElementById('canvas')
    canvas.width = 800
    canvas.height = 800
    const context = canvas.getContext('2d')

    for (let i = 0; i < tangram.length; i++) {
      draw(tangram[i], context)
    }

    function draw(piece, cxt) {
      cxt.beginPath()
      cxt.moveTo(piece.p[0].x, piece.p[0].y)
      for (var i = 1; i < piece.p.length; i++) {
        cxt.lineTo(piece.p[i].x, piece.p[i].y)
      }
      cxt.closePath()

      cxt.fillStyle = piece.color
      cxt.fill()

      cxt.strokeStyle = "black"
      cxt.lineWidth = 3
      cxt.stroke()
    }

图示:

context.arc(centerx, centery, radius, startingAngle, endingAngle, anticlockwise = false)

centerx: x坐标
centery: y坐标
radius: 半径
startingAngle: 从哪个弧度值开始
endingAngle: 结束于哪个弧度值
anticlockwise: 是否逆时针绘制,默认为 false,也就是顺时针绘制

弧度值

无论是顺时针绘制还是逆时针绘制,弧度制是不变的

顺时针:

// 绘制弧线
    /*
        context.arc(centerx, centery, radius, startingAngle, endingAngle, anticlockwise = false)
        centerx: x坐标
        centery: y坐标
        radius: 半径
        startingAngle: 从哪个弧度值开始
        endingAngle: 结束于哪个弧度值
        anticlockwise: 是否逆时针绘制,默认为 false,也就是顺时针绘制
    */
    context.lineWidth = 5
    context.strokeStyle = '#005588'
    context.arc(300, 300, 200, 0, 1.5*Math.PI)
    context.stroke()

图示:

逆时针:

context.lineWidth = 5
context.strokeStyle = '#005588'
context.arc(300, 300, 200, 0, 1.5*Math.PI, true)
context.stroke()

图示:

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(十五)VBA常用基础知识:正则表达式的使用

vba正则表达式的说明 项目说明Pattern在这里写正则表达式&#xff0c;例&#xff1a;[\d]{2,4}IgnoreCase大小写区分&#xff0c;默认false&#xff1a;区分&#xff1b;true&#xff1a;不区分Globaltrue&#xff1a;全体检索&#xff1b;false&#xff1a;最小匹配Test类似p…

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…

Uniapp中父子页面传值

效果 实现 A页面 点击图一按钮进入图二页面 <view class"cu-form-group margin-top"><button class"cu-btn sm bg-gradual-green" style"margin-left: 70%; " click"selectMaterial">选择物料</button></view…

联邦学习中的攻击手段和防御机制

联邦学习产生的背景&#xff1a; 海量数据的生成和这些数据的后续处理往往需要一个数据仓库并在仓库内汇总数据。然而&#xff0c;随着数据泄漏事件层出不穷&#xff0c;数据安全性得不到保障&#xff0c;人们开始怀疑集中收集数据是否可靠&#xff0c;数据的隐私性的也得到了更…

Web应用防火墙的重要性及基本原理

企业网络安全是保障业务稳定运行的基础&#xff0c;而Web应用防火墙&#xff08;WAF&#xff09;是这个基础上的重要一环。本文将为你详细介绍WAF的基本原理&#xff0c;并探讨其在维护网络安全中的重要作用。 一、Web应用防火墙是什么&#xff1f; Web应用防火墙&#xff08;…

VSCode插件开发概述

目录 VSCode插件开发概述vscode插件vscode插件的用途脚手架安装重要文件package.jsonactivationEvents extension.js一个简单的例子本地打包 VSCode插件开发概述 vscode插件 vscode 是微软推出的一款轻量级代码编辑器&#xff0c;在使用的时候总会需要安装一些插件去协助我们…

[代码学习]einsum详解

einsum详解 该函数用于对一组输入 Tensor 进行 Einstein 求和&#xff0c;该函数目前仅适用于paddle的动态图。 Einstein 求和是一种采用 Einstein 标记法描述的 Tensor 求和&#xff0c;输入单个或多个 Tensor&#xff0c;输出单个 Tensor。 paddle.einsum(equation, *opera…

Win11自定义目录安装Linux子系统wsl

1. 启用适用于 Linux 的 Windows 子系统和虚拟机功能 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”&#xff09;&#xff0c;然后依次输入执行以下命令&#xff1a; dism.exe /online /enable-feature /f…

3ds Max渲染太慢?创意云“一键云渲染”提升3ds Max渲染体验

&#xfeff;在数字艺术设计领域&#xff0c;3ds Max是广泛使用的三维建模和渲染软件之一。然而&#xff0c;许多用户都面临着一个共同的问题&#xff1a;渲染速度太慢。渲染一帧画面需要耗费数小时&#xff0c;让人无法忍受。除了之前给大家介绍的几种解决方法外&#xff1a; …

【斗破年番】导演紧急删减第66集预告,陨落心炎事件要重演?

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗破苍穹年番最新资讯。 斗破苍穹年番第65集已经出来了&#xff0c;在这一集出来后按例官方放出来第66集和第67集的预告。只是让小郑没有想到的是&#xff0c;刚开始看第66集预告还好好的&#xff0c;但是等到再看的时候就…

代理SSL证书的优势——JoySSL

随着互联网的发展&#xff0c;越来越多的企业和个人开始使用网站来提供服务和信息。而SSL证书作为保障网站安全的重要工具&#xff0c;也逐渐被广泛应用。然而&#xff0c;对于许多企业和个人来说&#xff0c;购买和安装SSL证书是一项昂贵的任务。这就需要代理SSL证书的出现&am…

SLAM从入门到精通(camera数据读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际ros开发的时候&#xff0c;现场有很多特征都可以用来进行采集和标定。比如说地面&#xff0c;对于外资企业或者管理比较规范的企业来说&#x…

UNet及其变体在医学图像分割中的性能分析

论文链接&#xff1a;https://arxiv.org/abs/2309.13013 机构&#xff1a;英国伦敦布鲁内尔大学 日期&#xff1a;20230922 因为太长了长达37页所以我也就记点重点内容了hhh,我重点关注的还是在Unet以及其变体上&#xff0c;不过感觉严格意义上来说里面提到的方法不算很新&a…

嵌入式C语言中整形溢出问题分析

整型溢出有点老生常谈了&#xff0c;bla, bla, bla… 但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出&#xff0c;缓冲区溢出会导致各种黑客攻击。 今天分享一篇文章&#xff0c;希望大家都了解一下整型溢出&#xff0c;编译器的行为&#xff0c;以及如何防范&a…

【安全】 Java 过滤器 解决存储型xss攻击问题

文章目录 XSS简介什么是XSS?分类反射型存储型 XSS(cross site script)跨站脚本攻击攻击场景解决方案 XSS简介 跨站脚本( cross site script )为了避免与样式css(Cascading Style Sheets层叠样式表)混淆&#xff0c;所以简称为XSS。 XSS是一种经常出现在web应用中的计算机安全…

mistyR官网教程 空转spatial

Modeling spatially resolved omics with mistyR • mistyR (saezlab.github.io) mistyR and data formats • mistyR (saezlab.github.io) Heidelberg University and Heidelberg University Hospital, Heidelberg, Germany Jožef Stefan Institute, Ljubljana, Sloveniajov…

阿里5年经验之谈 —— 浅谈自动化测试方法!

导读 在当今快节奏的软件开发环境中&#xff0c;高质量的代码交付至关重要。而针对经过多次迭代&#xff0c;主要功能趋向稳定的产品&#xff0c;大量传统的重复性手动测试方法已经无法满足高效、快速的需求。为了提高测试效率保证产品质量&#xff0c;本文通过产品实践应用&a…

Python接口自动化测试之token参数关联

前言 在做自动化接口测试时&#xff0c;有时候会遇到token的动态关联&#xff0c;例如查询余额接口&#xff0c;需要关联登录接口的token动态值&#xff0c;如何利用python脚本进行接口token关联呢?今天我们爱学习一下吧&#xff01; 一&#xff1a;获取登录接口返回的token…

研发项目管理系统对比:找到最适合的高效工具

研发部门是企业非常重要的部门&#xff0c;代表着企业未来能否在市场上拥有优秀的技术&#xff0c;站稳市场份额。很多企业的研发方式往往是瀑布式的&#xff0c;所以项目的阶段规划&#xff0c;然后每个阶段的需求分配给开发人员&#xff0c;可以随时查看每个需求的开发进度和…

Redis学习5——有序集合Zset数据类型的操作

有序集合Zset 常用命令 数据结构 跳跃表 跳跃表