1. 程式人生 > >運動物體碰撞演算法演示【轉】

運動物體碰撞演算法演示【轉】

1,test.js程式碼

var getFlag=function (id) {
     return document.getElementById(id);  //獲取元素引用
}
var extend=function(des, src) {
     for (p in src) {
       des[p]=src[p];
   }
  return des;
 }
var clss=['one','two','three','four','five','six','seven','eight','nine','ten'];
var Ball=function (diameter,classn)
{
var ball=document.createElement("div"); ball.className=classn; with(ball.style) { width=height=diameter+'px';position='absolute'; } return ball; } var Screen=function (cid,config) { //先建立類的屬性 var self=this; if (!(self instanceof Screen)) { return new Screen(cid,config) } config=extend(Screen.Config, config) //configj是extend類的例項
self.container=getFlag(cid); //視窗物件 self.ballsnum=config.ballsnum; self.diameter=56; //球的直徑 self.radius=self.diameter/2; self.spring=config.spring; //球相碰後的反彈力 self.bounce=config.bounce; //球碰到視窗邊界後的反彈力 self.gravity=config.gravity; //球的重力 self.balls=[]; //把建立的球置於該陣列變數
self.timer=null; //呼叫函式產生的時間id self.L_bound=0; //container的邊界 self.R_bound=self.container.clientWidth; self.T_bound=0; self.B_bound=self.container.clientHeight; }; Screen.Config={ //為屬性賦初值 ballsnum:10, spring:0.8, bounce:-0.9, gravity:0.05 }; Screen.prototype={ initialize:function () { var self=this; self.createBalls(); self.timer=setInterval(function (){self.hitBalls()}, 30) }, createBalls:function () { var self=this, num=self.ballsnum; var frag=document.createDocumentFragment(); //建立文件碎片,避免多次重新整理 for (i=0;i<num;i++) { var ball=new Ball(self.diameter,clss[ Math.floor(Math.random()* num )]); ball.diameter=self.diameter; ball.radius=self.radius; ball.style.left=(Math.random()*self.R_bound)+'px'; //球的初始位置, ball.style.top=(Math.random()*self.B_bound)+'px'; ball.vx=Math.random() * 6 -3; ball.vy=Math.random() * 6 -3; frag.appendChild(ball); self.balls[i]=ball; } self.container.appendChild(frag); }, hitBalls:function () { var self=this, num=self.ballsnum,balls=self.balls; for (i=0;i<num-1;i++) { var ball1=self.balls[i]; ball1.x=ball1.offsetLeft+ball1.radius; //小球圓心座標 ball1.y=ball1.offsetTop+ball1.radius; for (j=i+1;j<num;j++) { var ball2=self.balls[j]; ball2.x=ball2.offsetLeft+ball2.radius; ball2.y=ball2.offsetTop+ball2.radius; dx=ball2.x-ball1.x; //兩小球圓心距對應的兩條直角邊 dy=ball2.y-ball1.y; var dist=Math.sqrt(dx*dx + dy*dy); //兩直角邊求圓心距 var misDist=ball1.radius+ball2.radius; //圓心距最小值 if(dist < misDist) { //假設碰撞後球會按原方向繼續做一定的運動,將其定義為運動A var angle=Math.atan2(dy,dx); //當剛好相碰,即dist=misDist時,tx=ballb.x, ty=ballb.y tx=ball1.x+Math.cos(angle) * misDist; ty=ball1.y+Math.sin(angle) * misDist; //產生運動A後,tx > ballb.x, ty > ballb.y,所以用ax、ay記錄的是運動A的值 ax=(tx-ball2.x) * self.spring; ay=(ty-ball2.y) * self.spring; //一個球減去ax、ay,另一個加上它,則實現反彈 ball1.vx-=ax; ball1.vy-=ay; ball2.vx+=ax; ball2.vy+=ay; } } } for (i=0;i<num;i++) { self.moveBalls(balls[i]); } }, moveBalls:function (ball) { var self=this; ball.vy+=self.gravity; ball.style.left=(ball.offsetLeft+ball.vx)+'px'; ball.style.top=(ball.offsetTop+ball.vy)+'px'; //判斷球與視窗邊界相碰,把變數名簡化一下 var L=self.L_bound, R=self.R_bound, T=self.T_bound, B=self.B_bound, BC=self.bounce; if (ball.offsetLeft < L) { ball.style.left=L; ball.vx*=BC; } else if (ball.offsetLeft + ball.diameter > R) { ball.style.left=(R-ball.diameter)+'px'; ball.vx*=BC; } else if (ball.offsetTop < T) { ball.style.top=T; ball.vy*=BC; } if (ball.offsetTop + ball.diameter > B) { ball.style.top=(B-ball.diameter)+'px'; ball.vy*=BC; } } } window.onload=function() { var sc=null; getFlag('start').onclick=function () { document.getElementById("inner").innerHTML=''; sc=new Screen('inner',{ballsnum:10, spring:0.8, bounce:-0.9, gravity:0.05}); sc.initialize(); } getFlag('stop').onclick=function() { clearInterval(sc.timer); } }

2 test.html程式碼

<html>
 <head>
  <title></title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <style type="text/css">
body {
    margin:0;
    padding:0;
    text-align: center;
}
#screen { width: 800px; height: 640px; position: relative; background: #ccccff;margin: 0 auto;vertical-align: bottom}
#inner { position: absolute; left:0px; top:0px; width:100%; height:100%; }
#screen p {color:white;font:bold 14px;}
.one { background-image:url('bubble.png'); background-position: -66px -58px; }
.two { background-image:url('bubble.png'); background-position: -66px -126px;}
.three { background-image:url('bubble.png'); background-position: -66px -194px; }
.four { background-image:url('bubble.png'); background-position: -66px -263px; }
.five { background-image:url('bubble.png'); background-position: -66px -331px; }
.six { background-image:url('bubble.png'); background-position: -66px -399px; }
.seven { background-image:url('bubble.png'); background-position: -66px -194px; }
.eight { background-image:url('bubble.png'); background-position: -66px -263px; }
.nine { background-image:url('bubble.png'); background-position: -66px -331px; }
.ten{ background-image:url('bubble.png'); background-position: -66px -399px; }
  </style>
 </head>
 <body>
   <div id="screen" >
     <p>hi test it!</p>
     <div id="inner"></div>
   </div>
   <input type="button" id="start" value="start" >
   <input type="button" id="stop" value="stop">
   <br><br><br>
<script type="text/javascript" src="test.js"></script>
 </body>
</html>

自己找個bubble.png

相關推薦

運動物體碰撞演算法演示

1,test.js程式碼 var getFlag=function (id) { return document.getElementById(id); //獲取元素引用 } var extend=function(des, src) {

SHA1演算法原理

轉自:https://www.cnblogs.com/scu-cjx/p/6878853.html 一.SHA1與MD5差異 SHA1對任意長度明文的預處理和MD5的過程是一樣的,即預處理完後的明文長度是512位的整數倍,但是有一點不同,那就是SHA1的原始報文長度不能超過2的64次方,然後SHA1生成1

Apache Mahout中的機器學習演算法

Apache Mahout 是 ApacheSoftware Foundation (ASF) 旗下的一個開源專案,提供一些可擴充套件的機器學習領域經典演算法的實現,旨在幫助開發人員更加方便快捷地建立智慧應用程式,並且,在 Mahout 的最近版本中還加入了對Apache Hadoop 的支援,使這些演

賈佳亞港中文團隊冠軍技術分享:最有效的COCO物體分割演算法

轉自:http://www.sohu.com/a/201822261_473283 【新智元導讀】物體分割(instance segmentation)是如今視覺領域最熱最核心的一個問題。在這屆國際影象識別權威競賽MS COCO當中,香港中文大學團隊UCenter取得了物

實戰c++中的vector系列--vector的遍歷(stl演算法、vector迭代器(不要在迴圈中判斷不等於end())、operator[])

(轉自:https://blog.csdn.net/wangshubo1989/article/details/50374914?utm_source=blogxgwz29) 遍歷一個vector容器有很多種方法,使用起來也是仁者見仁。 通過索引遍歷: for (i = 0; i<

字串匹配演算法的分析

轉自:https://www.cnblogs.com/adinosaur/p/6002978.html 問題描述 字串匹配問題可以歸納為如下的問題:在長度為n的文字T[1...n]中,查詢一個長度為m的模式P[1...m]。並且假設T,P中的元素都來自一個有限字母集合Ʃ。如果存在位移s,其中0≤s≤n-m

java原始碼分析Map中的hash演算法分析

全網把Map中的hash()分析的最透徹的文章,別無二家。 2018年05月09日 09:08:08 閱讀數:957 你知道HashMap中hash方法的具體實現嗎?你知道HashTable、ConcurrentHashMap中hash方法

一致性雜湊演算法

在瞭解一致性雜湊演算法之前,最好先了解一下快取中的一個應用場景,瞭解了這個應用場景之後,再來理解一致性雜湊演算法,就容易多了,也更能體現出一致性雜湊演算法的優點,那麼,我們先來描述一下這個經典的分散式快取的應用場景。 場景描述 假設,我們有三臺快取伺服器,用於快取圖片,我們為這三臺快取伺服器編號為0

怎麼更好地終極理解遞迴演算法

遞迴真是個奇妙的思維方式。對一些簡單的遞迴問題,我總是驚歎於遞迴描述問題和編寫程式碼的簡潔。但是總感覺沒能融會貫通地理解遞迴,有時嘗試用大腦去深入“遞迴”,層次較深時便常產生進不去,出不來的感覺。這種狀態也導致我很難靈活地運用遞迴解決問題。有一天,我看到一句英文:“To

非常好的理解遺傳演算法的例子

非常好的理解遺傳演算法的例子 個人分類: 演算法 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各     個主要執行步驟。         例:求下述二元函式的最大值:     (1) 個體編碼            遺傳演算法的運算物件

Linux 核心記憶體管理(二)夥伴演算法

        通常情況下,一個高階作業系統必須要給程序提供基本的、能夠在任意時刻申請和釋放任意大小記憶體的功能,就像malloc 函式那樣,然而,實現malloc 函式並不簡單,由於程序申請記憶體的大小是任意的,如果作業系統對malloc 函式的實現方法不對,將直接導致

強化學習Deep Q Network(DQN)演算法詳解

 原文地址:https://blog.csdn.net/qq_30615903/article/details/80744083 DQN(Deep Q-Learning)是將深度學習deeplearning與強化學習reinforcementlearning相結合,實現了從

從RGB色轉為灰度色演算法

一、基礎   對於彩色轉灰度,有一個很著名的心理學公式:                      

廣告演算法工程師入門 620萬、50萬、100萬的演算法工程師,到底有什麼區別?

【該文件已經整理到看雲電子書:廣告演算法學習筆記】 需要了解一下廣告演算法工程師之間的區別,推薦這篇文章。 公元七世紀,在車遲國國家氣象局組織的一次求雨活動中,虎力、鹿力、羊力三位大仙成功地祈下甘霖,於水火中救了黎民。老國王雖然不明就裡,卻從此尊他們為國

深入淺出理解決策樹演算法(二)-ID3演算法與C4.5演算法

從深入淺出理解決策樹演算法(一)-核心思想 - 知乎專欄文章中,我們已經知道了決策樹最基本也是最核心的思想。那就是其實決策樹就是可以看做一個if-then規則的集合。我們從決策樹的根結點到每一個都葉結點構建一條規則。 並且我們將要預測的例項都可以被一條路徑或者一條規則所覆蓋。 如下例:假設我

深入淺出理解決策樹演算法(一)-核心思想

演算法思想 決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。 其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。 使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特徵屬性,並按照其值選擇

字串匹配演算法(三)位運算的魔法——KR與SO

位運算經常能做出一些不可思議的事情來,例如不用臨時變數要交換兩個數該怎麼做呢?一個沒接觸過這類問題的人打死他也想不出來。如果拿圍棋來做比喻,那麼位運算可以喻為程式設計中的“手筋”。 按位的儲存方式能提供最大的儲存空間利用率,而隨著空間被壓縮的同時,由於CPU硬體的直接支援,速度竟然神奇般

三種快速排序演算法以及快速排序的優化

一.  快速排序的基本思想 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。 二.  快速排序的三個步驟 1) 選擇基準:在待排序列中,按照某種方式挑出一個元素,作為 “基準”(p

經典的圖論演算法C++描述

#include < cstring > // 常量定義: const int  maxV = 100 ; const double  Inf = 1e100; // const int Inf=2000000000; // Graph類定義: template < class  T &

(資料結構)十分鐘搞定時間複雜度(演算法的時間複雜度)

我們假設計算機執行一行基礎程式碼需要執行一次運算。 int aFunc(void) { printf("Hello, World!\n"); // 需要執行 1 次 return 0; // 需要執行 1 次 } 那麼上面這個