canvas基础2 -- 形状、简单场景

这篇具有很好参考价值的文章主要介绍了canvas基础2 -- 形状、简单场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 七巧板

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

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()
    }

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

箭头

    context.beginPath()
    context.moveTo(100, 350) 
    context.lineTo(500, 350) 
    context.lineTo(500, 200) 
    context.lineTo(700, 400)
    context.lineTo(500, 600)
    context.lineTo(500, 450)
    context.lineTo(100, 450)
    context.closePath()
    
    context.lineWidth = 5  
    context.strokeStyle = '#058'

    context.stroke() 

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

五角星

如下图所示:五角星外面的五个顶点都在外圆上,里面的五个顶点都在内圆上

五角星的10个顶点,外圆的每个顶点相差72度,同理,内圆的每个顶点也相差72度

算出每个顶点的坐标

最后用线段连接起来

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

代码:

    const canvas = document.getElementById('canvas')
    canvas.width = 800
    canvas.height = 800
    const context = canvas.getContext('2d')    

    const translateX = 400  // 让圆心在X轴的中心位置
    const bigRadius = 300   // 大圆半径
    const smallRadius = 150 // 小圆半径
    context.beginPath()
    for(let i = 0; i < 5; i++) {
      context.lineTo(
        Math.cos((18 + i * 72) / 180 * Math.PI) * bigRadius + translateX,
        -Math.sin((18 + i * 72) / 180 * Math.PI) * bigRadius + translateX
      )
      context.lineTo(
        Math.cos((54 + i * 72) / 180 * Math.PI) * smallRadius + translateX,
        -Math.sin((54 + i * 72) / 180 * Math.PI) * smallRadius + translateX
      )
    }
    context.closePath()

    context.lineWidth = 10
    context.stroke()

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

 绘制弯月

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

代码:

<!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;display:block;margin:50px auto;"></canvas>

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

    fillMoon(context, 2, 400, 400, 300, 0)

    function fillMoon(cxt, d, x, y, R, rot, fillColor) {
      cxt.save()
      cxt.translate(x, y)
      cxt.rotate(rot * Math.PI / 180)
      cxt.scale(R, R)
      pathMoon(cxt, d)
      cxt.fillStyle = fillColor || '#fb5'
      cxt.fill()
      cxt.restore()
    }

    function pathMoon(cxt, d) {
      cxt.beginPath()
      cxt.arc(0, 0, 1, 0.5*Math.PI, 1.5*Math.PI, true)
      cxt.moveTo(0, -1)
      cxt.arcTo(d, 0, 0, 1, dis(0, -1, d, 0) / d)
      cxt.closePath()
    }

    function dis(x1, y1, x2, y2) {
      return Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))
    }

  </script>
</body>

</html>

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

星空

