自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTML5人工智能基礎(chǔ)及實(shí)踐

開(kāi)發(fā) 前端
人工智能(Artificial Intelligence) ,英文縮寫(xiě)為AI。它是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門(mén)新的技術(shù)科學(xué)。本篇從嚴(yán)格意義上說(shuō)屬于人工智能的范疇,但也是基礎(chǔ)中的基礎(chǔ)。本篇的目的是要賦予小球解散和集合兩項(xiàng)基本指令(智商),本篇內(nèi)容中相關(guān)算法適用于子彈追蹤等塔防類游戲當(dāng)中。

簡(jiǎn)  介

人工智能(Artificial Intelligence) ,英文縮寫(xiě)為AI。它是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門(mén)新的技術(shù)科學(xué)。本篇從嚴(yán)格意義上說(shuō)屬于人工智能的范疇,但也是基礎(chǔ)中的基礎(chǔ)。本篇的目的是要賦予小球解散和集合兩項(xiàng)基本指令(智商),本篇內(nèi)容中相關(guān)算法適用于子彈追蹤等塔防類游戲當(dāng)中。

基礎(chǔ)類

二維向量(2D vector)可謂2D游戲或是動(dòng)畫(huà)里最常用型別了。這里二維向量用Vector2類實(shí)現(xiàn),用(x, y)表示。 Vector2亦用來(lái)表示空間中的點(diǎn)(point),而不另建類。先看代碼:

  1. var Vector2 = function(x, y) {  
  2.          this.x = x || 0;  
  3.          this.y = y || 0;  
  4.      };  
  5.      Vector2.prototype = {  
  6.          set: function(x, y) {  
  7.              this.x = x;  
  8.              this.y = y;  
  9.              return this;  
  10.          },  
  11.          sub: function(v) {  
  12.              return new Vector2(this.x - v.x, this.y - v.y);  
  13.          },  
  14.          multiplyScalar: function(s) {  
  15.              this.x *= s;  
  16.              this.y *= s;  
  17.              return this;  
  18.          },  
  19.          divideScalar: function(s) {  
  20.              if (s) {  
  21.                  this.x /= s;  
  22.                  this.y /= s;  
  23.              } else {  
  24.                  this.set(0, 0);  
  25.              }  
  26.              return this;  
  27.          },  
  28.          length: function() {  
  29.              return Math.sqrt(this.lengthSq());  
  30.          },  
  31.          normalize: function() {  
  32.              return this.divideScalar(this.length());  
  33.          },  
  34.          lengthSq: function() {  
  35.              return this.x * this.x + this.y * this.y;  
  36.          },  
  37.          distanceToSquared: function(v) {  
  38.              var dx = this.x - v.x,  
  39.              dy = this.y - v.y;  
  40.              return dx * dx + dy * dy;  
  41.          },  
  42.          distanceTo: function(v) {  
  43.              return Math.sqrt(this.distanceToSquared(v));  
  44.          },  
  45.          setLength: function(l) {  
  46.              return this.normalize().multiplyScalar(l);  
  47.          }  
  48.      };  
  49.      window.Vector2 = Vector2;  
  50.  } (window)); 

使用該類需要特別注意和區(qū)分的地方是:

它什么時(shí)候代表點(diǎn)、什么時(shí)候代表向量。

當(dāng)其代表向量的時(shí)候,它的幾何意義是什么?

不能把其當(dāng)成一個(gè)黑盒來(lái)調(diào)用,需要知其然并知其所以然。

在下面的使用的過(guò)程當(dāng)中,我會(huì)特別標(biāo)注其代表點(diǎn)還是向量;代表向量時(shí),其幾何意義是什么?

給小球賦予智商,顧名思義需要小球類:

  1. (function(window) {  
  2.     var Ball = function(r, v, p, cp) {  
  3.         this.radius = r;  
  4.         this.velocity = v;  
  5.         this.position = p;  
  6.         this.collectionPosition = cp 
  7.     }  
  8.     Ball.prototype = {  
  9.         collection: function(v) {  
  10.             thisthis.velocity = this.collectionPosition.sub(this.position).setLength(v)  
  11.         },  
  12.         disband: function() {  
  13.             this.velocity = new Vector2(MathHelp.getRandomNumber( - 230, 230), MathHelp.getRandomNumber( - 230, 230))  
  14.         }  
  15.     }  
  16.     window.Ball = Ball  
  17. } (window));   

