canvas判断画笔是否铺满区域

news2024/12/24 2:23:09

判断画布形状是否填满和百分比

在这里插入图片描述

<body>
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
</canvas>
<script>
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.strokeStyle = "#FF0000";
ctx.rect(20,20,150,100);
ctx.stroke();
	
	//模拟用户画笔填充
	ctx.fillStyle="#FF0000";
	ctx.fillRect(20,20,80,80);
	//获取画布中数据
	/*
	*	对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:
		R - 红色(0-255)
		G - 绿色(0-255)
		B - 蓝色(0-255)
		A - alpha 通道(0-255; 0 是透明的,255 是完全可见的)
	*/
	var imgData=ctx.getImageData(20,20,150,100);
</script> 

在这里插入图片描述

    在绘制完成后,使用ctx.getImageData()方法获取画布的像素数据 返回格式:Uint8ClampedArray
遍历像素数据,判断每个像素的颜色值是否等于画笔的颜色。如果相等,则说明该像素是由画笔绘制的;
如果不相等,则说明该像素不是由画笔绘制或者用户没有填充满。
根据遍历的结果,可以判断出画笔是否铺满整个画布。
不好理解的话,直接看最下面(尾部)图片后再来看

在这里插入图片描述
类似于这样,其中A是255
在这里插入图片描述

以下是一个示例代码:

// 获取绘图上下文和绘图目标  
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.strokeStyle = "#FF0000";
ctx.rect(20,20,150,100);
ctx.stroke();
	
	//模拟用户画笔填充
	ctx.fillStyle="#FF0000";
	ctx.fillRect(20,20,80,80);
	//获取画布中数据 获取像素数据  
	/*
	*	对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:
		R - 红色(0-255)
		G - 绿色(0-255)
		B - 蓝色(0-255)
		A - alpha 通道(0-255; 0 是透明的,255 是完全可见的)
	*/
	var imgData=ctx.getImageData(20,20,150,100);
  
	let data = imageData.data;  
  
	// 遍历像素数据,判断画笔是否铺满整个画布  
	let isFull = true;  
	for (let i = 0; i < data.length; i += 4) {  
	    if (data[i] !== 255 || data[i + 1] !== 0 || data[i + 2] !== 0 || data[i + 3] !== 255) {  
	        isFull = false;  
	        break;  
	    }  
	}  
  
	// 判断结果输出  
	console.log(isFull ? '已铺满' : '未铺满');

在上述示例代码中,假设画笔的颜色为红色(RGB值为255,0,0),则遍历像素数据时判断每个像素的RGB值是否都为红色,如果存在其他颜色,则说明画布未被铺满。
填充像素数据如下:
在这里插入图片描述
未填充地方如下:
在这里插入图片描述
百分比判断:

比方说这个正方形,通过if (data[i] !== 255 || data[i + 1] !== 0 || data[i + 2] !== 0 || data[i + 3] !== 255) 判断像素数据
当满足用户画笔的进行计数,和总共点数比例,即可得出百分比
如:

//满足用户在该形状中所画的图像数据点
let drawCount = 0; //满足的像素点
let total = data.length/4;   //总共像素点
if (!(data[i] !== 255 || data[i + 1] !== 0 || data[i + 2] !== 0 || data[i + 3] !== 255)){
	drawCount++;
}
//在区域形状内,用户画的比例
console.log((drawCount / total)*100+'%' )

判断canvas形状是否铺满,判断玩家在canvas形状中是否填满,判断玩家涂形状百分比

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

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

相关文章

智慧水务调度系统-智慧水务大数据可视化管理系统

平台概述 智慧水务调度系统平台&#xff08;智慧水务大数据可视化管理系统平台&#xff09;是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心&#xff0c;以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧…

数据库模型设计案例分享(GaussDB版)

目录 一、前言 二、应用系统数据库设计的基本流程 三、数据库模型设计 1、概念结构设计阶段 2、逻辑结构设计阶段 3、物理结构设计阶段 四、小结 一、前言 GaussDB数据库是一款企业级分布式数据库&#xff0c;支持集中式和分布式两种部署形态。它面向金融互联网交易和政…

面试官:说下简历中提到的优化……

作者&#xff1a;张力尹 先来点废话&#xff1a; 听说最近 Android 岗位变多了&#xff0c;你去面试了么&#xff1f; 面试官&#xff1a;你简历中提到了卡顿优化&#xff0c;做了哪些优化呢&#xff0c;展开说说。 你&#xff1a;哦&#xff0c;脑子飞速闪过网上的文章&#x…

Python模块pytest全局初始化和局部初始化前置后置操作

在 pytest 中&#xff0c;我们可以通过 conftest.py 文件来实现全局的前置和后置操作。 conftest.py 文件是一个特殊的 pytest 文件&#xff0c;它可以定义一些 fixture 和钩子函数&#xff0c;这些 fixture 和钩子函数可以在当前目录及其子目录下的所有测试文件中使用。 下面…