<!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;display:block;margin:50px auto;"></canvas>

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

    const skyStyle = context.createLinearGradient(0, 0, 0, canvas.height)
    skyStyle.addColorStop(0.0, 'black')
    skyStyle.addColorStop(1.0, '#035')
    context.fillStyle = skyStyle
    context.fillRect(0, 0, canvas.width, canvas.height)

    for (let i = 0; i < 200; i++) {
      const R = Math.random() * 5 + 5
      const r = R / 2.0
      const x = Math.random() * canvas.width
      const y = Math.random() * canvas.height * 0.65
      const rot = Math.random() * 360

      drawStar(context, r, R, x, y, rot)
    }

    fillMoon(context, 2, 900, 200, 100, 30)

    drawLand(context)

    function drawLand(cxt) {
      cxt.save()

      cxt.beginPath()
      cxt.moveTo(0, 600)
      cxt.bezierCurveTo(540, 400, 660, 800, 1200, 600)
      cxt.lineTo(1200, 800)
      cxt.lineTo(0, 800)
      cxt.closePath()

      const landStyle = cxt.createLinearGradient(0, 800, 0, 0)
      landStyle.addColorStop(0.0, '#030')
      landStyle.addColorStop(1.0, '#580')
      cxt.fillStyle = landStyle
      cxt.fill()

      cxt.restore()
    }

    function fillMoon(cxt, d, x, y, R, rot, fillColor) {
      cxt.save()
      cxt.translate(x, y)
      cxt.rotate(rot * Math.PI / 180)
      cxt.scale(R, R)
      pathMoon(cxt, d)
      cxt.fillStyle = fillColor || '#fb5'
      cxt.fill()
      cxt.restore()
    }

    function pathMoon(cxt, d) {
      cxt.beginPath()
      cxt.arc(0, 0, 1, 0.5 * Math.PI, 1.5 * Math.PI, true)
      cxt.moveTo(0, -1)
      //cxt.arcTo(d, 0, 0, 1, dis(0, -1, d, 0) / d)
      cxt.quadraticCurveTo(1.2, 0, 0, 1)
      cxt.closePath()
    }

    function dis(x1, y1, x2, y2) {
      return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
    }

    function drawStar(cxt, r, R, x, y, rot) {
      cxt.save()

      cxt.translate(x, y)
      cxt.rotate(rot / 180 * Math.PI)
      cxt.scale(R, R)

      starPath(cxt)

      cxt.fillStyle = '#fb3'
      // cxt.strokeStyle = '#fd5'
      // cxt.lineWidth = 3
      // cxt.lineJoin = 'round'

      cxt.fill()
      //cxt.stroke()

      cxt.restore()
    }

    function starPath(cxt) {
      cxt.beginPath()
      for (let i = 0; i < 5; i++) {
        cxt.lineTo(
          Math.cos((18 + i * 72) / 180 * Math.PI),
          -Math.sin((18 + i * 72) / 180 * Math.PI)
        )
        cxt.lineTo(
          Math.cos((54 + i * 72) / 180 * Math.PI) * 0.5,
          -Math.sin((54 + i * 72) / 180 * Math.PI) * 0.5
        )
      }
      cxt.closePath()
    }

  </script>
</body>

</html>

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

圆角矩形

本质上是4条线段和4个弧线,共8个部分组成

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

代码:

<!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;display:block;margin:50px auto;"></canvas>

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

    drawRoundRect(context, 100, 100, 600, 400, 20)

    function drawRoundRect(cxt, x, y, width, height, radius) {
      cxt.save()
      cxt.translate(x, y)
      pathRoundRect(cxt, width, height, radius)
      cxt.strokeStyle = 'black'
      cxt.stroke()
      cxt.restore()
    }

    function pathRoundRect(cxt, width, height, radius) {
      cxt.beginPath()
      cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2)
      cxt.lineTo(radius, height)

      cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI)
      cxt.lineTo(0, radius)

      cxt.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2)
      cxt.lineTo(width - radius, 0)

      cxt.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2)
      cxt.closePath()
    }

  </script>
</body>

</html>

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

绘制2048棋盘

<!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;display:block;margin:50px auto;"></canvas>

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

    fillRoundRect(context, 150, 150, 500, 500, 10, '#bbada0')
    for(let i = 0; i < 4; i++) {
      for (let j = 0; j < 4; j++) {
        fillRoundRect(context, 170+i*120, 170 + j * 120, 100, 100, 6, '#ccc0b3')
      }
    }

    function fillRoundRect(cxt, x, y, width, height, radius, fillColor) {
      if (2*radius > width || 2*radius > height) {
        return
      }

      cxt.save()
      cxt.translate(x, y)
      pathRoundRect(cxt, width, height, radius)
      cxt.fillStyle = fillColor || 'black'
      cxt.fill()
      cxt.restore()
    }

    function strokeRoundRect(cxt, x, y, width, height, radius, lineWidth, strokeColor) {
      if (2 * radius > width || 2 * radius > height) {
        return
      }

      cxt.save()
      cxt.translate(x, y)
      pathRoundRect(cxt, width, height, radius)
      cxt.lineWidth = lineWidth || 1
      cxt.strokeStyle = strokeColor || 'black'
      cxt.stroke()
      cxt.restore()
    }

    function pathRoundRect(cxt, width, height, radius) {
      cxt.beginPath()
      cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2)
      cxt.lineTo(radius, height)

      cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI)
      cxt.lineTo(0, radius)

      cxt.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2)
      cxt.lineTo(width - radius, 0)

      cxt.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2)
      cxt.closePath()
    }

  </script>
</body>

</html>

图示:

canvas基础2 -- 形状、简单场景,可视化,css3,css,html

1文章来源地址https://www.toymoban.com/news/detail-726506.html