其中

小球擁有4個(gè)屬性,分別是:radius半徑、velocity速度(Vector2)、position位置(Vector2)、collectionPosition集合點(diǎn)/小球的家(Vector2)。

小球擁有2個(gè)方法,分別是:collection集合、disband解散。

小球的集合方法所傳遞的參數(shù)為集合的速度,因?yàn)樾∏蚨加幸粋€(gè)集合點(diǎn)的屬性,所以這里不用再傳入集合點(diǎn)/家給小球。

這里詳細(xì)分析一下collection方法,這也是整個(gè)demo的關(guān)鍵代碼。

  1. collection: function (v) {  
  2. thisthis.velocity =this.collectionPosition.sub(this.position).setLength(v);  
  3. },  

因?yàn)閟etLength設(shè)置向量的長(zhǎng)度:

  1. setLength: function (l) {  
  2.  return this.normalize().multiplyScalar(l);  
  3.  
  4.  }  

所以collection可以改成:

  1. thisthis.velocity = this.collectionPosition.sub(this.position).normalize().multiplyScalar(v); 

normalize是獲取單位向量,也可以改成:

  1. this.collectionPosition.sub(this.position).divideScalar(this.length()).multiplyScalar(v);  

整個(gè)Vector2黑盒就全部展現(xiàn)出來(lái),其整個(gè)過(guò)程都是向量的運(yùn)算,代表含義如下所示:

this.collectionPosition

.sub(this.position) 獲取小球所在位置指向小球集合位置的向量;

.divideScalar(this.length()) 得到該向量的單位向量;

.multiplyScalar(v); 改變?cè)撓蛄康拈L(zhǎng)度。

最后把所得到的向量賦給小球的速度。

上面我們還是用到了解散方法,其過(guò)程是幫小球生成一個(gè)隨機(jī)速度,用到了MathHelp類的一個(gè)靜態(tài)方法:

  1. (function (window) {  
  2. var MathHelp = {};  
  3. MathHelp.getRandomNumber = function (min, max) {  
  4. return (min + Math.floor(Math.random() * (max - min + 1)));  
  5. }  
  6. window.MathHelp = MathHelp;  
  7.  
  8. } (window));  

粒子生成

