Canvas 文字碰撞检测并抽稀的方法


Posted in HTML / CSS onMay 27, 2019

需求背景

一般在做地图相关的需求是才会用到文字抽稀,我也是在为公司的地图引擎实现一个功能时才实现了该方法,在这里将其简化了,就在普通的 Canvas 上进行操作,并没有引入地图概念

效果

Canvas 文字碰撞检测并抽稀的方法

碰撞检测

计算文字在 canvas 中所占据的范围

// 计算文字所需的宽度
var p = {
  x: 10,
  y: 10,
  name: "测试文字"
};
var measure = ctx.measureText(p.name);
// 求出文字在 canvas 画板中占据的最大 y 坐标
var maxX = measure.width + p.x;
// 求出文字在 canvas 画板中占据的最大 y 坐标
// canvas 只能计算文字的宽度,并不能计算出文字的高度。所以就利用文字的宽度除以文字个数计算个大概
var maxY = measure.width / p.name.length + p.y;

var min = { x: p.x, y: p.y };
var max = { x: maxX, y: maxY };
// bounds 为该文字在 canvas 中所占据的范围。
// 在取点位坐标作为最小范围时,textAlign、textBaseline 按照以下方式设置会比较准确。
// 如设置在不同的位置展示,范围最大、最小点也需进行调整
// ctx.textAlign = "left";
// ctx.textBaseline = "top";
var bounds = new Bounds(min, max);

Bounds 范围对象

/**
 * 定义范围对象
 */
function Bounds(min, max) {
  this.min = min;
  this.max = max;
}

/**
 * 判断范围是否与另外一个范围有交集
 */
Bounds.prototype.intersects = function(bounds) {
  var min = this.min,
    max = this.max,
    min2 = bounds.min,
    max2 = bounds.max,
    xIntersects = max2.x >= min.x && min2.x <= max.x,
    yIntersects = max2.y >= min.y && min2.y <= max.y;

  return xIntersects && yIntersects;
};

检测

// 每次绘制之前先与已绘制的文字进行范围交叉检测
// 如发现有交叉,则放弃绘制当前文字,否则绘制并存入已绘制文字列表
for (var index in _textBounds) {
  // 循环所有已绘制的文字范围,检测是否和当前文字范围有交集,如果有交集说明会碰撞,则跳过该文字
  var pointBounds = _textBounds[index];
  if (pointBounds.intersects(bounds)) {
    return;
  }
}

_textBounds.push(bounds);
ctx.fillStyle = "red";
ctx.textAlign = "left";
ctx.textBaseline = "top";
ctx.fillText(p.name, p.x, p.y);

示例、代码地址

示例地址:示例

具体可查看完整代码:Github 地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
让IE6支持css3,让 IE7、IE8 都支持CSS3
Oct 09 HTML / CSS
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
Nov 05 HTML / CSS
css3编写浏览器背景渐变背景色的方法
Mar 05 HTML / CSS
使用 CSS3 中@media 实现网页自适应的示例代码
Mar 24 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
Jul 16 HTML / CSS
自定义html标记替换html5新增元素
Oct 17 HTML / CSS
HTML5的标签的代码的简单介绍 HTML5标签的简介
May 28 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
Jan 07 HTML / CSS
h5调用摄像头的实现方法
Jun 01 HTML / CSS
html5将图片转换成base64的实例代码
Sep 21 HTML / CSS
HTML5标签大全
Nov 23 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
Oct 16 HTML / CSS
利用canvas实现图片下载功能来实现浏览器兼容问题
May 31 #HTML / CSS
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
Jun 03 #HTML / CSS
详解利用canvas实现环形进度条的方法
Jun 12 #HTML / CSS
Html5 实现微信分享及自定义内容的流程
Aug 20 #HTML / CSS
前端canvas动画如何转成mp4视频的方法
Jun 17 #HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
Jul 10 #HTML / CSS
canvas实现有递增动画的环形进度条的实现方法
Jul 10 #HTML / CSS
You might like
支持oicq头像的留言簿(一)
2006/10/09 PHP
认识并使用PHP超级全局变量
2010/01/26 PHP
php生成随机密码的几种方法
2011/01/17 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
详解Python绘图Turtle库
2019/10/12 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
初入社会应届生求职信
2013/11/18 职场文书
房地产开盘策划方案
2014/02/10 职场文书
2015年端午节活动总结
2015/02/11 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
活动经费申请报告
2015/05/15 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2019财务转正述职报告
2019/06/27 职场文书
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL