摘要:資料正文部分了解了幾個公式之后,標簽云的旋轉(zhuǎn)其實就很簡單了。題外通過這次的練習才知道,學好數(shù)學是多么重要啊革命尚未成功,同志還需很努力參考文章解析標簽云,其實很簡單
開始之前
文章開始之前,應(yīng)該了解幾個重要的公式。回憶一下我們逝去的高中。
重要概念:
sinθ、cosθ的值得大小區(qū)間是[-1,1];
弧度跟角度的轉(zhuǎn)換公式是:弧度 = π/180 * 角度。
公式:
1、在空間直角坐標系中,以坐標原點為球心,半徑為R的球面的參數(shù)方程為:
x = r * sinθ * cosΦ; y = r * sinθ * sinΦ; z = r * cosθ;
說明:θ為點跟圓心的連線與z軸的夾角,Φ是點跟圓心連線在xy平面投影線與x軸的夾角(可以根據(jù)需要建立不同的坐標系,或者取不同的夾角,坐標的表達方式可以有很多,但原理是類似的)。
資料:http://baike.baidu.com/item/%E7%90%83%E9%9D%A2?fr=aladdin
2、旋轉(zhuǎn)公式:
x1 = cosθ * x - sinθ * y; y1 = cosθ * y + sinθ * x;
說明:(x,y)是開始的坐標,θ是旋轉(zhuǎn)的角度,(x1,y1)是結(jié)束的坐標。球繞某一條軸的旋轉(zhuǎn)可以抽象成圓繞圓心旋轉(zhuǎn),根據(jù)旋轉(zhuǎn)前的坐標和角度可以求出旋轉(zhuǎn)后的坐標。
資料:http://www.cnblogs.com/ywxgod/archive/2010/08/06/1793609.html
正文部分了解了幾個公式之后,3D標簽云的旋轉(zhuǎn)其實就很簡單了。原理就是把標簽當成一個點,通過設(shè)置不同的θ,Φ把它們平均分布在球面的各個坐標點上。 旋轉(zhuǎn)x軸或者y軸達到球體旋轉(zhuǎn)的目的。z軸是一條虛擬出來的軸,它與我們的屏幕垂直。我們不能真的實現(xiàn)一個立體的球體出來,但是我們可以通過"近大遠小"達到視覺的欺騙,呈現(xiàn)一種立體的感覺。
原理差不多說完了,接下來開始具體的代碼實現(xiàn)過程。
設(shè)置坐標設(shè)置坐標是最重要,也是相對難的一步,因為我們要達到平均分布,避免分布太過集中或者重疊。因為半徑是固定的,所以我們從角度出發(fā),調(diào)整角度達到平均分布的目的。接下來我們引入一位大神的式子,我也不知道出處是那里,但是確實很好用,式子如下:
θ = arccos(((2 * i) - 1) / len - 1); Φ = θ * sqrt(len * π);
第一個式子arccos中的((2 * i) - 1) / len - 1其實是一個[-1,1]區(qū)間上關(guān)于0對稱分布的等差數(shù)列,通過反余弦轉(zhuǎn)換成弧度值,的確是一個很高明的式子,學渣的我確實想不出來。第二個式子,是關(guān)于θ的等差(變量只有θ),不過參數(shù)sqrt(len * π)的取值就不是很懂了,還望知情的大神告知。
具體的代碼如下:
分配坐標:
var init = function() { const tagEle = cloud.querySelectorAll(".tag"), tagLen = tagEle.length; for(let i = 0; i < tagLen; i++) { // 設(shè)置隨機坐標,平均分布 let a = Math.acos((2 * (i + 1) - 1) / tagLen - 1), // θ = arccos(((2*(i+1))-1)/len - 1) b = a * Math.sqrt(tagLen * Math.PI), // Φ = θ*sqrt(all * π) x = R * Math.sin(a) * Math.cos(b), // x軸坐標: x=r*sinθ*cosΦ y = R * Math.sin(a) * Math.sin(b), // y軸坐標: x=r*sinθ*cosΦ z = R * Math.cos(a), // z軸坐標: z=r*cosθ t = new tag(tagEle[i] , x , y , z); tagEle[i].style.color = "#" + Math.floor(Math.random() * 0xffffff).toString(16); // 設(shè)置隨機顏色 tags.push(t); t.move(); // 初始化位置 } animate(); // 旋轉(zhuǎn) };
設(shè)置坐標及參數(shù):
let scale = _focalLength / (_focalLength - this.z), alpha = (this.z + R) / (2 * R), ele = this.ele; ele.style.fontSize = 14 * scale + "px"; ele.style.opacity = alpha + 0.5; ele.style.zIndex = parseInt(scale * 100); // 原點是 (cloud.offsetWidth/2, cloud.offsetHeight/2) ele.style.left = this.x + cloud.offsetWidth / 2 - ele.offsetWidth/2 + "px"; ele.style.top = this.y + cloud.offsetHeight / 2 - ele.offsetHeight/2 + "px";
scale、alpha 都是取關(guān)于z坐標的遞增函數(shù),所以可以根據(jù)需要調(diào)整函數(shù)達到更好的顯示效果。
旋轉(zhuǎn)開始的時候我們簡單介紹了圓的旋轉(zhuǎn),球的旋轉(zhuǎn)其實類似圓。例如繞z軸旋轉(zhuǎn),其實改變的是x,y坐標的值,z坐標的值并沒有變化。理解了這一層,我們可以得出繞x軸旋轉(zhuǎn)的和y軸旋轉(zhuǎn)的函數(shù),分別為:
/* 繞x軸旋轉(zhuǎn) y = ycosθ - zsinθ; z = ysinθ + zcosθ; */ function rotateX() { let cos = Math.cos(angleX), sin = Math.sin(angleX); tags.forEach(function(tag) { let y = tag.y * cos - tag.z * sin, z = tag.z * cos + tag.y * sin; tag.y = y; tag.z = z; }) }; /* 繞y軸旋轉(zhuǎn) x = xcosθ - zsinθ; z = xsinθ + zcosθ; */ function rotateY() { let cos = Math.cos(angleY), sin = Math.sin(angleY); tags.forEach(function(tag) { let x = tag.x * cos - tag.z * sin, z = tag.z * cos + tag.x * sin; tag.x = x; tag.z = z; }) };
于是我們就能通過控制angleX、angleY的大小來達到旋轉(zhuǎn)的目的了,值越大,單位時間旋轉(zhuǎn)的角度越大,也就是旋轉(zhuǎn)的速度越快。當然,旋轉(zhuǎn)360度跟沒旋轉(zhuǎn)的效果是一樣的,所以我們應(yīng)該合理的設(shè)置單位時間和每一次旋轉(zhuǎn)的角度值,讓我們的眼睛知道它是個球,它在轉(zhuǎn)?。?!
全部代碼這是我在百度前端學院的一個課程練習的代碼,代碼全部放在Github上,希望對您有一點幫助。同時,Github求關(guān)注?。?!
預(yù)覽效果: http://alvin-liu.github.io/FrontCode/src/tagcloud/
代碼地址: https://github.com/Alvin-Liu/FrontCode/blob/gh-pages/src/tagcloud/js/tagcloud.js
結(jié)束以上內(nèi)容來自一個前端低手的個人總結(jié)與整理,不足之處,還請指正。
題外:通過這次的練習才知道,學好數(shù)學是多么重要?。。?!
革命尚未成功,同志還需很努力!??!
參考文章:
解析3D標簽云,其實很簡單
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/81911.html
摘要:打印正在改變產(chǎn)品設(shè)計測試和制造的方式,而基于云計算的軟件也正在幫助打印實現(xiàn)它的潛力。例如,一直在用基于云計算的軟件來為客戶定制化制造一款名為的產(chǎn)品。今年月,另外一家主要的打印公司宣布他們將追求一種新的基于云計算的軟件策略?! ?D打印正在改變產(chǎn)品設(shè)計、測試和制造的方式,而基于云計算的軟件也正在幫助3D打印實現(xiàn)它的潛力。在云計算的幫助下,任何能連上互聯(lián)網(wǎng)的人可以創(chuàng)造、調(diào)整存儲和流設(shè)計,并將二者...
摘要:打印正在改變產(chǎn)品設(shè)計測試和制造的方式,而基于云計算的軟件也正在幫助打印實現(xiàn)它的潛力。在云計算的幫助下,任何能連上互聯(lián)網(wǎng)的人可以創(chuàng)造調(diào)整存儲和流設(shè)計,并將二者發(fā)送到世界上任何地方的打印機上?! ?D打印正在改變產(chǎn)品設(shè)計、測試和制造的方式,而基于云計算的軟件也正在幫助3D打印實現(xiàn)它的潛力。在云計算的幫助下,任何能連上互聯(lián)網(wǎng)的人可以創(chuàng)造、調(diào)整存儲和流設(shè)計,并將二者發(fā)送到世界上任何地方的3D打印機上...
摘要:近日,總部位于阿姆斯特丹的公司更新了其基于云計算的打印管理系統(tǒng)?;谠朴嬎愕拇蛴」芾硐到y(tǒng)的開發(fā)速度快,能提供超過桌面打印機自身的強大的功能,這非常令人著迷。比如,最新研制出的特色功能打印機的共享。更棒的是,公司宣布通過互聯(lián)網(wǎng)更新。 近日,總部位于阿姆斯特丹的Printr公司更新了其基于云計算的3D打印管理系統(tǒng)——Formide。2015年年初,這家公司發(fā)布了一款外形像寶石的3D打印機控制器...
閱讀 2962·2021-09-10 10:51
閱讀 2296·2021-09-02 15:21
閱讀 3281·2019-08-30 15:44
閱讀 960·2019-08-29 18:34
閱讀 1733·2019-08-29 13:15
閱讀 3392·2019-08-26 11:37
閱讀 2763·2019-08-26 10:46
閱讀 1170·2019-08-26 10:26