ScratchCard刮刮卡交互元素的实现

Unity Shader实现刮刮乐效果:从纹理混合到GPU交互全解析 在计算机图形学中,Shader是运行在GPU上的小程序,它通过顶点和片元着色管线,直接控制屏幕上每个像素的最终颜色与表现。其核心原理在于对纹理采样、数学运算和颜色混合的并行处理,这使得Shader在实现动态视觉效果时,相比CPU方案具有显著的性能优势。在游戏与交互应用领域,这种技术价值尤为突出,能够高效实现如动态遮罩、实时混合等复杂渲染需求。具体到交互场景,刮刮乐效果便是一个典型应用,它要求根据用户输入实时更新遮罩纹理,并平滑混合涂层与底层内容。本文以Unity引擎为例,深入讲解如何通过编写自定义Unlit 阅读详情

效果展示

刮刮卡是⼀种常见的网页交互元素,通过模拟物理世界的刮涂层来揭示下方的内容。这种效果主要依赖于HTML5的 元素来实现。以下是⼀个基于TypeScript的刮刮卡实现示例,包括配置项、初始化方法和核心的刮开逻辑。下面是展示的效果
在这里插入图片描述
部分刮开效果:
在这里插入图片描述

具体实现

配置项

  1. 蒙层图片:可以是纯色或图片。
  2. 刮卡画笔半径:控制刮除区域的大小。
  3. 显示全部的比例:当刮除面积达到⼀定比例时,自动显示全部内容。
  4. 淡出时间:刮开涂层后的淡出动画时间。
  5. Canvas元素:用于绘制刮刮卡的HTML5 元素。

代码实现

首先,我们创建⼀个 ScratchCard.ts 文件,并定义 ScratchCard 类及其配置项接口。

interface ScratchCardConfig {
 canvas: HTMLCanvasElement; //传⼊的元素
 showAllPercent: number; //1. 到达什么⽐例之后展示全部
 coverImg?: string; //蒙层的图⽚
 coverColor?: string; //纯⾊蒙层
 doneCallback?: () => void; //完成之后的回调
 radius: number; //1. 刮卡画笔的半径
 fadeOut: number; //淡出时间
}
class ScratchCard {
 private config: ScratchCardConfig;
 private canvas: HTMLCanvasElement;
 private ctx: CanvasRenderingContext2D | null;
 private offsetX: number;
 private offsetY: number;
 private isDown: boolean;
 private done: boolean;
 constructor(config: Partial<ScratchCardConfig>) {
 const defaultConfig: ScratchCardConfig = {
 canvas: config.canvas!,
 showAllPercent: 65,
 coverImg: undefined,
 coverColor: undefined,
 doneCallback: undefined,
 radius: 30,
 fadeOut: 2000,
 };
 this.config = { ...defaultConfig, ...config };
 this.canvas = this.config.canvas;
 this.ctx = null;
 this.offsetX = 0;
 this.offsetY = 0;
 this.isDown = false;
 this.done = false;
 }
}
init实现

然后就是要写我们的init方法,在init⾥我们需要初始化数据并且把蒙层先画出来

重点解析

drawImage 用于绘制图像。
fillRect 用于绘制矩形,并且通过fillStyle属性设置绘制的颜色。
并且在绘制之前先充值了⼀下操作模式
globalCompositeOperation 用于标识要使用哪种合成或混合模式操作。
'source-over' 是默认设置,在现有画布内容上绘制新形状
'destination-out' 是将现有内容将保留在不与新形状重叠的位置,具体来说,它会在源图形和目标图形相交的区域,将目标图形的颜色变为透明。这里我们设置的蒙层就是目标图形
为了确保我们的刮刮卡生效,防止操作模式干扰,所以在init时直接将 globalCompositeOperation 重置为 'source-over'

