canvas 仿迷盘旋转对称

2023-12-01 20:59
文章标签 对称 canvas 盘旋 仿迷

本文主要是介绍canvas 仿迷盘旋转对称,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

canvas 仿迷盘旋转对称

不知道大家玩没玩过迷盘这类的画图娱乐软件,前几天陪我家小孩子玩的时候,感觉挺有趣的,然后萌发了自己写一个类似的程序玩玩,然后就有了以下的这个程序。
话不多说,先奉上效果图看下:
canvas

demo地址:https://liuxiaochaogit.github.io/demo/fandisk/index.html

起初开始是想用多张canvas来实现这个功能,后来看别人的帖子,发现早就类似的程序了,然后还发现别人的思路更清晰,再然后就无耻的借用了别人的思路(请原谅我)。

主要使用了canvas的translate和rotate方法,如有对canvas不了解的小伙伴请自行百度。

过程:

  1. 首先需要准备两张画布,一张用来显示分割的扇形区域,另一张绘制

     // 绘制主体<canvas id="cvs" width="600" height="600">您的浏览器太low了,建议升级或者更换浏览器</canvas>// 用来分割扇形区域<canvas id="lineCvs" width="600" height="600">您的浏览器太low了,建议升级或者更换浏览器</canvas>// scriptlet canvas = document.getElementById('cvs'),lineCanvas = document.getElementById('lineCvs'),partition = document.getElementById('partition'),color = document.getElementById('color'),extent = document.getElementById('extent'),cvs = canvas.getContext('2d'),lineCvs = lineCanvas.getContext('2d'),radius = canvas.width,ob = {};
    
  2. 分割扇形区域很简单,其实就是根据数量计算角度,然后旋转到指定角度,画一半径,直至一圈画完

     // 绘制扇形分区  numdrawLine(num) {let _ob = {},centerX = _ob.startX = radius / 2,centerY = _ob.startY = radius / 2,moveX = _ob.moveX = radius / 2,moveY = _ob.moveY = 0,_this = this;// 角度let deg = 360 / num;for (var i = 0; i < num; i++) {// 弧度  deg * Math.PI / 180lineCvs.rotate(deg * Math.PI / 180);_this.draw(lineCvs, _ob);lineCvs.save();}}// 绘制draw(cvs, ob) {let _cvs = cvs,_ob = ob;_cvs.beginPath();// 坐标_cvs.moveTo(_ob.startX, _ob.startY);_cvs.lineTo(_ob.moveX, _ob.moveY);_cvs.stroke();}
    
  3. 这样的话你会发现是旋转了,但是他是围绕着(0,0)坐标旋转的,我们想要的是围绕中心旋转,这就用到了translate方法

     // 将中心点移动到画布的中心lineCvs.translate(lineCvs.canvas.width / 2, lineCvs.canvas.height / 2);// 绘制坐标也需要减去位移的距离draw(cvs, ob) {let _cvs = cvs,_ob = ob;_cvs.beginPath();// 坐标减去位移的长度_cvs.moveTo(_ob.startX - radius / 2, _ob.startY - radius / 2);_cvs.lineTo(_ob.moveX - radius / 2, _ob.moveY - radius / 2);_cvs.stroke();}
    
  4. 接下来就是主体了,首先我们需要监听鼠标事件,得到鼠标运动路径,并在画布上将轨迹画出来

     // 监听事件 画图canvas.addEventListener('mousedown', (e) => {let ob = {};let startX = ob.startX = ob.moveX = e.clientX - canvas.parentElement.offsetLeft + window.scrollX,startY = ob.startY = ob.moveY = e.clientY - canvas.parentElement.offsetTop + window.scrollY;document.addEventListener('mousemove', moveE = (e) => {ob.startX = ob.moveX;ob.startY = ob.moveY;let moveX = ob.moveX = e.clientX - canvas.parentElement.offsetLeft + window.scrollX,moveY = ob.moveY = e.clientY - canvas.parentElement.offsetTop + window.scrollY;draw(cvs, ob);});document.addEventListener('mouseup', (e) => {document.removeEventListener('mousemove', moveE);});});
    
  5. 是可以随意涂鸦了,但是怎么才能做到对称呢,这还得依靠rotate()这个牛叉的方法,我的思路是这样的,比如说被分成了6个扇形区域,那么这六个扇形区域内部的所有都必须是对称的,
    我们可以将一个区域复制六份,每个区域一份不就完了(为自己的机智点赞),其实就是旋转六次,每次都保存住画布状态,下次画的时候再取出状态,然后不就行了

     // 旋转rotateDraw(num, ob) {let deg = 360 / num,_this = this;// 位移 坐标定于圆心  让旋转围绕圆心旋转cvs.translate(radius / 2, radius / 2);for (var i = 0; i < 360; i++) {// 取出之前保存的状态cvs.restore();cvs.rotate(deg * Math.PI / 180);this.draw(cvs, ob);// 绘制完保存状态cvs.save();}}            
    
  6. 现在一个可以对称涂鸦的画板就成功了,有点注释,虽然不是很完美,有点注释,虽然不是很完美,但是相信差不多都能看懂,完整demo代码在这里 https://github.com/liuxiaochaoGit/demo/tree/master/fandisk

本文纯手打,有不当之处请留言!如果对小伙伴们有帮助的话,点赞啊,谢谢!

这篇关于canvas 仿迷盘旋转对称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/442675

相关文章

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[

影响画布微信小程序canvas及skyline和webview用户界面布局的关键流程

影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 目录 影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 一、微信小程序canvas开发流程 1.1、官方指南 1.2、客制化开发 第一步:在 WXML 中添加 canvas 组件 第二步:获取 Canvas 对象和渲染上下文 第三步 画布#ID选择器执行回调——

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信

Android canvas save restore saveLayer的异同点

一、基础操作 drawText、drawRect、drawColor等 对于这些基础操作,相信每一个安卓开发者都能说上个一二点出来,这些就不多做介绍,api 工程师必备技能之一。 在进阶之前,先回答这个问题:    问:canvas既然大家都理解为画布,那如果先在画布上绘制了某些内容,然后再canvas.rotate旋转了画布,为什么这些已经绘制在画布上的内容不会跟随着旋转?    答:由此可

自定义View-Canvas

转载自:https://www.jianshu.com/p/f69873371763 Android Canvas 方法总结 简介 在自定义 View的时候,我们经常需要绘制一些自己想要的效果。 这里就需要使用Canvas对象。 下面将Canvas对象常用方法做个笔记,方便记忆。 对Canvas进行操作 对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。 这些操作可以

canvas-实现放大镜效果

canvas-实现放大镜效果 目录 文章目录 前言推荐阅读代码展示结果展示 前言 本文为canvas实现放大镜逻辑简单,适合作为基础项目练手 推荐阅读 《H5 canvas核心技术》 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Comp

canvas-原生js实现时钟绘图效果

canvas-原生js实现时钟绘图效果 目录 文章目录 前言代码效果查看 前言 本文为canvas实现时钟效果可直接复制使用 代码 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta n

js-基于AudioContext在canvas上显示声音波形

js-基于AudioContext在canvas上显示声音波形 目录 文章目录 前言效果展示代码展示`index.html``Aud.js` 前言 从ES7后开始启用AudioContex常用API是:createScriptProcessor, onaudioprocess, getChannelData注意:onaudioprocess已经废弃,开始改用Analyse

【Canvas与纹饰】环形小蜜蜂纹饰

【成图】 【代码】 <!DOCTYPE html><html lang="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><head><title>环形小蜜蜂纹饰</title><style type="text/css">.centerlize{margin:0 auto;