到了这里,关于canvas基础2 -- 形状、简单场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可视化系列讲解:canvas的动画实现

    1.1 Canvas绘图都是通过JavaScript 去操控的,如要实现一些交互性动画是相当容易的。那Canvas是如何做一些基本动画的? ◼ canvas可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。 ◼ 如需要执行动画, 不得不对画布上所有图形进行一帧一帧的重绘 (比如在1秒绘

    2023年04月08日
    浏览(21)
  • 数据可视化-canvas-svg-Echarts

    当没有设置宽度和高度的时候,canvas 会初始化宽度为 300 像素和高度为 150 像素。切记不能通过样式去设置画布的宽度与高度 宽高必须通过属性设置,如果使用样式设置,会导致画布内的坐标出现问题 给canvas画布添加文本内容、子节点没有任何意义 浏览器认为canvas标签是一

    2024年02月12日
    浏览(30)
  • Python网络爬虫爬取招聘数据(利用python简单零基础)可做可视化

    身为一个求职者,或者说是对于未来的职业规划还没明确目标的大学生来说,获取各大招聘网上的数据对我们自身的发展具有的帮助作用,本文章就简答零基础的来介绍一下如何爬取招聘数据。 我们以东莞的Python数据分析师这个职位来做一个简单的分析,页面如下图所示:

    2024年02月03日
    浏览(39)
  • HTML5+CSS3+JS小实例:音频可视化

    实例:音频可视化 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 【CSS】

    2024年01月18日
    浏览(36)
  • 可视化看板有那么多应用场景,该如何快速搭建?可视化工具该如何选择?

    在当今的信息化时代,数据已经成为了现代决策的核心。无论是企业战略规划、运营管理,还是个人生活决策,数据都扮演着至关重要的角色。随着数据分析技术和工具的不断进步,数据在决策中的作用将变得更加突出,对组织和个人的成功至关重要。 可视化看板是一种将复

    2024年04月23日
    浏览(52)
  • Unity制作数据可视化三维场景

    数据可视化大屏是这几年比较热门的一个方向,人们对数据的感知方式,也慢慢要求更严苛了。 Bi报表到数据可视化大屏,再到三维可视化大屏,这个发展趋势也体现了人们在使用数据可视化大屏时对效果的要求逐渐提高。 2维图表在过去几年的使用中,不断完善,已经有了

    2023年04月10日
    浏览(36)
  • 数据可视化在行业解决方案中的实践应用 ——华为云Astro Canvas大屏开发研究及指南

    本文主要探讨华为云Astro Canvas在数据可视化大屏开发中的应用及效果。首先阐述Astro Canvas的基本概念、功能和特性说明,接着集中分析展示其在教育、金融、交通行业等不同领域实际应用案例;之后,详细介绍使用该工具进行大屏图表创建的开发指南和最佳实践策略,包括模

    2024年02月08日
    浏览(33)
  • 山海鲸可视化软件:多场景下的数据呈现利器

    在当今数据驱动的时代,数据可视化成为了企业和个人不可或缺的工具。作为一个老数据人,本文想借用自己常用 山海鲸可视化软件 ,带大家了解在不同使用场景下数据可视化的应用。山海鲸可视化是一款可以 免费 编辑、本地化部署的产品,对数据可视化新人来说十分友好

    2024年02月21日
    浏览(38)
  • 利用大数据分析工具,实现多场景可视化数据管理

    https://yanhuang.yuque.com/staff-sbytbc/rb5rur? 购买服务器 购买腾讯云服务器,1300 元新人价,一年时间 ●4核16G内存 ●CentOS 6.7 (补充说明:最新的 2.7.1 GA 版本,8G 内存也是可以跑的,可以先使用8G,不够再做升级)。 安装docker环境 安装docker,速度还挺快的,大概3~5分钟内 1、注册鸿

    2024年02月14日
    浏览(43)
  • 真的!不用代码就能实现复杂的场景可视化大屏交互功能!

    在很多可视化项目中,如果想要实现场景可视化大屏交互的功能,程序员们总是需要敲很多代码,才能最终产出有效的交互效果,在这之中,如果出现个bug,那在一大串代码中寻找这个bug 的出处,又必然是一件让人头疼的事情。难道就没有一种不用敲代码就能实现场景可视化

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包