class ScratchCard {
 private _init(): void {
 this.ctx = this.canvas.getContext('2d');
 this.offsetX = this.canvas.offsetLeft;
 this.offsetY = this.canvas.offsetTop;
 this._addEvent();
 if (this.config.coverImg) {
 const coverImg = new Image();
 // 添加跨域设置
 coverImg.crossOrigin = 'anonymous';
 coverImg.src = this.config.coverImg;
 coverImg.onload = () => {
 if (this.ctx) {
 this.ctx.globalCompositeOperation = 'source-over'; // 重置组合操作
模式
 this.ctx.drawImage(coverImg, 0, 0);
 this.ctx.globalCompositeOperation = 'destination-out';
 }
 };
 // 添加错误处理
 coverImg.onerror = (e) => {
 console.error('Image loading error:', e);
 // 加载失败时使⽤纯⾊背景作为后备⽅案
 if (this.ctx) {
 this.ctx.fillStyle = this.config.coverColor || '#CCCCCC';
 this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
 this.ctx.globalCompositeOperation = 'destination-out';
 }
 };
 } else if (this.ctx && this.config.coverColor) {
 this.ctx.fillStyle = this.config.coverColor;
 this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
 this.ctx.globalCompositeOperation = 'destination-out';
 }
 }
}
scratch实现

在实现刮刮卡的刮开效果时,关键在于通过 scratch 方法来模拟真实的刮除体验。在此过程中,一个至关重要的细节是正确处理触摸事件中的坐标获取。并且绘制鼠标划过的地方。

重点解析

这里在获取的时候不能直接获取 touch.clientX 和 touch.clientY ,因为Canvas 元素的实际
像素尺寸(往往与其在页面上的显示尺寸(通过 CSS 设置宽度和高度)不同步。如果直接使用未
缩放的坐标绘制内容,可能不会在正确的位置渲染,尤其是在高分辨率屏幕或有缩放的页面布局
中。通过这种方式,我们确保了绘制坐标的准确性。
绘制时我们先通过 beginPath 绘制⼀条路径,然后通过 arc 和之前传⼊的半径值来创建一个圆,最后使用 fill 方法进行填充,在混合透明的前提下,这里就会展示出被擦除的效果

class ScratchCard {
 private _scratch(e: MouseEvent | TouchEvent): void {
 e.preventDefault();
 if (!this.done && this.isDown && this.ctx) {
 let eventX: number;
 let eventY: number;
 const rect = this.canvas.getBoundingClientRect();
 if ('changedTouches' in e) {
 const touch = e.changedTouches[0];
 eventX = (touch.clientX - rect.left) * (this.canvas.width / rect.w
idth);
 eventY = (touch.clientY - rect.top) * (this.canvas.height / rect.h
eight);
 } else {
 eventX = (e.clientX + document.body.scrollLeft || e.pageX) - this.
offsetX || 0;
 eventY = (e.clientY + document.body.scrollTop || e.pageY) - this.o
ffsetY || 0;
 }
 //开始绘制
 this.ctx.beginPath();
 this.ctx.arc(eventX, eventY, this.config.radius, 0, Math.PI * 2);
 this.ctx.fill();
 // 如果透明的元素⽐例⼤于设置的值,则全部展现
 if (this._getFilledPercentage() > this.config.showAllPercent) {
 this._scratchAll();
 }
 }
 }
}

getFilledPercentage实现

然后就需要计算已经被擦除的比例,这里通过计算透明的像素的占比来确定擦除的比例

class ScratchCard {
 private _getFilledPercentage(): number {
 if (!this.ctx) return 0;
 // 获取画布的像素数据
 const imgData = this.ctx.getImageData(0, 0, this.canvas.width, this.ca
nvas.height);
 const pixels = imgData.data;
 const transPixels: number[] = [];
 // 遍历像素数据(⼀组像素有四个值RGBA所以需要+4)
 for (let i = 0; i < pixels.length; i += 4) {
 // 计算透明度是否⼩于128(128是0~255的中间值,低于128就被认为是半透明或透明
的)
 if (pixels[i + 3] < 128) {
 transPixels.push(pixels[i + 3]);
 }
 }
 // 返回百分⽐数据
 return Number(((transPixels.length / (pixels.length / 4)) * 100).toFixed(2));
 }
}

