本文深入分析了利用JS实现三维标签云的原理和方法。分享给大家参考,如下:
最近开始用画布做3D,也是很简单的一件事,就是球体转动。做好之后,突然想起之前看到的3D标签云。我曾经对这种凉爽感到非常疯狂。当时真的不知道怎么在飞机上模拟3D,所以就没做。现在只是用画布做3D,发现3D标签云也差不多,然后就写了。
具体怎么做,先说原理。3D标签云就是制作一个球面,然后在球面上取均匀分布的点,将这些点的坐标赋给标签,然后根据抽象出来的Z轴大小改变标签的字体大小和透明度,从而做出三维的感觉,然后就完成了球体。关键代码如下:
函数innit(){ for(var I=0;itagEle.lengthi ){ var a,b;var k=-1(2 *(I 1)-1)/Tagele . length;var a=Math . acos(k);var b=a * Math . sqrt(tagele . length * Math。PI);//var a=Math.random()*2*Math。PI;//var b=Math.random()*2*Math。PI;var x=RADIUS * math . sin(a)* math . cos(b);var y=RADIUS * math . sin(a)* math . sin(b);var z=RADIUS * Math . cos(a);var t=新标签(tagEle[i],x,y,z);tagEle[I]. style . color=' RGB(' parsent(math . random()* 255)',' parsent(math . random()* 255)',' parsent(math . random()* 255)')';tags . push(t);t . move();}}以上代码用于生成球体上点的x、y、z y、z轴的坐标。所用的是一个简单的球面方程:半径R和球的中心是已知的。一般来说,为了方便起见,我们都以坐标轴的原点为球的中心,有以下三个方程
x=r * sin*cosy=r * sin* sinz=r *cos;
也就是说,我们可以取和的随机数,得到圆上随机点的坐标。但这还不够,因为如果要做3D标签云,一个很重要的点就是平均分布。如果单纯取随机坐标,有些标注会重叠,相对不那么美观。所以我们引入第二个公式:
=arccos((2 * num)-1)/all-1);=* sqrt(all *);
Num是当前点数,all是总点数。我在别人的代码里发现了这个公式,不知道原理。但确实有效。
有了以上两个公式,我们就可以得到球面上所需要的均匀分布的点。然后对每个标签进行操作:
var scale=fall length/(fall length-this . z);var=(this . z RADIUS)/(2 * RADIUS);this . ele . style . font size=15 * scale ' px ';this . ele . style . opacity=alpha 0.5;this.ele.style.filter='alpha(不透明度='(alpha 0.5)* 100 ')';this . ele . style . zindex=ParSeint(scale * 100);this . ele . style . left=this . x CX-this.ele.offsetWidth/2 ' px ';this . ele . style . top=this . y CY-this.ele.offsetHeight/2 ' px ';FallLength是焦距,是一个常数,scale和alpha都是要根据z轴调整的刻度。后一种属性操作相对简单。调整字体大小,透明度和元素位置,球体将被制作。效果如下(忽略单词内容,乱涂乱画):
球体被制造出来了。是时候行动了。这时,引入了第三个公式,矩阵旋转算法:
也可以直接戳计算机图形的3D变换;
然后,我们可以写两个函数,一个是绕x轴旋转,另一个是绕y轴旋转。
函数rotateX(){ var cos=math . cos(angleX);var sin=数学