HTML5 Canvas的交互式地铁线路图实现代码

地图稍微内容有点多,要全部展示,字显得有点小了,但是没关系,可以按照需求放大缩小,字体和绘制的内容并不会失真,毕竟都是用矢量绘制的~

界面生成

底层的 p 是通过 ht.graph.GraphView 组件生成的,然后就可以利用 HT for Web 提供好的方法,调用 canvas 画笔随便绘制就好,先来看看怎么生成底层 p:

var dm = new ht.DataModel();//数据容器var gv = new ht.graph.GraphView(dm);//拓扑组件gv.addToDOM();//将拓扑图组件添加进body中

addToDOM 函数声明如下:

addToDOM = function(){       var self = this,        view = self.getView(),           style = view.style;    document.body.appendChild(view); //将组件底层p添加到body中               style.left = '0';//默认组件是绝对定位,所以要设置位置    style.right = '0';    style.top = '0';    style.bottom = '0';          window.addEventListener('resize', function () { self.iv(); }, false); //窗口变化事件           }

现在我就可以在这个 p 上乱涂乱画了~首先我获取下载好的地铁线路图上的点,我将它们放在 subway.js 中,这个 js 文件全部都是下载的内容,我没有做其他的改动,主要是将这些点根据线路来分分配添加到数组中,比如:

mark_Point13 = [];//线路 数组内包含线路的起点和终点坐标以及这条线路的名称t_Point13 = [];//换成站点 数组内包含线路中的换乘站点坐标以及换成站点名称n_Point13 = [];//小站点 数组内包含线路中的小站点坐标以及小站点名称mark_Point13.push({ name: '十三号线', value: [113.4973,23.1095]}); mark_Point13.push({ name: '十三号线', value: [113.4155,23.1080]}); t_Point13.push({ name: '鱼珠', value: [113.41548,23.10547]}); n_Point13.push({ name: '裕丰围', value: [113.41548,23.10004]});

接下来来描绘地铁线路,我声明了一个数组 lineNum,用来装 js 中所有的地铁线路的编号,以及一个 color 数组,用来装所有的地铁线的颜色,这些颜色的 index 与 lineNum 中地铁线编号的 index 是一一对应的:

立即学习“前端免费学习笔记(深入)”;

var lineNum = ['1', '2', '3', '30', '4', '5', '6', '7', '8', '9', '13', '14', '32', '18', '21', '22', '60', '68'];var color = ['#f1cd44', '#0060a1', '#ed9b4f', '#ed9b4f', '#007e3a', '#cb0447', '#7a1a57', '#18472c', '#008193', '#83c39e', '#8a8c29', '#82352b', '#82352b', '#09a1e0', '#8a8c29', '#82352b', '#b6d300', '#09a1e0'];

接着遍历 lineNum,将 lineNum 中的元素和颜色传到 createLine 函数中,根据这两个参数来绘制地铁线路以及配色,毕竟 js 文件中的命名方式也是有规律的,哪一条线路,则命名后面一定会加上对应的数字,所以我们只需要将字符串与这个编号结合即可获得 js 中对应的数组了:

let lineName = 'Line' + num;let line = window[lineName];

createLine 的定义也非常简单,我的代码设置了不少的样式,所以看起来有点多。创建一个 ht.Polyline 管线,我们可以通过 polyline.addPoint() 函数向这个变量中添加具体的点,通过 setSegments 可以设置点的连接方式。

function createLine(num, color) {//绘制地图线    var polyline = new ht.Polyline();//多边形 管线    polyline.setTag(num);//设置节点tag标签,作为唯一标示        if(num === '68') polyline.setToolTip('A P M');//设置提示信息     else if(num === '60') polyline.setToolTip('G F');     else polyline.setToolTip('Line' + num);    if(color) {        polyline.s({//s 为 setStyle 的简写,设置样式            'shape.border.width': 0.4,//设置多边形的边框宽度            'shape.border.color': color,//设置多边形的边框颜色            'select.width': 0.2,//设置选中节点的边框宽度            'select.color': color//设置选中节点的边框颜色        });    }    let lineName = 'Line' + num;    let line = window[lineName];    for(let i = 0; i < line.length; i++) {        for(let j = 0; j < line[i].coords.length; j++) {            polyline.addPoint({x: line[i].coords[j][0]*300, y: -line[i].coords[j][1]*300});            if(num === '68'){//APM线(有两条,但是点是在同一个数组中的)                if(i === 0 && j === 0) {                    polyline.setSegments([1]);                }                else if(i === 1 && j === 0) {                    polyline.getSegments().push(1);                }                else {                    polyline.getSegments().push(2);                }            }            }    }    polyline.setLayer('0');//将线设置在下层,点设置在上层“top”    dm.add(polyline);//将管线添加进数据容器中储存,不然这个管线属于“游离”状态,是不会显示在拓扑图上的    return polyline;}

上面代码中添加地铁线上的点有分为几种情况,是因为 js 中设置线的时候 Line68 有一个“跳跃”点的现象,所以我们必须“跳跃”过去,篇幅有限 Line68 数组具体的声明自行看 subway.js。

这里说明一点,如果用的是 addPoint 函数,不设置 segments 时,默认将添加进的点用直线连接,segments 的定义如下:

1: moveTo,占用 1 个点信息,代表一个新路径的起点

2: lineTo,占用 1 个点信息,代表从上次最后点连接到该点

3: quadraticCurveTo,占用 2 个点信息,第一个点作为曲线控制点,第二个点作为曲线结束点

4: bezierCurveTo,占用 3 个点信息,第一和第二个点作为曲线控制点,第三个点作为曲线结束点

5: closePath,不占用点信息,代表本次路径绘制结束,并闭合到路径的起始点

所以我们要做“跳跃”的行为设置 segments 为 1 即可。

最后绘制这些地铁线上的点,这个部分 subway.js 中也分离出来了,命名以“mark_Point”、“t_Point”以及“n_Point”开头,我在前面 js 的展示部分有对这些数组进行解释,大家动动中指划上去看看。

我们在这些点的位置添加 ht.Node 节点,当节点一添加进 dm 数据容器中时,就会在拓扑图上显示,当然,前提是这个拓扑图组件 gv 设置的数据容器是这个 dm。篇幅有限,添加地铁线上的点的代码部分我只展示添加“换乘站点”的点:

var tName = 't_Point' + num;var tP = window[tName];//大站点if(tP) {//有些线路没有“换乘站点”    for(let i = 0; i < tP.length; i++) {        let node = createNode(tP[i].name, tP[i].value, color[index]);//在获取的线路上的点的坐标位置添加节点        node.s({//设置节点的样式style            'label.scale': 0.05,//文本缩放,可以避免浏览器限制的最小字号问题            'label.font': 'bold 12px arial, sans-serif'//设置文本的font        });        node.setSize(0.6, 0.6);//设置节点大小。由于js中每个点之间的偏移量太小,所以我不得不把节点设置小一些        node.setImage('images/旋转箭头.json');//设置节点的图片        node.a('alarmColor1', 'rgb(150, 150, 150)');//attr属性,可以在这里面设置任何的东西,alarmColor1是在上面设置的image的json中绑定的属性,具体参看 HT for Web 矢量手册(http://www.hightopo.com/guide/guide/core/vector/ht-vector-guide.html#ref_binding)        node.a('alarmColor2', 'rgb(150, 150, 150)');//同上        node.a('tpNode', true);//这个属性设置只是为了用来区分“换乘站点”和“小站点”的,后面会用上    }}

所有的地铁线路以及站点都添加完毕。但是!你可能会看不见自己绘制的图,因为他们太小了,这个时候可以设置 graphView 拓扑组件上的 fitContent 函数,我们顺便将拓扑图上的所有东西不可移动也设置一下:

gv.fitContent(false, 0.00001);//自适应大小,参数1为是否动画,参数2为gv与边框的padding值gv.setMovableFunc(function(){    return false;//设置gv上的节点不可移动});

这下你的地铁线路图就可以显示啦~接下来看看交互。

交互

首先是鼠标移动事件,鼠标滑过具体线路时,线路会变粗,悬停一会儿还能看到这条线路的编号;当鼠标移动到“换乘站点”或“小站点”,站点对应的图标都会变大并且变色,字体也会变大,鼠标移开图标变回原来的颜色并且字体变小。不同点在于鼠标移动到“换乘站点”时,“换乘站点”会旋转。

HTML5 Canvas的交互式地铁线路图实现代码

鼠标滑动事件,我直接基于 gv 的底层 p 进行的 mousemove 事件,通过 ht 封装的 getDataAt 函数传入事件 event 参数,获取事件下对应的节点,然后就可以随意操作节点了:

gv.getView().addEventListener('mousemove', function(e) {    var data = gv.getDataAt(e);//传入逻辑坐标点或者交互event事件参数,返回当前点下的图元    if(name) {        originNode(name);//不管什么时候都要让节点保持原来的大小    }    if (data instanceof ht.Polyline) {//判断事件节点的类型        dm.sm().ss(data);//选中“管道”        name = '';        clearInterval(interval);    }    else if (data instanceof ht.Node) {        if(data.getTag() !== name && data.a('tpNode')) {//若不是同一个节点,并且mousemove的事件对象为ht.Node类型,那么设置节点的旋转            interval = setInterval(function() {                data.setRotation(data.getRotation() - Math.PI/16); //在自身旋转的基础上再旋转            }, 100);        }        if(data.a('npNode')) {//如果鼠标移到“小站点”也要停止动画            clearInterval(interval);        }        expandNode(data, name);////自定义的放大节点函数,比较容易,我不粘代码了,可以去http://hightopo.com/   查看        dm.sm().ss(data);//设置选中节点        name = data.getTag();//作为“上一个节点”的存储变量,可以通过这个值来获取节点    }    else {//其他任何情况则不选中任何内容并且清除“换乘站点”上的动画        dm.sm().ss(null);        name = '';        clearInterval(interval);    }});

鼠标悬停在地铁线路上时显示“具体线路信息”,我是通过设置 tooltip 来完成的(注意:要打开 gv 的 tooltip 开关):

gv.enableToolTip();//打开 tooltip 的开关if(num === '68') polyline.setToolTip('A P M');//设置提示信息 else if(num === '60') polyline.setToolTip('G F'); else polyline.setToolTip('Line' + num);

然后我利用右下角的 form 表单,单击表单上的具体线路,或者双击拓扑图上任意一个“站点”或者线路,则拓扑图会自适应到对应的部分,将被双击的部分展现到拓扑图的中央。

HTML5 Canvas的交互式地铁线路图实现代码

form 表单的声明部分我好像还没有解释。。。就是通过 new 一个 ht.widget.FomePane 类创建一个 form 表单组件,通过 form.getView() 获取表单组件的底层 p,将这个 p 摆放在 body 右下角,然后通过 addRow 函数向 form 表单中添加一行的表单项,可以在这行中添加任意多个项,通过 addRow 函数的第二个参数(一个数组),对添加进的表单项进行宽度的设置,通过第三个参数设置这行的高度:

function createForm() {//创建右下角的form表单    var form = new ht.widget.FormPane();    form.setWidth(200);//设置表单宽度    form.setHeight(416);//设置表单高度    let view = form.getView();    document.body.appendChild(view);//将表单添加进body中    view.style.zIndex = 1000;    view.style.bottom = '10px';//ht组件几乎都设置绝对路径    view.style.right = '10px';    view.style.background = 'rgba(211, 211, 211, 0.8)';    names.forEach(function(nameString) {        form.addRow([//向表单中添加行            {//这一行中的第一个表单项                button: {//向表单中添加button按钮                    icon: 'images/Line'+nameString.value+'.json',//设置按钮的图标                    background: '',//设置按钮的背景                    borderColor: '',//设置按钮的边框颜色                    clickable: false//设置按钮不可点击                }            },            {//第二个表单项                button: {                    label: nameString.name,                    labelFont: 'bold 14px arial, sans-serif',                    labelColor: '#fff',                    background: '',                    borderColor: '',                    onClicked: function() {//按钮点击回调事件                        gv.sm().ss(dm.getDataByTag(nameString.value));//设置选中按下的按钮对应的线路                        gv.fitData(gv.sm().ld(), true, 5);//将选中的地铁线路显示在拓扑图的中央                    }                }            }        ], [0.1, 0.2], 23);//第二个参数是设置第一参数中的数组的宽度,小于1是比例,大于1是实际宽度。第三个参数是该行的高度    });}

单击“站点”显示红色标注,双击节点自适应放置到拓扑图中央以及双击空白处将红色标注隐藏的内容都是通过对拓扑组件 gv 的事件监听来控制的,非常清晰易懂,代码如下:

var node = createRedLight();//创建一个新的节点,显示为“红灯”的样式gv.mi(function(e) {//ht 中拓扑组件中的事件监听    if(e.kind === 'clickData' && (e.data.a('tpNode') || e.data.a('npNode'))) {//e.kind获取当前事件类型,e.data获取当前事件下的节点        node.s('2d.visible', true);//设置node节点可见        node.setPosition(e.data.getPosition().x, e.data.getPosition().y);//设置node的坐标为当前事件下节点的位置    }    else if(e.kind === 'doubleClickData') {//双击节点        gv.fitData(e.data, false, 10);//将事件下的节点自适应到拓扑图的中央,参数1为自适应的节点,参数2为是否动画,参数3为gv与边框的padding    }    else if(e.kind === 'doubleClickBackground') {//双击空白处        node.s('2d.visible', false);//设置node节点不可见 查看 HT for Web 样式手册(http://www.hightopo.com/guide/guide/core/theme/ht-theme-guide.html#ref_style)    }});

注意 s(style) 和 a(attr) 定义是这样的,s 是 ht 预定义的一些样式属性,而 a 是我们用户来自定义的属性,一般是通过调用字符串来调用结果的,这个字符串对应的可以是常量也可以是函数,还是很灵活的。

最后还做了一个小小的部分,选中“站点”,则该“站点”的上方会显示一个红色的会“呼吸”的用来注明当前选中的“站点”。

HTML5 Canvas的交互式地铁线路图实现代码

“呼吸”的部分是利用 ht 的 setAnimation 函数来完成的,在用这个函数之前要先打开数据容器的动画开关,然后设置动画:

dm.enableAnimation();//打开数据容器的动画开关function createRedLight() {    var node = new ht.Node();    node.setImage('images/红灯.json');//设置节点的图片    node.setSize(1, 1);//设置节点的大小    node.setLayer('firstTop');//设置节点显示在gv的最上层    node.s('2d.visible', false);//节点不可见    node.s('select.width', 0);//节点选中时的边框为0,不可见    node.s('2d.selectable', false);//设置这个属性,则节点不可选中    node.setAnimation({//设置动画 具体参见 HT for Web 动画手册(http://www.hightopo.com/guide/guide/plugin/animation/ht-animation-guide.html)        expandWidth: {            property: "width",//设置这个属性,并且未设置 accessType,则默认通过 setWidth/getWidth 来设置和获取属性。这里的 width 和下面的 height 都是通过前面设置的 size 得到的            from: 0.5, //动画开始时的属性值            to: 1,//动画结束时的属性值            next: "collapseWidth"//字符串类型,指定当前动画完成之后,要执行的下个动画,可将多个动画融合        },        collapseWidth: {            property: "width",            from: 1,             to: 0.5,            next: "expandWidth"        },        expandHeight: {            property: "height",            from: 0.5,             to: 1,            next: "collapseHeight"        },        collapseHeight: {            property: "height",            from: 1,             to: 0.5,            next: "expandHeight"        },        start: ["expandWidth", "expandHeight"]//数组,用于指定要启动的一个或多个动画    });    dm.add(node);    return node;}

全部代码结束!

总结

这个 Demo 花了我两天时间完成,总觉得有点不甘心啊,但是有时候思维又转不过弯来,花费了不少的时间,但是总的来说收获还是很多的,我以前一直以为只要通过 getPoints().push 来向多边形中添加点就可以了,求助了大神之后,发现原来这个方法不仅绕弯路而且还会出现各种各样的问题,比如 getPoints 之前,一定要在多边形中已经有 points 才可以,但是在很多情况下,初始化的 points 并不好设置,而且会造成代码很繁琐,直接通过 addPoint 方法,直接将点添加进多边形变量中,并且还会默认将点通过直线的方式连接,也不用设置 segments,多可爱的一个函数。

还有就是因为 ht 默认缩放大小是 20,而我这个 Demo 的间距又很小,导致缩放到最大地铁线路图显示也很小,所以我在 htconfig 中更改了 ht 的默认 zoomMax 属性,记住,更改这个值一定要在所有的 ht 调用之前,因为在 htconfig 中设置的值在后面定义都是不可更改的。

以上就是HTML5 Canvas的交互式地铁线路图实现代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 17:36:24
下一篇 2025年12月21日 17:36:45

相关推荐

  • H5中meta标签及作用

    本文主要和大家分享h5中meta标签及作用,希望能帮助到大家。 H5标准声明,使用 HTML5 doctype,不区分大小写 // 标准的 lang 属性写法 // 声明文档使用的字符编码 // 优先使用 IE 最新版本和 Chrome // 页面描述 // 页面关键词 // 网页作者 // 搜索引…

    好文分享 2025年12月21日
    000
  • MUI框架使用HTML5实现二维码扫描功能

    一、简介         Barcode模块管理条码扫描,提供常见的条码(二维码及一维码)的扫描识别功能,可调用设备的摄像头对条码图片扫描进行数据输入。通过plus.barcode可获取条码码管理对象。 二、实现的效果 三、实现 代码 立即学习“前端免费学习笔记(深入)”; #bcid{ width…

    2025年12月21日
    000
  • canvas中使用clip()函数裁剪方法

    在canvas中,可以使用clip()函数裁剪区域,设定裁剪区域后,只有在区域内的图像才能显示,其余部分会被屏蔽掉。本文主要和大家介绍了canvas裁剪clip()函数的具体使用的相关资料,希望能帮助到大家。 未使用裁剪绘制一个圆 *{margin:0; padding:0;} html, body…

    2025年12月21日 好文分享
    000
  • html canvas截取圆角图片的实现方法

    以前我们只能通过其他的截图工具来截取图像。现代浏览器的功能已经越来越强,随着h5的逐渐普及,浏览器本身就可以截图啦。html2canvas就是这样一款前端插件,它的原理是将dom节点在canvas里边画出来。虽然很方便,但有以下限制: 本文主要介绍html2canvas截图不能截取圆角图片的解决方案…

    2025年12月21日
    000
  • h5和c3怎样做出太阳系行星运转的动画效果

    这次给大家带来h5和c3怎样做出太阳系行星运转的动画效果,用h5和c3做出太阳系行星运转动画效果的注意事项有哪些,下面就是实战案例,一起来看一下。 做一个太阳系八大行星的运转动画,不包括行星的卫星,所有行星围绕太阳公转,行星采用纯色,暂时没有自转。 动画中包括:太阳及各行星,运行轨道,行星公转动画。…

    好文分享 2025年12月21日
    000
  • h5怎样实现输入框提示语+正常文本框提示语

    这次给大家带来h5怎样实现输入框提示语+正常文本框提示语,实现h5的输入框提示语+正常文本框提示语的注意事项有哪些,下面就是实战案例,一起来看一下。 placeholder=”  请输入用户名/手机号”; html5输入框提示语。 相信看了这些案例你已经掌握了方法,更多精彩请…

    好文分享 2025年12月21日
    000
  • h5的定时器怎样实现进度条功能

    这次给大家带来h5的定时器怎样实现进度条功能,h5的定时器实现进度条功能的注意事项有哪些,下面就是实战案例,一起来看一下。 在requestAnimationFrame出现之前,我们一般都用setTimeout和setInterval,那么html5为什么新增一个requestAnimationFr…

    好文分享 2025年12月21日
    000
  • 在Canvas中如何实现自定义路径动画?

    这次给大家带来在canvas中如何实现自定义路径动画?,canvas实现自定义路径动画的注意事项有哪些,下面就是实战案例,一起来看一下。 在最近的项目中笔者需要做一个新需求:在canvas中实现自定义的路径动画。这里所谓的自定义路径不单单包括一条直线,也许是多条直线的运动组合,甚至还包含了贝塞尔曲线…

    好文分享 2025年12月21日
    000
  • 怎样用H5预览PDF格式的文档

    这次给大家带来怎样用h5预览pdf格式的文档,h5预览pdf格式文档的注意事项有哪些,下面就是实战案例,一起来看一下。 简介 PDF.js is a Portable Document Format (PDF) viewer that is built with HTML5. PDF.js is c…

    好文分享 2025年12月21日
    000
  • H5的拖放应该如何实现

    这次给大家带来h5的拖放应该如何实现,实现h5拖放效果应该的注意事项有哪些,下面就是实战案例,一起来看一下。 简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置。 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。 先点击一个小例子:在用户开始拖动 元素时执行 JavaScript …

    好文分享 2025年12月21日
    000
  • H5的页面中怎样调用APP功能

    这次给大家带来h5的页面中怎样调用app功能,在h5的页面中调用app功能的注意事项有哪些,下面就是实战案例,一起来看一下。 在市面上经常见到这种功能现如今应该非常普遍了,淘宝H5,知乎H5等等。。。 点击后会调起APP或者打开下载页面或者直接进行下载。 但是我这里发现知乎的这个功能有点不一样 他的…

    好文分享 2025年12月21日
    000
  • h5怎样通过canvas来实现滚动弹幕功能

    这次给大家带来h5怎样通过canvas来实现滚动弹幕功能,通过canvas实现滚动弹幕功能的注意事项有哪些,下面就是实战案例,一起来看一下。 最近在着手开发弹幕视频网站,通过html5中的canvas实现了弹幕的功能。 那么闲言碎语不要讲,先说思路后上代码。 思路:从页面布局上来说就是将一块画布覆盖…

    好文分享 2025年12月21日
    000
  • 用H5和C3实现简单的时钟效果

    这次给大家带来用h5和c3实现简单的时钟效果,用h5和c3实现简单的时钟效果的注意事项有哪些,下面就是实战案例,一起来看一下。 目的: 利用html5,css实现钟摆效果 知识点: 1) 利用position/left/top和calc()实现元素的水平和垂直居中; 2) 利用CSS3的animat…

    好文分享 2025年12月21日
    000
  • h5如何实现记住密码功能

    这次给大家带来h5如何实现记住密码功能,h5实现记住密码功能的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML5 提供了两种在客户端存储数据的新方法: localStorage – 没有时间限制的数据存储 sessionStorage – 针对一个 session …

    好文分享 2025年12月21日
    000
  • H5的本地存储和本地数据库详细介绍

    这次给大家带来h5的本地存储和本地数据库详细介绍,使用h5的本地存储和本地数据库的注意事项有哪些,下面就是实战案例,一起来看一下。 本地存储 1.1 本地存储由来的背景 由于HTML4时代Cookie的大小、格式、存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cook…

    好文分享 2025年12月21日
    000
  • 怎样用h5的sse服务器发送EventSource事件

    这次给大家带来怎样用h5的sse服务器发送eventsource事件,用h5的sse服务器发送eventsource事件的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 我前面文章讲过数据大屏,里面的数据时时更新。还有时时更新的股票数据,Facebook/Twitter 更新、估价更新、新的…

    好文分享 2025年12月21日
    000
  • HTML5的WEB界面中meta实列详解

    这次给大家带来html5的web界面中meta实列详解,使用html5的web界面中meta的注意事项有哪些,下面就是实战案例,一起来看一下。 简介 meta标签是HTML语言HEAD区的一个辅助性标签。 meta常用于定义页面的说明,关键字,最后修改日期,和其它的元数据。这些元数据将服务于浏览器(…

    好文分享 2025年12月21日
    000
  • 关于html5中图片抛物线运动技巧分享

    本文主要介绍了浅谈关于h5中图片抛物线运动的一些心得,详细的介绍了沿贝塞尔曲线运动的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 常见的, 物体/图片做抛物线或者更准确的说是沿贝塞尔曲线运动是H5开发中常见的需求, 那么如何快速的根据设计稿计算出运动路径是开发者首要解决…

    2025年12月21日
    000
  • canvas实现高阶贝塞尔曲线

    本文主要介绍了canvas实现高阶贝塞尔曲线(n阶贝塞尔曲线生成器),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 写在最前 由于原生的Canvas最高只支持到三阶贝塞尔曲线,那么我想添加多个控制点怎么办呢?(即便大部分复杂曲线都可以用3阶贝塞尔来模…

    2025年12月21日 好文分享
    000
  • canvas使用贝塞尔曲线平滑拟合折线段的方法详解

    本文主要介绍了基于canvas使用贝塞尔曲线平滑拟合折线段的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 写在最前 本次分享一下在canvas中将绘制出来的折线段的棱角“磨平”,也就是通过贝塞尔曲线穿过各个描点来代替原有的折线图。 为…

    2025年12月21日 好文分享
    000

发表回复

登录后才能评论
关注微信