scratchAll实现

然后就是全部刮开的方法,这⾥需要处理⼀下淡出以及剩余的元素变透明的逻辑

class ScratchCard {
 private _scratchAll(): void {
 this.done = true;
 // 需要渐隐就添加渐隐效果,不需要就直接clear
 if (this.config.fadeOut > 0) {
 this.canvas.style.transition = `all ${this.config.fadeOut / 1000}s l
inear`;
 this.canvas.style.opacity = '0';
 setTimeout(() => {
 this._clear();
 }, this.config.fadeOut);
 } else {
 this._clear();
 }
 }
 private _clear(): void {
 if (this.ctx) {
 // destination-out 模式下,它会变成透明
 this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
 }
 // 如果有传⼊的回调就执⾏
 if (this.config.doneCallback) {
 this.config.doneCallback();
 }
 }
}

事件处理

最后我们只需要再加上事件监听,就可以实现刮刮卡的效果咯

重点解析

在addEventListener的option里,默认passive是false。但是如果事件是 touchstart 或touchmove的话,passive的默认值则会变成true(所以preventDefault就会被忽略了),所以这里单独给他写出来

class ScratchCard {
 private _addEvent(): void {
 this.canvas.addEventListener('touchstart',this._eventDown.bind(this),{
passive: false });
 this.canvas.addEventListener('touchend',this._eventUp.bind(this), { pa
ssive: false });
 this.canvas.addEventListener('touchmove',this._scratch.bind(this), { p
assive: false });
 this.canvas.addEventListener('mousedown',this._eventDown.bind(this), {
passive: false });
 this.canvas.addEventListener('mouseup', this._eventUp.bind(this), { pa
ssive: false });
 this.canvas.addEventListener('mousemove',this._scratch.bind(this), { p
assive: false });
 }
 private _eventDown(e: MouseEvent | TouchEvent): void {
 e.preventDefault();
 this.isDown = true;
 }
 private _eventUp(e: MouseEvent | TouchEvent): void {
 e.preventDefault();
 this.isDown = false;
 }
}
ScratchCard是一个js库,用于使用html5和canvas在浏览器中模拟刮刮卡。-JavaScript开发 Scratchcard-js ScratchCard是一个js库,用于在使用html5和canvas的浏览器中模拟刮刮卡。 您可以看到演示页面。 安装您可以使用npm安装ScratchCard:npm install --save scratchcard-js或j Scratchcard-js ScratchCard是一个js库,用于在使用html5和canvas的浏览器中模拟刮刮卡。 您可以看到演示页面。 安装您可以使用npm安装ScratchCard:npm install --save scratchcard-js或仅克隆此存储库:git clone https://github.com/Masth0/ScratchCard.git并选择文件夹./build the scratchard.min文件.js入门指南,从'scratchcard-js'导入{ScratchCard,SCRATCH_TYPE} const scContainer = document.getElementById('js--sc--container')const sc 立即下载

相关推荐

ScratchCard:HTML5 Canvas实现的刮刮卡

ScratchCard HTML5 Canvas实现的刮刮卡 项目迁移到

ScratchCard 项目使用教程

ScratchCard 项目使用教程 1. 项目目录结构及介绍 ScratchCard 项目的目录结构如下: ScratchCard/ ├── build/ │ └── dist/ ├── docs/ ├── src/ ├── types/ ├── .babelrc ├── .gitignore ├── .npmignore ├── LICENSE ├── deploy.sh ├── pack...

gitblog_00014的博客 498

canvas刮刮卡插件ScratchCard

ScratchCard是一款支持移动手机的HTML5 canvas刮刮卡插件。该刮刮卡插件支持移动触摸事件,提供刮卡的回调函数,简单易用,效果非常不错。演示地址:http://www.jq22.com/jquery-info10509

基于刮刮卡Vue组件发布一个NPM包

