echarts:graph图表拖拽节点

需求:实现一个可视化编辑器,用户可以添加节点,并对节点进行拖拽编辑等

在这里插入图片描述
实现期间碰到很多问题,特意记录下来,留待将来碰到这些问题的同学,省去些解决问题的时间

问题1:节点的data如下,不使用直角坐标系一切正常,但使用直角坐标系时,节点怎么不见了?

series: [{
    type: 'graph',
	data: [
		{ name: '1', x: 0, y: 0}, 
	    { name: '2', x: 10, y: 10 }
	]
}]
解决方法:开启坐标系后,坐标要以数组的方式存到value中
series: [{
    type: 'graph',
	coordinateSystem: 'cartesian2d',
	data: [
		{ name: '1', value: [0, 0] }, 
	    { name: '2', value: [10, 10] }
	]
}]

问题2:怎么拖拽节点?并且获得节点拖拽的偏移量呢?

1、在配置项中允许节点拖拽:draggable: true

series: [{
    type: 'graph',
    draggable: true,
}]

2、监听鼠标按下和松开的事件,按下时获得拖拽动作的初始坐标,松开时获得拖拽动作的结束坐标,比较后获得节点的偏移量

let dragCoords = null
myChart.on('mousedown', (e) =>{
	dragCoords = [e.event?.offsetX, e.event?.offsetY]
});
myChart.on('mouseup', (e) =>{
    const { offsetX, offsetY } =  e.event
    console.log('初始坐标:': dragCoords , '结束坐标:', [offsetX, offsetY] )
});

问题3:直接将坐标与偏移量进行加减,计算出来的坐标再赋值给节点,重新渲染后的节点位置与拖拽结束的位置不一样

原因: 出现这个问题,是因为坐标的数值与px的数值,它们只是一个正比例关系。

解决方法:
计算坐标轴的长度与屏幕可视区域宽高的比例,根据比例将节点在屏幕的偏移量转为在坐标系的偏移量。

举例: x轴刻度为1000,渲染在屏幕是500px,那么拖拽节点向右移动100px,节点的x坐标应该增加200

option: {
	xAxis: { show: true, type: 'value', min: -500, max: 500 },
    yAxis: { show: true, type: 'value', min: -1000, max: 0, },
	grid: {
      left: 0, right: 0, top: 50, bottom: 50,
    },
}

根据以上配置。可以得到:
x轴长度 = document.body.clientWidth
y轴长度 = document.body.clientHeight-50-50

