jtopo连线绘制脉冲动画效果

article/2025/8/15 4:40:29

        随着需求的日益精细化,人们越来越多的关注到了画面的美观,单纯的节点间连线已经不满足人们的审美观念了,那么能不能让节点间的连线动起来呢?答案是可以的,老规矩,先上图,再说怎么实现。

         同样,这次的改动也是基于jtopo-0.4.8-dev版本,有很多小伙伴留言问我能不能提供源代码下载,我这边也很想直接给大家一个可用的新版本,但是为了提高性能,目前我已经在0.4.8的基础上增加了太多与我们项目有关的东西了,想要直接分离出来一个新的版本还是比较困难的,所以说只能看后面有没有机会了,好了,言归正传,我们直接进入主题。

        想要绘制动画脉冲,大概有两种思路,一种是通过嫁接节点的方式,再使这种特殊的节点移动起来,造成视觉的动画脉冲,网上有这种实现的博客,但这种方式有种致命的缺点,因为增加了额外的节点,所以在绘制和保存的时候要有相应的增加和去除逻辑,相比较而言还是挺复杂的;另一种就是直接绘制,这样的好处是简洁,不用添加太多的代码,而且条理也简明明了,网上没有找到对应的博客,所以andsll只好自己来实现喽!

        首先,实现绘制脉冲的静态效果。既然是脉冲,而且最终的目标是让动起来,就跟复兴号一样沿着轨道运动,好吧,我们绘制一个椭圆再填充白色,天空蓝的边框,看起来就跟火箭一样,想想都很酷吧,哈哈,直接上代码:

         先是给传参line(要绘制的直线)增加了一个属性time,如果有time属性,取出它的数值赋值给变量time,如果没有,给当前连线增加time属性,紧接着,给time一个0.05的跳变增量,因为我们的目标是让“复兴号”在画布上动起来,即每次的X轴坐标是有规律的变化的,如上图所示,x=10+time*time(加10是因为我想让脉冲的出发点距离节点有一定的距离,这样美观一点),这里别忘了把跳变之后的time要更新到节点的自身属性,否则等绘制好后,脉冲永远停留在同一个位置,这不是我们想要的,当然,这里还有一个if的逻辑,这是为了确保折线和二次折线所有线段都能正常绘制,否则只能绘制折线最短的一部分,不用我说,大家肯定都能脑补到具体的原因哦!这里还需要注意如下的代码(很关键哦):

if (x<=len) {a.ellipse(x*k,0,10,2,k==1?0:Math.PI,0,Math.PI*2);
}

ellipse是绘制椭圆的函数,具体的参数说明这里不再累述,网上很多的,关键是这个if,len是当前线段的长度,如果x本身都大于len了,再去绘制势必要出界了啊,最终火车出轨这不是我们想要的,所以这里还可以给len减去一个固定值,这样更保险,从视觉上来讲更加的合理。

a.lineWidth = editor.config.linkDefaultWidth;

 这行代码是为了使画笔的宽度复原,因为下文再绘制脉冲之前有过调整画笔宽度。

        当然,上面的函数只是单纯的完成了脉冲的绘制,但是一个节点上既可能有出去的连线,也可能有回来的连线,即当前节点既可以是nodeA,也可能是nodeZ,针对不同的连线,我们想要的效果都是从初始点nodeA流向结束点nodeZ:

         代码的第一行很简单,就是单纯的计算出给定的两点间的距离len,第二行、第三行分别拿到了两点的atan和atan2(具体什么区别大家可以去百度,当然看过andsll之前博客的肯定都知道,在jtopo的项目实战(二)中本博主有过简单的介绍),紧接着就是moveTo 到脉冲初始点,以b点为初始原点,旋转一定的角度,因为上面的绘制函数中,为了使问题尽量的简洁,我们只处理了x坐标,所以这里我们必须旋转画布的x轴到跟b、c两点连线平行的位置。

if (angle1*2/Math.PI>1 || angle1*2/Math.PI<-1) {run_pulse(context,a,len,1,max_len);
}
else
{run_pulse(context,a,len,-1,max_len);
}

          这里的if和else主要是为了让连线拖动旋转任意角度时,脉冲都能正常绘制,具体的象限处理博主已经验证过了,放心使用。

        最后,具体的绘制函数搞定了,任意两点间线段的脉冲函数搞定了,当然是要在合适的位置加入函数调用了,绘制连线的位置调用?可行,但是存在先后顺序,而且要改动多个地方,因为直线、折线、二次折线都是在不同的代码段绘制的;那么在绘制文字的地方接入是否可行?答案也是否定的,连线没有文字标注是不是就不用绘制了?但是,每条连线都有绘制箭头的逻辑,而且三种连线都靠一个函数来完成箭头的绘制,在绘制箭头的地方调用接口来绘制脉冲岂不美哉?上代码:

 原本这个函数不长这样的:

this.paintArrow = function (b, c, d) {var e = this.arrowsOffset,f = this.arrowsRadius / 2,g = c,h = d,i = Math.atan2(h.y - g.y, h.x - g.x),j = a.util.getDistance(g, h) - this.arrowsRadius,k = g.x + (j + e) * Math.cos(i),l = g.y + (j + e) * Math.sin(i),m = h.x + e * Math.cos(i),n = h.y + e * Math.sin(i);i -= Math.PI / 2;var o = {x: k + f * Math.cos(i),y: l + f * Math.sin(i)},p = {x: k + f * Math.cos(i - Math.PI),y: l + f * Math.sin(i - Math.PI)};b.beginPath(), b.fillStyle = "rgba(" + this.strokeColor + "," + this.alpha + ")", b.moveTo(o.x, o.y), b.lineTo(m, n), b.lineTo(p.x, p.y), b.stroke(), b.closePath()}

可以看到,在原有函数的基础上,对传参做了修改,b是上下文,c是连线的倒数第二个点,d是最后一个点,修改后,b、c扩展成了从p1~p4共4个点的坐标(二次折线最多也就四个点),ditor.config.linkArrows是博主增加了一个是否需要绘制箭头的开关,同理editor.config.needs_run_pulse为是否开启脉冲动画的开关。这里使用try结构主要是为了兼容直线(只有两个点),折线(三个点),二次折线(四个点),当然这里考虑到性能问题,推荐大家使用if来判断。修改了传参,相应调用的地方也要做一些小的调整,博主就不啰嗦了,大家有疑问的或者哪里没有讲明白都可以留言,当然想要直接要代码的,双手奉上。

jtopo连线实现脉冲动画效果源码


http://chatgpt.dhexx.cn/article/OgBjf2ir.shtml

相关文章

jTopo入门 简单实现拓扑图

最近项目中需要绘制拓扑图&#xff0c;于是研究了下绘制拓扑图的组件&#xff0c;jtopo是一款比较简单易上手的开发工具包&#xff0c;分享给大家。 jtopo特点 1、完全基于HTML5 Canvas开发&#xff0c;API平易近人、几乎简单到了极致。 2、不依赖任何其他库、执行仅需一个Ca…

jtopo 实现一键布局

最近很忙、也很懒&#xff0c;一堆烦心事&#xff0c;jtopo后面不准备再深究了&#xff0c;本身东西也不多&#xff0c;做出的新功能&#xff0c;新特效也都写到博客中来了&#xff0c;今天给大家分享最近研究的一个新技能——jtopo一键布局&#xff0c;写给大家、也写给自己。…

jtopo简单实例

原贴地址 http://cn-arthurs.iteye.com/blog/2009345 说明: jtopo是一个基于canvas的js拓扑图形组件.比canvasexpress容易多了. 可以方便地加点,加连线,加鼠标事件,拖曳. 号称跨浏览器,不过实际上不支持ie678,加上excanvas.js也没用,除非像canvasexpress那样使用chrome插件. …

Vue — jTopo

近期在Vue项目中使用jTopo来制作集群节点拓扑图&#xff0c;官网http://www.jtopo.com/ 使用vue-cli搭建的模块化开发项目&#xff0c;使用第三方库最好的方式就是通过npm install xxx安装&#xff0c;然后在项目 里import xxx来使用&#xff1b;但是在JTopo官网上并没有发现有…

【Vue引入JTopo及所遇到的问题】

Vue引入JTopo及所遇到的问题 前言一、方案选型二、使用步骤三、总结 前言 项目过程中总是会遇到稀奇古怪的需求&#xff0c;这不&#xff0c;咱老大又让我画一个系统拓扑图放在首页&#xff0c;要求部分数据需从后端获取&#xff0c;动态展示在页面上。对于一个后端人猿来说&a…

Vue+JTopo(一)

1.下载js jtopo 更新下载 (不知道为什么网站被封禁了……在这提供下我现在用的 jtopo-1.4.4_trial-esm-min.js) 链接&#xff1a;https://pan.baidu.com/s/18V1HKwAuxzWM19RD4axGOg 提取码&#xff1a;0304 2.引用 文件放在public/js文件夹下&#xff0c;在index.hml内引用。…

jTopo(一)

jTopo(一) 一、jTopo是什么 jTopo&#xff08;Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。 jTopo关注于数据的图形展示&#xff0c;它是面向开发人员的&#xff0c;需要进行二次开发。 使用jTopo很简单&#xff0c;可以快速…

windows10下安装MSYS2+MinGW64

1.下载msys2&#xff0c;官方地址&#xff1a;http://www.msys2.org/&#xff0c;这里选择64位的安装器 2.安装完成之后&#xff0c;先别启动msys2&#xff0c;在 安装根目录/etc/pacman.d/ 下找到mirrorlist.mingw32、mirrorlist.mingw64和mirrorlist.msys并进行修改。 mirr…