一、前言 项目中需要实现一个刮刮卡的模块,项目结束后沉淀项目时刚好可以把刮刮卡模块封装好,在下次新的项目中要用到时,可以更好的提高项目的效率,当然也更好地提供给其他小伙伴使用。 源码地址:github.com/ZENGzoe/vue… npm包地址:www.npmjs.com/package/vue… 刮刮卡组件的效果如下: 二、刮刮卡vue组件的实现 刮刮卡功能的实现可以分三步: 1. 工作流...

weixin_34061482的博客 2288

电影票购票小程序搭建(源码部署)

答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。

2301_79072569的博客 2068

轻量级NAS的隐秘战场:比特米盒CumeBox2与CasaOS的生态融合实践

本文探讨了比特米盒CumeBox2轻量级NAS设备与CasaOS操作系统的生态融合实践。通过硬件选型、系统部署、性能优化和应用场景分析,展示了如何将CumeBox2与CasaOS深度整合,打造经济实用的家庭数据管理中心,特别适合入门级用户和小型办公环境。

rl6adventurer的博客 895

ScratchCard - HTML5 和 Canvas 实现的刮刮卡效果库

ScratchCard - HTML5 和 Canvas 实现的刮刮卡效果库 1. 项目基础介绍及主要编程语言 ScratchCard 是一个使用 TypeScript 和 JavaScript 编写的开源库,它允许开发者通过 HTML5 和 Canvas 在浏览器中模拟刮刮卡效果。该项目旨在提供一种简单且易于集成的方式,让开发者可以在网页上创建富有吸引力的交互式刮刮卡。 2. 项目的核心功能 ...

gitblog_00831的博客 397

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 498

vue插件实现刮刮乐效果(移动端、PC端)

效果 使用方法 1、使用npm下载安装插件 npm install lzy-scratch-card --save 2、在需要使用的页面引入组件 import scratchCard from 'lzy-scratch-card' components: { scratchCard }, 3、在项目中使用 <template> <div class="index-body"> <scratch-card elem

Kino的博客 4029

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1328

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

写一个类似刮刮卡效果的交互,即鼠标划过时显示号码

要实现一个类似刮刮卡效果的交互,在前端开发中,你可以使用HTML、CSS和JavaScript。以下是一个简单的示例,展示如何使用这些技术创建一个刮刮卡效果,当鼠标划过时显示号码。

王铁柱666的博客 394

如何使用apifox打包测试用例生成测试套件自动化执行

使用apifox打包测试用例生成测试套件自动化执行

weixin_55613512的博客 2886

推荐一款轻量级的Android刮刮卡视图库 - Android Scratchcard

推荐一款轻量级的Android刮刮卡视图库 - Android Scratchcard 1、项目介绍 在移动应用中,你是否想要添加一种互动式的用户体验,例如流行的刮刮卡功能?现在,借助Android Scratchcard,你可以轻松实现这一目标。这是一个专门为Android平台设计的轻量级刮刮卡视图库,它允许你在应用中创建自定义刮刮卡效果,为用户提供乐趣和惊喜。 2、项目技术分析 Androi...

gitblog_00059的博客 434

【华为OD机试】真题E卷-一种字符串压缩表示的解压(C++)

有一种简易压缩算法:针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串aaabbccccd 经过压缩变成字符串 3abb4cd请您编写解压函数,根据输入的字符串, 判断其是否为合法压缩过的字符串若输入合法则输出解压缩后的字符串 否则输出字符串!error来报告错误。

u014481728的博客 894

SAP 基于生产订单行项目外部加工创建采购申请时的一个增强需求

摘要 本文介绍在SAP系统中实现生产订单外协工序自动生成采购申请(PR)时,将指定文本写入PR抬头文本的技术方案。关键点包括: 业务背景:通过CO02事务码将工序标记为外部加工,系统自动生成PR,需在生成时自动写入抬头文本。 技术难点: PR抬头文本存储在STXH/STXL而非EBAN表 标准增强点ME_PROCESS_REQ_CUST在外协场景可能不触发 推荐方案: 使用BAdI ME_REQ_POSTED,在PR过账时点执行 通过Text Object EBANH和Text ID(如B01)写入文本 实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 623