当然,如果需求允许,设置grid.width=1000; grid.height=1000; 这样是最方便的,直接将坐标的数值与偏移量相加减,就可以得到新的坐标

  function updatePosition ( e: any) {
    if(!e.data.name || !dragCoords) return
    const [startX, startY] = dragCoords // 拖拽动作的初始位置
    const { offsetX, offsetY } =  e.event // 拖拽动作的结束位置
    const [ x, y ] = clip.value // 节点在坐标系内的坐标
    const { clientWidth, clientHeight } = document.body // 屏幕宽高。
    // x轴、y轴的刻度都1000
    // 根据option.grid的配置,x轴长度=clientWidth; y轴长度 = clientHeight - 50 - 50;
    // 将屏幕的偏移量数值,转为在坐标系中的偏移量数值
    const xCoord = x + (offsetX - startX) * 1000 / clientWidth
    const yCoord = y - (offsetY - startY) * 1000 / (clientHeight-100)
    console.log('节点的新坐标:', [xCoord , yCoord ]);
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/148613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需管理底层基础设施,亚马逊云科技向量数据库轻松创建ML增强的搜索体验和应用程序

当我们进入一家图书馆时,图书馆的入口处会有几台电脑供你检索相关的书籍,你可以检索你想要的书籍的名字例如:《百年孤独》、《悲惨世界》等等,你也可以检索作者例如:川端康成、鲁迅、加缪等等,当然你也可以…

读书充电,温暖你的冬日,本期为大家送出几本架构师成长和软件架构技术相关的好书,助你度过这个不太景气的寒冬!

目图书录 ⭐️《高并发架构实战:从需求分析到系统设计》⭐️《架构师的自我修炼:技术、架构和未来》⭐️《中台架构与实现:基于DDD和微服务》⭐️《分布式系统架构:架构策略与难题求解》⭐️《流程自动化实战:系统架构…

家电制造产线物料追踪RFID智能管理解决方案

家电行业需求 家电行业的生产节奏快,供应商众多,导致入厂车辆经常出现拥堵和等待的情况,生产线可能因为关键零部件物流未到位而停产,传统的家电制造行业生产物流模式主要依赖人工进行零部件的存储、拣选、配送、核对和发放等环节…

中国唯一!华为入选Gartner®企业低代码应用平台魔力象限

近日,全球咨询机构Gartner发布 《Magic Quadrant™ for Enterprise Low-Code Application Platforms》报告,华为入选该象限,作为中国唯一入选厂商,华为已连续两年入选Gartner企业低代码应用平台魔力象限。 华为云Astro低代码平台采…

动态获取填充表格数据时的特定值的赋值

1、如图 <el-tablev-loading"loading":data"columnList"bordertooltip-effect"dark":size"tableSize":height"tableHeight"style"width: 100%; margin: 15px 0"><el-table-column type"selection…

【MySQL】随手笔记(积跬步至千里)

一、常用函数 &#xff08;1&#xff09;uuid() select uuid(); //生成随机数 select replace(uuid(),-,); //将随机数的-去掉 select upper(replace(uuid(),-,)); ///改成大写应用举例&#xff1a; &#xff08;1&#xff09;非自增主键 非自增主键&#xff0c;insert语…

优化奥德赛:揭开训练人工神经网络的本质

一、介绍 近年来&#xff0c;人工智能领域取得了显著的进步&#xff0c;而这场革命的核心是训练人工神经网络 &#xff08;ANN&#xff09; 的复杂过程。这些网络受到人脑的启发&#xff0c;能够从数据中学习复杂的模式和表示。人工神经网络成功的核心是认识到训练它们从根本上…

Blackmagic Design DaVinci Resolve Studio18(达芬奇调色剪辑)mac/win中文版

在影视制作领域&#xff0c;调色和剪辑是至关重要的环节&#xff0c;它们直接决定了作品的观感和质量。而Blackmagic Design DaVinci Resolve Studio18&#xff08;达芬奇调色剪辑&#xff09;作为业界领先的专业调色剪辑软件&#xff0c;以其出色的性能和强大的功能&#xff0…

【Python】operator模块

Python中operator模块提供了一套与 Python 的内置运算符对应的高效率函数。 不仅对应内置运算符&#xff0c;还可以获取方法。可优化涉及回调函数的运算性能&#xff0c;比lambda、Python函数的开销小、速度快。 import operator[x for x in dir(operator) if not x.startswi…

【Linux】-文件系统的详解以及软硬链接

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

实现高值医疗耗材智能化管理的RFID医疗柜解决方案

一、行业背景 医疗物资管理面临着一系列问题&#xff0c;如高值耗材种类激增导致准入标准弱化、信息追踪困难、管理责任不明确等&#xff0c;医院内部设备、财务和临床科室相互独立&#xff0c;兼容性不佳&#xff0c;高值耗材储备不足&#xff0c;缺乏合理的预警机制&#xf…

卡尔曼家族从零解剖-(06) 一维卡尔曼滤波编程(c++)实践、透彻理解公式结果

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…

go语言学习之旅之go语言基础语法

学无止境&#xff0c;今天学习go语言的基础语法 行分隔符 在 Go 程序中&#xff0c;一行代表一个语句结束。没有结束符号 注释 注释不会被编译&#xff0c;每一个包应该有相关注释。 单行注释是最常见的注释形式&#xff0c;你可以在任何地方使用以 // 开头的单行注释。多…

淘宝账单导出的手工操作

文章目录 淘宝账单导出的手工操作概述笔记END 淘宝账单导出的手工操作 概述 日常的支付(JD, 淘宝, 1688), 最终都是用微信和支付宝来支付. 微信和支付宝是绑定的自己银行卡. JD绑定的也是自己的银行卡. 微信账单的导出, 已经记录了, 好使. 现在记录一下支付宝账单(只要是阿…

Jetson orin部署大模型示例教程

一、LLM介绍 LLM指的是Large Language Model&#xff08;大型语言模型&#xff09;&#xff0c;是一类基于深度学习的自然语言处理技术&#xff0c;其主要目的是让机器能够更好地理解和生成人类的自然语言文本&#xff0c;如文章、对话、搜索等。 教程 - text-generation-web…

类加载器(classloader)

作者&#xff1a;ZeaTalk 链接&#xff1a;https://www.zhihu.com/question/49667892/answer/690161827 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 类加载器&#xff08;classloader&#xff09; 先从类加载器…

如何使用AO交易和保护头寸,澳福3个指标轻松搞定

进入市场的第二个重要信号是基于投资者已经熟悉的令人敬畏的振荡器&#xff0c;称为AO。其工作原理类似于著名的MACD指示器&#xff0c;衡量市场的即时势头。它是一个5日均线减去34日均线。该指示器以红色和绿色柱状图的形式呈现&#xff0c;绿色柱状图表示市场势头向上&#x…

【Docker安装】windows系统安装docker

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、下载exe安装文件二、选择虚拟方式1.wsl2方式2.Hyper-V 三、启动docker Engine 守护进程1.启动docker 服务2.初始化守护进程 四、设置…

SpringBoot和Spring源码下载

1.下载&#xff1a;在一个空的干净地创建一个文件夹叫springsourcecode&#xff0c;其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的&#xff0c;今天为止2023年11月13日&#xff0c;idea是2023.2。 …

海报设计必备!五个免费网站分享,让你的创意得以充分展现!

海报作为一种重要的宣传工具&#xff0c;在各种场合得到了广泛的应用。然而&#xff0c;对许多人来说&#xff0c;制作一张漂亮的海报并不容易。幸运的是&#xff0c;有许多免费的海报制作网站可以帮助人们轻松地制作出漂亮的海报。本文将分享五个优秀的免费海报制作网站。 1.…