当前位置: 首页 > article >正文

Canvas 绘制曲线并实现鼠标点击高亮效果

使用 Canvas 绘制的曲线也可以实现鼠标点击高亮显示效果。由于 Canvas 是基于像素的绘制方式不像 SVG 是基于矢量的我们需要手动检测鼠标点击位置是否在曲线上并重新绘制高亮效果。实现方案基本思路存储所有曲线的路径数据监听鼠标点击事件检测点击位置是否在某条曲线上使用点是否在路径上的检测算法重新绘制所有曲线将选中的曲线高亮显示完整代码示例!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0titleCanvas曲线点击高亮示例/titlestylebody{font-family:Arial,sans-serif;display:flex;flex-direction:column;align-items:center;padding:20px;}h1{color:#333;}.container{margin-top:20px;border:1px solid #ddd;padding:10px;border-radius:5px;background-color:#f9f9f9;}canvas{border:1px solid #ccc;background-color:white;}.info{margin-top:15px;font-style:italic;color:#666;}/style/headbodyh1Canvas曲线点击高亮示例/h1p点击任意一条曲线可以高亮显示它/pdivclasscontainercanvasidcurveCanvaswidth600height400/canvas/divdivclassinfoidcurveInfo点击一条曲线查看详细信息/divscriptdocument.addEventListener(DOMContentLoaded,function(){constcanvasdocument.getElementById(curveCanvas);constctxcanvas.getContext(2d);constcurveInfodocument.getElementById(curveInfo);// 存储所有曲线的信息constcurves[{name:曲线1: 蓝色正弦波,color:#3498db,highlightColor:#ff9900,path:createSineWavePath(ctx,50,200,500,150,2)},{name:曲线2: 绿色方波,color:#2ecc71,highlightColor:#27ae60,path:createSquareWavePath(ctx,50,100,500,200)},{name:曲线3: 红色三角波,color:#e74c3c,highlightColor:#c0392b,path:createTriangleWavePath(ctx,50,300,500,200)}];letselectedCurveIndex-1;// 当前选中的曲线索引// 绘制所有曲线functiondrawCurves(){// 清空画布ctx.clearRect(0,0,canvas.width,canvas.height);// 绘制背景网格drawGrid();// 绘制所有曲线curves.forEach((curve,index){if(indexselectedCurveIndex){// 高亮显示选中的曲线ctx.strokeStylecurve.highlightColor;ctx.lineWidth4;}else{// 普通显示其他曲线ctx.strokeStylecurve.color;ctx.lineWidth2;}ctx.beginPath();ctx.moveTo(curve.path[0].x,curve.path[0].y);for(leti1;icurve.path.length;i){ctx.lineTo(curve.path[i].x,curve.path[i].y);}ctx.stroke();});}// 绘制背景网格functiondrawGrid(){ctx.strokeStyle#eee;ctx.lineWidth1;// 垂直线for(letx50;x550;x100){ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,canvas.height);ctx.stroke();}// 水平线for(lety50;y350;y100){ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(canvas.width,y);ctx.stroke();}}// 创建正弦波路径functioncreateSineWavePath(ctx,startX,startY,width,height,cycles){constpath[];constpoints100;for(leti0;ipoints;i){constxstartX(width/points)*i;constystartYMath.sin((i/points)*cycles*Math.PI*2)*height/2;path.push({x,y});}returnpath;}// 创建方波路径functioncreateSquareWavePath(ctx,startX,startY,width,height){constpath[];constsegments10;constsegmentWidthwidth/segments;for(leti0;isegments;i){constxstartXi*segmentWidth;lety;if(i%20){ystartY-height/2;}else{ystartYheight/2;}path.push({x,y});}returnpath;}// 创建三角波路径functioncreateTriangleWavePath(ctx,startX,startY,width,height){constpath[];constsegments10;constsegmentWidthwidth/segments;for(leti0;isegments;i){constxstartXi*segmentWidth;constprogressi/segments;lety;if(progress0.5){ystartY(progress*2-0.5)*height;}else{ystartY(1.5-progress*2)*height;}path.push({x,y});}returnpath;}// 检测点是否在路径上简化版适用于连续曲线functionisPointOnPath(point,path,tolerance5){for(leti0;ipath.length-1;i){constp1path[i];constp2path[i1];// 计算点到线段的距离constdistancepointToSegmentDistance(point,p1,p2);if(distancetolerance){returntrue;}}returnfalse;}// 计算点到线段的距离functionpointToSegmentDistance(point,p1,p2){constApoint.x-p1.x;constBpoint.y-p1.y;constCp2.x-p1.x;constDp2.y-p1.y;constdotA*CB*D;constlen_sqC*CD*D;letparam-1;if(len_sq!0){paramdot/len_sq;}letxx,yy;if(param0){xxp1.x;yyp1.y;}elseif(param1){xxp2.x;yyp2.y;}else{xxp1.xparam*C;yyp1.yparam*D;}constdxpoint.x-xx;constdypoint.y-yy;returnMath.sqrt(dx*dxdy*dy);}// 初始化绘制drawCurves();// 鼠标点击事件处理canvas.addEventListener(click,function(e){constrectcanvas.getBoundingClientRect();constmouseXe.clientX-rect.left;constmouseYe.clientY-rect.top;letfoundfalse;// 检查是否点击了某条曲线for(leti0;icurves.length;i){constpoint{x:mouseX,y:mouseY};if(isPointOnPath(point,curves[i].path)){selectedCurveIndexi;curveInfo.textContent已选择:${curves[i].name};foundtrue;break;}}// 如果没有点击任何曲线取消选择if(!found){selectedCurveIndex-1;curveInfo.textContent点击一条曲线查看详细信息;}// 重新绘制drawCurves();});});/script/body/html代码说明曲线存储:使用数组存储所有曲线信息包括名称、颜色、高亮颜色和路径点每种曲线类型有对应的路径生成函数绘制函数:drawCurves()负责绘制所有曲线根据选中状态应用不同样式drawGrid()绘制背景网格作为参考路径检测:isPointOnPath()检测点是否在路径上简化版适用于连续曲线pointToSegmentDistance()计算点到线段的最短距离交互处理:监听 canvas 的点击事件检测点击位置是否在某条曲线上更新选中状态并重新绘制优化建议性能优化:对于复杂曲线可以减少路径点数量或使用更高效的检测算法可以使用requestAnimationFrame优化重绘功能扩展:添加鼠标悬停效果支持多选曲线添加图例说明支持曲线动态修改精确检测:对于更精确的检测可以考虑使用 Canvas 的isPointInPath()方法但需要为每条曲线重新创建路径对象或者使用第三方库如paper.js或fabric.js提供更高级的交互功能这个实现展示了 Canvas 实现曲线点击高亮的基本方法你可以根据实际需求进一步优化和完善。

相关文章:

Canvas 绘制曲线并实现鼠标点击高亮效果

使用 Canvas 绘制的曲线也可以实现鼠标点击高亮显示效果。由于 Canvas 是基于像素的绘制方式(不像 SVG 是基于矢量的),我们需要手动检测鼠标点击位置是否在曲线上,并重新绘制高亮效果。 实现方案 基本思路 存储所有曲线的路径数…...

JX3Toy:剑网3智能宏辅助工具,让战斗操作提升34%效率

JX3Toy:剑网3智能宏辅助工具,让战斗操作提升34%效率 【免费下载链接】JX3Toy 一个自动化测试DPS的小工具 项目地址: https://gitcode.com/GitHub_Trending/jx/JX3Toy 在剑网3的激烈战斗中,你是否曾因复杂的技能循环而手忙脚乱&#xf…...

用Gemini3.1Pro一键重构文档,逻辑不清变清晰

你可能不是不会表达,而是表达的“骨架”没搭好:领导看到的是散点信息,却看不到因果链、结论依据和行动路径。于是就会出现一种很典型的反馈——“你这段话很好,但逻辑不清”“重点不突出”“我看不出你要我们做什么”。在这种情况…...

【限时开放】AISMM最新V2.3指标权重白皮书(仅剩217份):覆盖AI研发、MLOps、模型治理三大新增维度

更多请点击: https://intelliparadigm.com 第一章:AISMM模型核心维度与指标详解 AISMM(Artificial Intelligence Service Maturity Model)是面向AI服务全生命周期的成熟度评估框架,聚焦可衡量、可演进、可治理三大原则…...

SITS2026发布即锁死模板版本:2026年Q2起AISMM报告未使用新版模板=自动判定为无效评估

更多请点击: https://intelliparadigm.com 第一章:SITS2026发布:AISMM评估报告模板 SITS2026 正式发布了面向智能系统安全成熟度模型(AISMM)的标准化评估报告模板,该模板严格遵循 ISO/IEC 25001 和 NIST A…...

CloudCLI插件开发实战:从脚手架到依赖分析器

1. 项目概述:一个为IDE插件开发者准备的“开箱即用”脚手架 如果你正在为Claude Code UI(或者大家更习惯叫它CloudCLI)开发一个自定义插件,但苦于不知道从何下手,那么这个名为 cloudcli-plugin-starter 的项目就是你…...

CDecrypt:革命性的Wii U游戏解密工具,开启游戏内容探索新纪元

CDecrypt:革命性的Wii U游戏解密工具,开启游戏内容探索新纪元 【免费下载链接】cdecrypt Decrypt Wii U NUS content — Forked from: https://code.google.com/archive/p/cdecrypt/ 项目地址: https://gitcode.com/gh_mirrors/cd/cdecrypt 你是否…...

Cesium粒子特效实战:手把手教你封装一个可复用的‘火焰喷射器’组件(附完整代码)

Cesium粒子特效实战:手把手教你封装一个可复用的‘火焰喷射器’组件 在三维地理信息可视化项目中,动态粒子特效往往能带来画龙点睛的效果。想象一下,在智慧城市应急演练场景中,一个逼真的火焰特效能够直观展示火灾蔓延趋势&#x…...

从靶场到实战:sqli-labs第七关教会我的,不只是“菜刀连接”

从靶场到实战:sqli-labs第七关教会我的,不只是“菜刀连接” 在安全攻防的世界里,靶场练习往往被简化为“找到漏洞-利用漏洞-拿到flag”的三步曲。但真正有价值的学习,发生在关闭虚拟机之后的思考——为什么这个漏洞存在&#xff…...

3步实现Honey Select 2汉化:HS2-HF_Patch完整安装指南

3步实现Honey Select 2汉化:HS2-HF_Patch完整安装指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面而困扰吗&…...

taocp2_rsa_story

RSA公钥加密算法故事文件 确保互联网安全的算法:RSA 解析5W1H分析 What(是什么) RSA(Rivest-Shamir-Adleman)是一种非对称公钥加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它是目前…...

别再傻傻分不清!SCI论文Results、Discussion、Conclusion保姆级拆解(附写作模板)

SCI论文Results、Discussion、Conclusion的黄金分割法则:从数据到洞见的进阶写作指南 在科研写作的迷宫中,Results(结果)、Discussion(讨论)和Conclusion(结论)这三个章节构成了论文…...

艾尔登法环终极调试工具:从入门到精通完全指南

艾尔登法环终极调试工具:从入门到精通完全指南 【免费下载链接】Elden-Ring-Debug-Tool Debug tool for Elden Ring modding 项目地址: https://gitcode.com/gh_mirrors/el/Elden-Ring-Debug-Tool Elden Ring Debug Tool是一款专为《艾尔登法环》玩家和模组开…...

5个你必须掌握的TestDisk PhotoRec数据恢复实战技巧

5个你必须掌握的TestDisk & PhotoRec数据恢复实战技巧 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 你是否曾经因为误删分区而心跳加速?或者因为格式化硬盘而冷汗直流?别担心&a…...

程序员如何接受工作内容毫无意义?

知乎上有人问:程序员如何接受工作内容毫无意义? 他举了一堆例子。按钮文案从「氛围」改成「空间」,又改回来。一个按钮被疯狂点击后偶尔闪烁,测试提了bug,但觉得用户根本不会这么操作。git提交信息格式不对被打回。周报…...

论文降AI率工具哪个最好?2026 实测对比,毫无疑问是嘎嘎降AI!

毕业季论文提交前,很多同学都有一个共同的想法:先查一下论文的AI率,看看到底有多高,再决定要不要花钱处理。这个思路完全正确——盲目处理不如先摸清底数。但问题是,正规的AIGC检测动辄几十元一次,查完发现…...

告别格式噩梦:用Chinese-ERJ LaTeX模板3步搞定《经济研究》期刊投稿

告别格式噩梦:用Chinese-ERJ LaTeX模板3步搞定《经济研究》期刊投稿 【免费下载链接】Chinese-ERJ 《经济研究》杂志 LaTeX 论文模板 - LaTeX Template for Economic Research Journal 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-ERJ 还在为《经济…...

Self-E模型:实现任意步长可控的文生图扩散模型

1. 项目背景与核心价值 去年在开发一个创意设计工具时,我遇到了一个棘手的问题:现有的文生图模型要么生成速度慢,要么输出质量不稳定。这促使我开始思考如何构建一个既能灵活控制生成步长,又能保持图像质量的解决方案。Self-E模型…...

实战应用:基于快马平台构建并部署你的markdown技术博客

今天想和大家分享一个实战项目:如何用InsCode(快马)平台快速搭建个人技术博客系统。作为一个经常写技术笔记的开发者,我一直在寻找能同时满足写作、发布和部署需求的轻量级方案,这次实践下来发现整个流程比想象中简单很多。 项目整体设计思路…...

论文降AI率软件哪个最好?2026 实测对比,嘎嘎降是本科论文首选!

毕业季论文提交前,很多同学都有一个共同的想法:先查一下论文的AI率,看看到底有多高,再决定要不要花钱处理。这个思路完全正确——盲目处理不如先摸清底数。但问题是,正规的AIGC检测动辄几十元一次,查完发现…...

为什么83%的MCP 2026国产化项目在等保2.0三级测评中卡在审计日志模块?——基于GB/T 22239-2023的7类日志归集硬核改造方案

更多请点击: https://intelliparadigm.com 第一章:MCP 2026国产化项目等保2.0三级审计日志合规性总览 在MCP 2026国产化项目中,满足《网络安全等级保护基本要求》(GB/T 22239-2019)第三级关于“安全审计”的强制性条款…...

轻量级NVIDIA GPU监控方案:nvidia_gpu_exporter部署与实战

1. 项目概述:一个为普罗米修斯打造的轻量级NVIDIA GPU监控方案如果你在玩AI大模型、挖矿,或者是个追求极致帧率的硬核游戏玩家,手头大概率有几块NVIDIA显卡在日夜不停地工作。这时候,一个灵魂拷问就来了:我的显卡到底在…...

使用Taotoken CLI工具一键配置多开发环境与密钥

使用Taotoken CLI工具一键配置多开发环境与密钥 1. 安装Taotoken CLI工具 Taotoken CLI工具提供两种安装方式,适用于不同场景。对于需要频繁切换配置的开发者,建议全局安装: npm install -g taotoken/taotoken对于临时使用或项目级配置&am…...

AISMM模型落地不是咨询项目,而是组织能力手术:一位CTO亲述如何用90天重构AI治理中枢

更多请点击: https://intelliparadigm.com 第一章:AISMM模型在企业落地实践指南 AISMM(AI-Driven Service Maturity Model)是一种面向AI服务化演进的成熟度评估与实施框架,强调从数据治理、模型开发、服务编排到持续运…...

如何在3分钟内快速获取百度网盘提取码:云盘密码查询工具完全指南

如何在3分钟内快速获取百度网盘提取码:云盘密码查询工具完全指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为频繁查找云盘分享链接的提取码而烦恼吗?baidupankey这款云盘密码查询工具能帮你快…...

在Windows上5分钟搞定SNANDer编译:用Cygwin为CH347定制你的Flash烧录工具

在Windows上5分钟搞定SNANDer编译:用Cygwin为CH347定制你的Flash烧录工具 对于硬件极客和嵌入式开发者来说,能够亲手编译和定制自己的工具链是一种独特的成就感。今天,我们将带你快速在Windows系统下,通过Cygwin环境为CH347芯片编…...

如何用GetQzonehistory完整备份你的QQ空间记忆数据

如何用GetQzonehistory完整备份你的QQ空间记忆数据 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的社交记忆大多存储在云端平台,QQ空间作为承载…...

别只当它是Word!用WPS Office 2019 for Linux搞定公文、合同与长文档排版的完整指南

别只当它是Word!用WPS Office 2019 for Linux搞定公文、合同与长文档排版的完整指南 在Linux生态中处理专业文档常被视为"不可能的任务",直到WPS Office 2019 for Linux带来了一套完整的解决方案。不同于普通办公场景,公文、合同、…...

不同雨课堂版本,更新了新版本,老版本可能无法支持安装了

不同雨课堂版本,更新了新版本,老版本可能无法支持安装了RainClassroom_7.0.0.6721.exeRainClassroom_6.2.3.6701.exe...

Databricks AI Dev Kit:模块化LLM应用开发与RAG生产部署指南

1. 项目概述:AI开发者的“瑞士军刀” 如果你正在尝试将大型语言模型(LLM)集成到你的企业应用或数据产品中,大概率会经历这样一个过程:兴奋地找到一个开源模型,然后陷入一连串的“琐事”泥潭——模型怎么部署…...