刮刮卡效果---自定义View

日积月累。还在学习中,今天学习了一个使用自定义View做的刮刮卡的效果,写篇博客分享一下,写的不好请各位大佬谅解直接进入主题。自定义控件嘛还是那一套,先创建一个cardview,继承view,实现构造方法。看代码public class ScratchCard extends View{ //画笔 private Paint paint; private Path pat...

qq_38933706的博客 370

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

闲着没事儿,用Canvas与React做一个刮奖,刮刮卡组件吧(已开源)

适用于刮刮卡,刮奖等业务话不多说,

jay1587的博客 466

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android 使用PorterDuff实现刮刮卡效果

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人。

2401_85730018的博客 610

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Unity刮刮卡插件实战:从Shader原理到高性能抽奖系统开发

在游戏开发中,Shader是实现复杂视觉效果的核心技术之一,它通过GPU并行计算高效处理像素级渲染。基于Render Texture和自定义Shader的渲染方案,能够将擦除、混合等运算放在GPU端执行,极大提升了交互性能。这种技术方案在移动游戏和应用中具有重要价值,尤其适用于需要实时像素操作和高性能反馈的互动场景,例如营销抽奖、儿童教育应用中的刮刮卡功能。通过专业插件,开发者可以快速集成生产级的刮刮卡系统,避免重复造轮子,将精力聚焦于核心业务逻辑。本文以Unity开发为例,深入解析刮刮卡插件的Shader

weixin_33722405的博客 393

【Unity 刮刮卡效果插件】Scratch Card 提供了非常流畅且逼真的刮刮卡效果。玩家可以通过拖动鼠标(或触摸屏)刮去覆盖物,揭示隐藏的内容。插件的刮除效果自然且响应迅速,极大提升了互动性

Scratch Card 是一款用于 Unity 的插件,旨在为游戏项目添加刮刮卡效果的功能。这个插件可以帮助开发者轻松地实现刮刮卡互动元素,适用于各种需要模拟刮刮卡或隐藏内容的游戏场景。无论是用于抽奖系统、奖励系统,还是互动式广告,Scratch Card 插件都能够快速地实现类似的功能。

2403_88403568的博客 962

Android 使用PorterDuff实现刮刮卡效果,4个改变你编程技能的小技巧

import android.graphics.Bitmap.Config; import android.graphics.Paint.Style; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff.Mode; import android.

m0_64604842的博客 547

刮刮卡效果

[img]http://dl2.iteye.com/upload/attachment/0088/6846/3c780213-d120-3927-8080-860489c44836.png[/img] 刮刮卡类: [code="java"] package com.reyo.view; import android.content.Context; import android....

gundumw100的专栏 129

ScratchCardView:刮刮卡视图组件

原文链接:https://github.com/pgorzelany/ScratchCardView ScratchCardView:刮刮卡视图组件。# 为开源点赞# —— 由SwiftLanguage分享 Example To run the example project, clone the repo, and run pod install from the Exampl

cleven 913

AndroidScratchCard

AndroidScratchCard 项目地址:myinnos/AndroidScratchCard  简介:Light Weighted Scratch Card View Library for Android 更多:作者   提 Bug    标签:   Light Weighted Scratchcard View Library for Android ...

未来很长,但我会努力的走下去。 361

Scratch Card Widget - 一个创新的Flutter组件

Scratch Card Widget 是一个开源的Flutter组件,它可以在移动应用中创建刮刮卡效果,以临时隐藏内容。该组件使用Dart语言开发,适用于Flutter框架,为开发者提供了一个简单易用的方式来添加刮刮卡功能到他们的应用中。 ## 2. 核心功能 - **多平台支持**:Scratch Card Widget 支持Android、iOS以及Web(仅限CanvasKit)平台。

gitblog_00841的博客 518
上一篇: apng-canvas的实现原理
今天你写算法了吗
博客等级 码龄6年 84粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值