vue中实现3d词云效果(已封装组件)

<!--* @Description: 词云组件 页面* @Date: 2024/3/10 23:39
-->
<template><div:style="{display: 'flex',justifyContent: 'center',border: '1px solid red',}"><svg:width="width":height="height"@mousemove="listener($event)"@mouseout="listener1($event)"@mouseover="listener2($event)"><ahref="#"v-for="(tag, index) in tags":key="index"@click="showOptionsAndResult(tag.text)"><text:x="tag.x":y="tag.y":font-size="7 * (1000 / (800 - tag.z * 2))":font-weight="550":fill-opacity="(600 + tag.z) / 800":style="style(tag)">{{ tag.text }}</text></a></svg></div>
</template><script>
export default {props: {width: {type: Number,default: 600,},height: {type: Number,default: 600,},radius: {type: Number,default: 200,},},data() {return {speedX: Math.PI / 1800,speedY: Math.PI / 1800,tags: [],colorList: ["#e27027","#cc7b2e","#ad4331","#88343b","#d4902f","#c7a736","#8d7a3d","#8d7a3d","#d9b134",],CXNum: 2,CYNum: 2,};},computed: {CX() {return this.width / this.CXNum;},CY() {return this.height / this.CYNum;},},mounted() {let _this = this;window.addEventListener("resize",() => {let normalWidth = document.body.scrollWidth;_this.screenWidth = normalWidth;if (normalWidth <= 1550) {_this.CXNum = 2.7;_this.CYNum = 1.9;} else {_this.CXNum = 2.5;_this.CYNum = 1.8;}},false);setInterval(() => {this.rotateX(this.speedX);this.rotateY(this.speedY);}, 17);},methods: {rotateX(angleX) {var cos = Math.cos(angleX);var sin = Math.sin(angleX);for (let tag of this.tags) {var y1 = (tag.y - this.CY) * cos - tag.z * sin + this.CY;var z1 = tag.z * cos + (tag.y - this.CY) * sin;tag.y = y1;tag.z = z1;}},rotateY(angleY) {var cos = Math.cos(angleY);var sin = Math.sin(angleY);for (let tag of this.tags) {var x1 = (tag.x - this.CX) * cos - tag.z * sin + this.CX;var z1 = tag.z * cos + (tag.x - this.CX) * sin;tag.x = x1;tag.z = z1;}},listener(event) {var x = event.clientX - this.CX;var y = event.clientY - this.CY;this.speedX =x * 0.0001 > 0? Math.min(this.radius * 0.00002, x * 0.0001): Math.max(-this.radius * 0.00002, x * 0.0001);this.speedY =y * 0.0001 > 0? Math.min(this.radius * 0.00002, y * 0.0001): Math.max(-this.radius * 0.00002, y * 0.0001);},listener1(e) {this.speedX = Math.PI / 1800;this.speedY = Math.PI / 1800;},listener2(e) {this.speedX = 0;this.speedY = 0;},showOptionsAndResult(text) {this.$emit("showOptionsAndResult", true, text, "", "");},style(tag) {return `fill:${tag.color};`;},calculation3DWord(radius = "") {let tags = [];for (let i = 0; i < this.tags.length; i++) {let tag = {};let k = -1 + (2 * (i + 1) - 1) / this.tags.length;let a = Math.acos(k);let b = a * Math.sqrt(this.tags.length * Math.PI);tag.text =typeof this.tags[i] === "string" ? this.tags[i] : this.tags[i].text;if (radius === "") {tag.x = this.CX + this.radius * Math.sin(a) * Math.cos(b);tag.y = this.CY + this.radius * Math.sin(a) * Math.sin(b);tag.z = this.radius * Math.cos(a);} else {tag.x = 150 * (radius / 120) + radius * Math.sin(a) * Math.cos(b);tag.y = 150 * (radius / 120) + radius * Math.sin(a) * Math.sin(b);tag.z = radius * Math.cos(a);}if (i <= this.colorList.length - 1) {tag.color = this.colorList[i];} else {tag.color =i % this.colorList.length === 0? this.colorList[0]: this.colorList[i % this.colorList.length];}tags.push(tag);}this.tags.splice(0);this.tags = tags;},setTags(tags = []) {this.tags.splice(0);this.tags.push(...tags);this.calculation3DWord();},},
};
</script><style></style>
// 使用<wordCloudref="wordCloud":width="rBox3.width":height="rBox3.height"/>import wordCloud from "@/views/dataScreen/wordCloud.vue";components: { wordCloud },init() {this.$refs.wordCloud.setTags([1, 2, 3 ,4 ,5 ,6]);}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask 支持跨域访问 非常简单的方式 flask_cors

安装 pip install -U flask-cors from flask import Flask from flask_cors import CORSapp Flask(__name__) CORS(app)app.route("/") def helloWorld():return "Hello, cross-origin-world!"参考 https://www.cnblogs.com/anxminise/p/9814326.html …

【HarmonyOS】ArkUI - 自定义卡片样式

ArkUI - 自定义卡片样式 HarmonyOS API 9 没有提供原生的卡片样式&#xff0c;我定义了一个卡片样式&#xff0c;可以方便大家在日常开发中使用。 效果图&#xff1a; 卡片样式代码如下&#xff1a; Styles function card() {.width(95%).padding(20).backgroundColor(Col…

C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