Win10 下安装 MSYS2

什么是 MSYS2 MSYS2 &#xff08;Minimal SYStem 2&#xff09; 是一个MSYS的独立改写版本&#xff0c;主要用于 shell 命令行开发环境。同时它也是一个在Cygwin &#xff08;POSIX 兼容性层&#xff09; 和 MinGW-w64&#xff08;从"MinGW-生成"&#xff09;基础上…

【msys2】使用msys2下载工具的旧版本

背景 苯人在计组实验中使用了msys2来安装verilator工具&#xff0c;结果最新版本的verilator有bug&#xff0c;几经探索找到了利用msys2下载旧版本工具的方法&#xff08;还可以将现有工具更新为旧版本&#xff09; 步骤 现以安装旧版本的verilator为例讲解方法。 这是msys…

【Window环境下使用MSYS2搭建CMake + MinGW环境】

目录标题 安装CMakecmake 测试 MSYS2下载MSYS2安装MSYS2修改软件下载源 MSYS2下安装MinGW配置MinGW配置到环境变量 hello world测试 安装CMake Cmake下载地址:https://cmake.org/download/,下一个windows压缩包就好了&#xff0c;因为我比较喜欢自己来配置&#xff0c;免得不知…

用MSYS2安装mingw

文章目录 前言卸载mingw安装MSYS2 前言 安装MSYS2的原因是&#xff0c;在windows安装protobuf时&#xff0c;想用mingw编译protobuf的库&#xff0c;而protobuf的官方手册只给出一句&#xff1a; To build from source using Cygwin or MinGW, follow the Unix installation i…

【VSCode】【msys2】VS Code + msys2配置Windows下C/C++开发环境

【VSCode】【msys2】VS Code msys2配置Windows下C/C开发环境 一、Msys2配置 1. 下载msys2, 网址&#xff1a;https://www.msys2.org/ 2. 安装msys2-x86_64-xxxx.exe 这里没什难度&#xff0c;记住安装路径就好&#xff0c;一路next就装好了。 3. 安装gcc 3.1. 更新msys2…

Msys2记录

MSYS2 ​ MSYS2是MSYS的升级版&#xff0c;集成了pacman和Mingw-w64的Cygwin升级版&#xff0c;提供了Mingw-w64的GNU工具&#xff0c;包括GCC&#xff0c;同时移植了Arch Linux的软件包管理系统pacman&#xff0c;具备了Cygwin的POSIX API&#xff0c;理论上在Linux上的程序使…

msys2在windows10系统的安装

测试系统: windows 10 首先需要msys2的安装包,可以去官网下载安装包 官网地址: http://www.msys2.org/ 本次下载的是 msys2-x86_64-20180531.exe 注意:1.msys2不可以安装在FAT*分区    2.msys2不能安装在win XP系统上 1.双击msys2-x86_64-20180531.exe,并点击下一步选择安…

MSYS2使用教程——win10系统64位安装msys2最新版(msys2-x86_xxxx.exe)

一、安装 测试系统: windows 10 首先需要msys2的安装包,可以去官网下载安装包 官网地址: http://www.msys2.org/ 本次下载的是 msys2-x86_64-latest.exe 注意: 1. msys2不可以安装在FAT*分区 2. msys2不能安装在win XP系统上 指定好安装路径&#xff08;一般D根目录即可&#…

初步使用MSYS2

在此镜像站点下载&#xff0c; https://mirror.tuna.tsinghua.edu.cn/help/msys2/ 根据资料&#xff0c; MSYS2 &#xff08;Minimal SYStem 2&#xff09; 是一个MSYS的独立改写版本&#xff0c;主要用于 shell 命令行开发环境。同时它也是一个在Cygwin &#xff08;POSIX …

超详细教程:windows安装MSYS2(mingw gcc)——更新于2021.11

目录 安装 MSYS2官网&#xff1a;https://www.msys2.org/ 安装 下载安装程序&#xff08;官网首页有&#xff09;&#xff1a;msys2-x86_64-20210725.exe 或 CSDN&#xff1a;https://download.csdn.net/download/ymzhu385/45988277运行安装程序。MSYS2 需要 64 位 Windows 7…

Argparse 教程

官方文档 argparse --- 命令行选项、参数和子命令解析器 — Python 3.10.2 文档 别人的笔记Argparse 教程 — Python 3.10.2 文档https://docs.python.org/zh-cn/3/howto/argparse.html#id1完整的argparse的API argparse --- 命令行选项、参数和子命令解析器 — Python 3.8…

python argparse

argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数&#xff0c;然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册&#xff0c;并在用户给程序传入无效参数时报出错误信息。 使用argparse从命令行传入参…