寫(xiě)了Vector2、Ball、MathHeper三個(gè)類之后,終于可以開(kāi)始實(shí)現(xiàn)一點(diǎn)東西出來(lái)!

  1. var ps = [],  
  2. balls = [];  
  3. function init(tex) {  
  4. balls.length = 0;  
  5. ps.length = 0;  
  6. cxt.clearRect(0, 0, canvas.width, canvas.height);  
  7. cxt.fillStyle = "rgba(0,0,0,1)";  
  8. cxt.fillRect(0, 0, canvas.width, canvas.height);  
  9. cxt.fillStyle = "rgba(255,255,255,1)";  
  10. cxt.font = "bolder 160px 宋體";  
  11. cxt.textBaseline = 'top';  
  12. cxt.fillText(tex, 20, 20);  
  13.  
  14. //收集所有像素  
  15. for (y = 1; y < canvas.height; y += 7) {  
  16. for (x = 1; x < canvas.width; x += 7) {  
  17. imageData = cxt.getImageData(20 + x, 20 + y, 1, 1);  
  18. mageData.data[0] > 170) {  
  19. ps.push({  
  20. px: 20 + x,  
  21. py: 20 + y  
  22. })  
  23. }  
  24. }  
  25. };  
  26. cxt.fillStyle = "rgba(0,0,0,1)";  
  27. cxt.fillRect(20, 20, canvas.width, canvas.height);  
  28.    
  29. //像素點(diǎn)和小球轉(zhuǎn)換  
  30. for (var i in ps) {  
  31. var ball = new Ball(2, new Vector2(0, 0), new Vector2(ps[i].px, ps[i].py), new Vector2(ps[i].px, ps[i].py));  
  32. balls.push(ball);  
  33. };  
  34.    
  35. cxt.fillStyle = "#fff";  
  36. for (i in balls) {  
  37. cxt.beginPath();  
  38. cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].radius, 0, Math.PI * 2, true);  
  39. cxt.closePath();  
  40. cxt.fill();  
  41. }  
  42.  
  43. //解散:生成隨機(jī)速度  
  44. for (var i in balls) {  
  45. balls[i].disband(); 

其中分三個(gè)步驟:收集所有像素、 像素點(diǎn)和小球轉(zhuǎn)換、生成隨機(jī)速度。整個(gè)demo我們需要一個(gè)loop:

  1. var time = 0;  
  2. var cyc = 15;  
  3. var a = 80;  
  4. var collectionCMD = false;  
  5. setInterval(function() {  
  6. cxt.fillStyle = "rgba(0, 0, 0, .3)";  
  7. cxt.fillRect(0, 0, canvas.width, canvas.height);  
  8. cxt.fillStyle = "#fff";  
  9. time += cyc;  
  10. for (var i in balls) {  
  11. if (collectionCMD === true && balls[i].position.distanceTo(balls[i].collectionPosition) <   
  12. {  
  13. balls[i].velocity.y = 0;  
  14. balls[i].velocity.x = 0;  
  15. CMD = true;  
  16. for (var i in balls) {  
  17. balls[i].collection(230);  
  18. }  
  19. }  
  20. if (time === 7500) {  
  21. time = 0;  
  22. collectionCMD = false;  
  23. or (var i in balls) {  
  24. balls[i].velocity.y * cyc / 1000;  
  25. balls[i].position.x += balls[i].velocity.x * cyc / 1000;  
  26. }  
  27. },  
  28.  
  29. cyc);  

這里使用time整體控制,使其無(wú)限loop。ps:這里還有一點(diǎn)不夠OO的地方就是應(yīng)當(dāng)為ball提供一個(gè)draw方法。

其中的balls[i].position.distanceTo(balls[i].collectionPosition) 代表了點(diǎn)與點(diǎn)之間的距離,這里判斷小球是否到了集合點(diǎn)或家。這里其幾何意義就不再向量了。

在線演示

請(qǐng)移步原文

原文鏈接:http://www.cnblogs.com/iamzhanglei/archive/2012/03/29/2422618.html

【編輯推薦】

  1. 10個(gè)絕對(duì)讓你瘋狂的HTML5和JS實(shí)驗(yàn)性展示
  2. 淺談Web自動(dòng)化測(cè)試原理
  3. HTML5游戲開(kāi)發(fā)的五個(gè)最佳實(shí)踐
  4. 分享21個(gè)最新的超酷web設(shè)計(jì)特效
  5. 關(guān)于HTML5的七個(gè)傳說(shuō)
責(zé)任編輯:林師授 來(lái)源: 當(dāng)耐特磚家的博客
相關(guān)推薦

2018-12-09 14:35:58

人工智能預(yù)測(cè)

2021-02-01 17:48:37

人工智能AI機(jī)器學(xué)習(xí)

2019-01-18 12:24:22

人工智能資本融資

2021-01-13 11:59:03

人工智能人工智能發(fā)展

2021-01-12 11:19:35

人工智能AI產(chǎn)業(yè)預(yù)測(cè)

2019-01-31 11:35:53

人工智能機(jī)器學(xué)習(xí)AI

2022-01-13 15:08:31

人工智能科技手機(jī)

2016-12-29 17:27:39

2021-02-23 09:48:56

人工智能

2023-01-13 13:11:44

人工智能模型機(jī)器學(xué)習(xí)

2023-03-06 07:40:23

人工智能流程合成數(shù)據(jù)

2018-05-16 09:00:00

人工智能實(shí)體經(jīng)濟(jì)長(zhǎng)三角

2021-01-03 10:29:58

人工智能AI語(yǔ)言模型

2019-04-12 15:43:50

人工智能AI發(fā)展趨勢(shì)

2019-01-03 14:22:10

人工智能算法機(jī)器學(xué)習(xí)

2025-01-02 11:39:32

人工智能大型語(yǔ)言模型數(shù)據(jù)隱私

2019-01-29 17:39:29

人工智能機(jī)器學(xué)習(xí)程序員

2021-03-22 11:04:50

人工智能邊緣人工智能

2022-02-23 19:50:41

人工智能AI

2017-12-07 15:44:58

人工智能AI信息化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)