VR全景如何制作,可以用在哪些领域?

引言&#xff1a; 虚拟现实&#xff08;VR&#xff09;全景制作正在以惊人的速度改变着我们的感官体验。通过VR全景技术&#xff0c;我们可以身临其境地探索虚拟世界&#xff0c;感受前所未有的沉浸式体验。 一&#xff0e;如何进行VR全景制作 1.什么是VR全景制作&#xff1f…

【雕爷学编程】Arduino动手做(127)---2004A LCD液晶屏模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机网络——自顶向下方法(第五章学习记录)

本章学习网络层&#xff1a;控制平面 控制平面作为一种网络范围的逻辑&#xff0c;不仅控制沿着从源主机到目的主机的端到端路径间路由器如何转发数据报&#xff0c;而且控制网络层组件和服务如何配置和管理。 概述 通过前面的学习&#xff0c;我们已经知道转发表&#xff0…

Android使用echart展示图表

Android使用echart展示酷炫的图表 最近开发的时候&#xff0c;遇到了柱状图&#xff0c;刻度图等各种图表的展示。查资料发现&#xff0c;Android用的的最多的是MPAndroidChart&#xff0c;我也尝试了&#xff0c;一般的柱状图和饼状图都可以实现&#xff0c;但是刻度图就不行…

【复习《剑指Offer》1-5题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第六天 6/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】

环境搭建 1.项目工具 本项目涉及到的工具都有在云盘提供&#xff0c;自行下载即可 JDK8IDEA2021Tomcat8.5MySQL的客户端工具SQLYog… 2.项目搭建 通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp 设置项目的基础信息 3.基本配置 3.1 JDK配置 JDK使用的…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…

开发吐槽,谁说测试是二等公民,我们才是好吧

很多测试都认为自己是团队中的二等公民&#xff0c;从而各种看衰作贱自己。 这不&#xff0c;昨天在知乎上就看到一篇帖子&#xff1a;一女测试在团队中各种嘲讽自己的测试团队&#xff0c;“测试是低人一等的职业”&#xff0c;时刻劝说大家转开发。最后团队领导受不了&#…

机器学习:简介与类型

从翻译应用、商品推荐、医疗诊断到自动驾驶汽车&#xff0c;机器学习 (ML) 作为一种技术&#xff0c;都有用武之地。机器学习提供了一种解决问题、回答复杂问题以及创建新内容的新方式。机器学习可以预测天气、估算行程时间、推荐歌曲、自动补全句子、汇总文章以及生成全新的图…

【数据结构】串的基本定义及操作

&#x1f387;[数据结构]串的基本定义及操作&#x1f387; &#x1f308;积薪高于山&#xff0c;焉用先后别 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]串的基本定义及操作&#x1f387;&…

【运维心得】SAP EPM Add-In加载错误的另类解决方案

关键字&#xff1a;SAP BPC EPM OFFICE WPS 今天又解决了一个诡异的问题&#xff0c;记录一下&#xff0c;以备将来能够用上。 目录 问题现象 网上的方法 启发和解决 结论 问题现象 财务SAP系统需要BPC模块做报表&#xff0c;安装了OfficeEPM Add-In以后&#xff0c;结果…

抖音私域怎么做?

“私域流量”是如今备受市场瞩目的话题之一。众所周知&#xff0c;腾讯、阿里巴巴、抖音等互联网巨头已经开始布局私域资源&#xff0c;因此许多企业都希望在这些平台上获取生意增长。作为具有6亿日活跃用户的短视频平台&#xff0c;抖音也为企业提供了私域运营的阵地。那么&am…

2023年湖北黄冈人社局初、中级职称怎么评?申报条件是什么?启程别

2023年湖北黄冈人社局初、中级职称怎么评&#xff1f;申报条件是什么&#xff1f;启程别 想要评过人社局的初、中级职称&#xff0c;首先要满足申报条件&#xff0c;其次是要准备好申报资料&#xff0c;最后等待申报时间提交资料&#xff0c;等待结果。湖北目前改外全面线上申报…

SAP从入门到放弃系列之BOM技术类型-派生BOM-Part5

文章导航目录 一、概述二、基本概念-BOM技术类型三、BOM技术类型详解3.1、BOM技术类型-简单BOM&多重BOM 3.2、BOM技术类型-派生BOM 四、测试示例&#xff1a;4.1、数据准备4.2、创建派生BOM4.3、调整BOM组&#xff0c;更新派生BOM 一、概述 本来想在介绍BOM组的时候写这个…

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件&#xff08;诸如Get或Put&#xff09;之前或之后发生&#xff0c;相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程&#xff0c;因为它可以让你在RegionServer上对数据执行自定义计算&#xff0c;而不是在客户端上执行…