日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
HTML5人工智能基礎及實踐

簡  介

成都創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為懷來企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站設計,懷來網(wǎng)站改版等技術服務。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

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

基礎類

二維向量(2D vector)可謂2D游戲或是動畫里最常用型別了。這里二維向量用Vector2類實現(xiàn),用(x, y)表示。 Vector2亦用來表示空間中的點(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ū)分的地方是:

它什么時候代表點、什么時候代表向量。

當其代表向量的時候,它的幾何意義是什么?

不能把其當成一個黑盒來調(diào)用,需要知其然并知其所以然。

在下面的使用的過程當中,我會特別標注其代表點還是向量;代表向量時,其幾何意義是什么?

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

 
 
 
  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個屬性,分別是:radius半徑、velocity速度(Vector2)、position位置(Vector2)、collectionPosition集合點/小球的家(Vector2)。

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

小球的集合方法所傳遞的參數(shù)為集合的速度,因為小球都有一個集合點的屬性,所以這里不用再傳入集合點/家給小球。

這里詳細分析一下collection方法,這也是整個demo的關鍵代碼。

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

因為setLength設置向量的長度:

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

所以collection可以改成:

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

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

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

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

this.collectionPosition

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

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

.multiplyScalar(v); 改變該向量的長度。

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

上面我們還是用到了解散方法,其過程是幫小球生成一個隨機速度,用到了MathHelp類的一個靜態(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. } (window)); 

粒子生成

寫了Vector2、Ball、MathHeper三個類之后,終于可以開始實現(xiàn)一點東西出來!

 
 
 
  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. for (y = 1; y < canvas.height; y += 7) {
  15. for (x = 1; x < canvas.width; x += 7) {
  16. imageData = cxt.getImageData(20 + x, 20 + y, 1, 1);
  17. mageData.data[0] > 170) {
  18. ps.push({
  19. px: 20 + x,
  20. py: 20 + y
  21. })
  22. }
  23. }
  24. };
  25. cxt.fillStyle = "rgba(0,0,0,1)";
  26. cxt.fillRect(20, 20, canvas.width, canvas.height);
  27.  
  28. //像素點和小球轉(zhuǎn)換
  29. for (var i in ps) {
  30. 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));
  31. balls.push(ball);
  32. };
  33.  
  34. cxt.fillStyle = "#fff";
  35. for (i in balls) {
  36. cxt.beginPath();
  37. cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].radius, 0, Math.PI * 2, true);
  38. cxt.closePath();
  39. cxt.fill();
  40. }
  41. //解散:生成隨機速度
  42. for (var i in balls) {
  43. balls[i].disband();

其中分三個步驟:收集所有像素、 像素點和小球轉(zhuǎn)換、生成隨機速度。整個demo我們需要一個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. cyc); 

這里使用time整體控制,使其無限loop。ps:這里還有一點不夠OO的地方就是應當為ball提供一個draw方法。

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

在線演示

請移步原文


分享題目:HTML5人工智能基礎及實踐
新聞來源:http://m.5511xx.com/article/cddipdc.html