• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 地址

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

    上一篇:socket.io 和canvas 实现的共享画板功能
    下一篇:利用canvas实现图片下载功能来实现浏览器兼容问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

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