Vue实现仿window画图

news/2024/11/15 4:50:48/

目录

一、演示功能

二、原理实现

(1)、绘制图形

(2)、绘制逻辑原理

 (3)、动画原理     

 (4)、图形变换原理

三、残留bug

四、源代码


一、演示功能

实现了绘制线、直线、矩形、圆 绘制时候还可以选择绘制属性(虚实线、填充图形、颜色)

可以执行图形变换操作 

演示

二、原理实现

web端绘制都是使用canvas实现

(1)、绘制图形

   以矩形来说明:

   canvas绘制矩形API:

strokeRect(x,y,w,h)
fillRect(x,y,w,h)

        绘制矩形需要一个点和长框就能绘制出矩形

        (这个两个API我认为不好,不能绘制倾斜的矩形)

(2)、绘制逻辑原理

(绘制矩形矩形)  在鼠标按下左键的时候记录鼠标第一个点,同时在鼠标未弹起的过程中移动鼠标获得第二个鼠标的点,绘制矩形api只需要(x,y,w,h)通过计算第二个点和第一个点的坐标差值就能得到w和h

  ctx.value.fillRect(Rect.frst.x, Rect.frst.y, Rect.last.x - Rect.frst.x, Rect.last.y - Rect.frst.y)

具体绘制代码(伪代码)

   //绘制矩形function RectDraw(){//填充 ctx.fillRect(x,y,w,h);//边框 ctx.strokeRect(x,y,w,h)ctx.value.strokeStyle=Rect.color;ctx.value.fillStyle=Rect.color;//是否是虚线if(Rect.isdotted==='Y'){ctx.value.setLineDash([8,10]); //单个长度  之间距离}else {ctx.value.setLineDash([8,0]);}//是否是边框if (Rect.isBody==='Y') { //边框ctx.value.strokeRect(Rect.frst.x, Rect.frst.y, Rect.last.x - Rect.frst.x, Rect.last.y - Rect.frst.y)}else { //填充ctx.value.fillRect(Rect.frst.x, Rect.frst.y, Rect.last.x - Rect.frst.x, Rect.last.y - Rect.frst.y)}}

 (3)、动画原理     

        绘制矩形时候的动画效果

        本质:  "清屏---绘制" 的重复

       在绘制矩形的过程中 鼠标按下后 记录第一个点,在鼠标移动过程中获得第二点,鼠标持续移动会产生多个“第二个点”也就是会绘制多个大小不一的矩形,在绘制这一个个矩形重叠起来就是一个动画过程,而我们需要的是最新的那个矩形;只需要在绘制前进行清屏操作就能保证绘制的是最新的图形;

                但在清屏的同时怎么做到不清除之前已经绘制好的图形呢?有小伙伴可能就说“直接局部清屏不就可以了嘛” ;不不不,没那么简单,局部清屏是不可控的。如果当前绘制图形在之前已经绘制好的图形附近或者图形上方(重叠)那么旧图形就会被“清屏”影响;

                那么到底该怎么实现呢?且听听我的解决办法,这个为动画效果的“清屏” 不仅仅是清屏,它需要在清屏的后再绘制之前已经绘制完成的数据就能做到在绘制新图形的情况下不干扰旧图形。

                那么怎么实现这个为动画而生的清屏方法呢?且听听我的解决办法,我把之前已经绘制完成的图形数据称为“死数据”,未绘制完成的图形数据称为“活数据”;什么时候算绘制完成呢?当鼠标左键按下后为开始准备绘制,鼠标移动执行重复绘制,当鼠标左键弹起即为绘制完成;这时候我们可以创建临时图形数据Rect来表示“活数据”,而“死数据”即为Rects是Rect的数组 ,当鼠标左键弹起的时候把当前Rect添加到Rects中保存。在清屏后再绘制Rects中的“死数据” 即完成了当前为动画而生的清屏方法。

                那么整体步骤是怎么样呢?鼠标左键按下时清空Rect中数据并且获得鼠标的坐标(保存到Rect中),鼠标移动过程中获得第二个点(保存到Rect中)开始绘制图形Rect (绘制前过程执行动画清屏函数clear),鼠标左键弹起时候结束绘画把Rect保存到Rects中。

     绘制具体代码 (伪代码)

//鼠标移动 具体绘画函数,function MouMove(mou) {if(isDraw.value===true) {if(isConver.value===false) { //不是图形变换再初始//画矩形的第二个点Rect.last.x= mou.offsetX;Rect.last.y= mou.offsetY;//画矩形if(drawWate.value==='Rect') {clear(); //进行清屏操作,同时会绘制之前已经绘制过的图形RectDraw(); //绘制矩形}}}}

 为动画而生的清屏函数(伪代码)

//清屏(用于动画)  并且绘制原来的数据function clear(){// /ctx.clearRect(x,y,w,h); // (擦除一个矩形范围)ctx.value.clearRect(0,0,1200,1000);RestroedAll(); //绘制原来已经绘制好的图形}

 (4)、图形变换原理

       canvas上已经绘制上的图形是不能进行操作的,那么实现图形变换呢?本质还是和实现动画效果是一致的,通过绘制一个选择框矩形,通过扫描Rects中的图形数据是否在当前选择框内,如果在当前内部就通过修改对应的数据就能实现;修改的数据通过鼠标坐标来转化得到,还是很简单,明白了动画原理做这个就是顺带的。

具体实现就不细说了。

三、残留bug

        一下子把完整无误的代码放出来就没意思了

        这个bug是图形变换上的,应为上面提到图形变换是通过一值扫描Rects中的数据来进行图形变换的;如果这样就会在平移过程中把所有在选择框内部的图形都会进行平移操作,也就会平移到另一个图形B过程中也会影响到图形B的状态。

        这里提一下解决办法,只需要在绘制选择框的时候扫描一次Rects即可,扫描后记录Rexcts中满足条件的数据,只需要操作满足条件的数据即可。

bug

四、源代码

        

        gitee地址:HTML5: 使用vue 实现canvas画图




觉得有用、有趣欢迎评论点赞收藏!


http://www.ppmy.cn/news/78346.html

相关文章

上海亚商投顾:沪指跌1.28%失守年线 大金融板块集体走弱

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日继续调整,沪指超1%逼近3200点,尾盘失守年线,创业板指较为抗跌。大…

thinkphp6中使用session设置无效问题的解决及注意事项

就如thinkphp官方在文档开头所描述的一样,ThinkPHP6.0基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化;其实从5.x版本开始thinkphp本身就是为api应用而生。特别是在6.0版本开始框架默认压根不开启和…

一百一十七、Hadoop——GZIP压缩并解压HDFS中的文件

一、解压HDFS中的gzip压缩文件 首先,先把HDFS中的gzip压缩文件下载到本地 [roothurys22 ~]# hdfs dfs -get /rtp/statistics/statistics2023-05-17.csv.gz /opt/hdfs_rtp/ 然后,在/opt/hdfs_rtp/目录下查看文件 [roothurys22 ~]# cd /opt/hdfs_r…

FreeRTOS中断配置和临界值

Cortx-M 中断 优先级分组 Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。高的抢占式优先级可以打断低的抢占式优先级&am…

Spring Security实现登录

前言 Spring Security是Spring框架下的一个用于身份验证和授权的框架,它可以帮忙管理web应用中的用户认证、授权以及安全性问题。本文将介绍如何使用Spring Security实现用户登录功能,本文主要包括以下内容: 环境准备Spring Security核心概…

软件测试流程

1、软件测试流程 通常,软件测试流程包括以下几个步骤: 需求分析:确定软件的功能和性能需求,明确测试范围,并编写相应的测试计划。 测试计划:根据需求分析,制定测试计划,包括测试范…

视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN

1. 基本介绍 MS7200 是一款 HDMI 接收芯片,兼容 HDMI1.4b 及 HDMI 1.4b 以下标准的视频 3D 传输格 式,最高分辨率可支持到 4K30Hz,最高采样率达到 300MHz。MS7200 支持 YUV 和 RGB 之 间的色彩空间转换,数字接口支持 YUV 及 RGB 格…

Android NFC研究工具包入门指南

目录 一、NFC简介 二、Android NFC研究工具包 三、NFC的开发环境配置 四、NFC的使用方法 五、Android Beam 六、总结 一、NFC简介 NFC(Near Field Communication)近场通信,是一种短距离的高频无线通信技术,允许电子设备之间…