1 割线法 割线法用于求方程 f(x) 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程&#xff0c;包括对根的线性插值。如果两个中间值之间的差值小于收敛因子&#xff0c;则迭代停止。 亦称弦截法&#xff0c;又称线性插值法.一种迭代法.指用割线近似曲线求…

ubuntu20.04环境搭建:etcd+patroni+pgbouncer+haproxy+keepalived的postgresql集群方案

搭建基于etcdpatronipgbouncerhaproxykeepalived的postgresql集群方案 宿主机操作系统:ubuntu20.04 使用kvm搭建虚拟环境(如没有安装kvm&#xff0c;请先自行安装kvm) 1、安装kvm服务 ①、查看虚拟支持 如果CPU 支持硬件虚拟化则输出结果大于0&#xff0c;安装kvm-ok命令检…

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager....

鸿蒙报错&#xff1a;Hhvigor Update the SDKs by going to Tools > SDK Manager… 打开setting里面的sdk&#xff0c;将API9工程下的全部勾上&#xff0c;应用下载 刚打开 js 和 Native 是没勾上的

小程序API能力集成指南——群组控制和功能页API汇总

群组控制 API ty.device.publishGroupDps 群组控制 需引入DeviceKit&#xff0c;且在>2.3.1版本才可使用 参数 Object object 属性类型默认值必填说明groupIdstring是groupId 群组 iddpsobject是dp 信息 示例: dps: {"1" : true}completefunction否接口调用结…

智慧城市与智慧乡村:共创城乡一体化新局面

一、引言 随着科技的不断进步和城乡发展的日益融合&#xff0c;智慧城市与智慧乡村的建设已成为推动城乡一体化发展的新引擎。智慧城市利用物联网、大数据、云计算等先进技术&#xff0c;实现城市治理、公共服务、产业发展等领域的智能化&#xff1b;而智慧乡村则借助现代科技…

vmware_docker启动

虚拟机centos7安装docker springboot项目调试 1,安装docker, 参考菜鸟教程 Docker 要求 CentOS 系统的内核版本高于 3.10 1,查看系统版本信息 [root@runoob ~]# uname -r 2,移除旧的版本,切换到root用户下操作 sudo yum remove docker \ d…

依赖注入与控制反转:优化Go语言REST API客户端

在这篇文章中&#xff0c;我将探讨依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IoC&#xff09;是什么&#xff0c;以及它们的重要性。作为示例&#xff0c;我将使用Monibot的REST API客户端。让我们开始吧&#xff1a; 一个简单的客户端实现 我们从一个简单的…

每日五道java面试题之springMVC篇(二)

目录&#xff1a; 第一题. 请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f;第二题. MVC是什么&#xff1f;MVC设计模式的好处有哪些?第三题. 注解原理是什么?第四题. Spring MVC常用的注解有哪些&#xff1f;第五题. SpingMvc中的…

Python模块百科_操作系统接口_os【三】

Python模块百科_操作系统接口_os【三】 os --- 多种操作系统接口【第一部分】一、相关模块1.1 os.path 文件路径1.2 fileinput 文件读取1.3 tempfile 临时文件和目录1.4 shutil 高级文件和目录1.5 platform 操作系统底层模块 二、关于函数适用性的说明2.1 与操作系统相同的接口…

C++ 中的头文件和源文件

#include<>一般用于包含系统头文件&#xff0c;诸如stdlib.h、stdio.h、iostream等&#xff1b; 类库目录下查找失败&#xff0c;编译器会终止查找&#xff0c;直接报错&#xff1a;No such file or directory. #include""一般用于包含自定义头文件&#xff…

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

stega1

题目链接&#xff1a;ctf.show 下载附件打开是一张jpg照片 无密码型jphs隐写得到flag flag{3c87fb959e5910b40a04e0491bf230fb}

微信小程序开发系列(二十五)·wxml语法·条件渲染wx:if, wx:elif, wx:else 属性组以及hidden 属性的使用

目录 1. 使用 wx:if、wx:elif、wx:else 属性组 2. 使用 hidden 属性 条件渲染主要用来控制页面结构的展示和隐藏,在微信小程序中实现条件渲染有两种方式: 1. 使用 wx:if, wx:elif, wx:else 属性组 2. 使用 hidden 属性 wx:if 和 hidden 二者的区别&#xff1a; 1. wx…

操作系统笔记(进程)

注&#xff1a; 下面图片资源来源于 王道计算机考研 操作系统 1.进程概念 进程&#xff08;process&#xff09;&#xff1a;是动态的&#xff0c;是程序的一次执行过程&#xff08;同一程序多次执行&#xff0c;会产生多个进程&#xff09;程序&#xff1a;是静态的&…

synchronized 锁的升级

锁的状态 synchronized 在jdk1.6之前是重量级锁&#xff0c;每次都要去和操作系统打交道&#xff0c;而操作系统层面的操作是比较耗性能的&#xff0c;需要将用户态转换为内核态。所以在jdk1.6后就有了锁的升级过程&#xff0c;总共有四种状态&#xff1a;无锁、偏向锁、轻量级…

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

指针【理论知识速成】(5)

一.回调函数&#xff1a; 1.什么事回调函数&#xff1a;通过函数指针调用函数 2.应用例子&#xff1a; https://blog.csdn.net/hot_water_oh/article/details/136572650?spm1001.2014.3001.5501 &#xff08;此链接为提到转义表所在博客的链接&#xff09; 依然以转义表为例…