用c# gdi+ 來模擬 win7 的水泡屏保.需要解決以下三個問題: 1.水泡與邊緣碰撞的模擬 2.水泡之間的碰撞模擬. 3.建立水泡(ball)的類
1.水泡與邊緣碰撞的模擬其實很簡單. 一開始.我還覺得還需要用**公式去計算. 後來才發現. 只在x,y(水泡的位置),在到邊緣時取下負值即可模擬.
view code
12.水泡間的碰撞 要複雜一些.需要檢測碰撞(兩水泡間的距離 <= 兩水泡的半徑之和) 但這 一點並不能完全解決.因為兩個球有可能穿插. 這樣就有可能在這一幀兩球穿插發生碰撞分開,但有可能在下一幀,兩水泡並沒有完全分開,應該繼續背離.但又被錯誤的視為了再次碰撞.public
void move(int gamewidth,int gameheight)
2
7if (y < 0 || y > gameheight - radius * 2)
1112 x += xvel; //
移動13 y += yvel;
14 }
所以在得之兩水泡間距離小於兩半徑之各的情況下. 再計算下此時兩球的運動方向是否是背離的. 這個可以通過球1的運動向量與球1的中心到球2 的中心的向量做點積.如果值小於0.說明運動是背離狀態,不視為碰撞.
此處補充下碰撞**公式: v' = v - 2 * (v * n) *n (其中v為入射的向量可非單位向量,n為碰撞的法向量必須為單位向量 (v * n) 是兩向量的點積 )
兩球碰撞圖例:
//得到**向量
2 pointf getreflectvector(float x1,float y1,float x2,float y2)
3
16//
判斷是否是執行背離
17bool isapart(ball b1,ball b2)
18
24else
return
false;
25 }
26//
碰撞27
void collision(ball ball,listballs)
28
41 }
42 }
43 }
演示效果如下:
matlaB模擬桌面屏保彈球
function billiards numberofballs call billiards number of balls e.g.billiards 10 if nargin 0 numberofballs 10 endclose all hold on drawflag 1 factor 8...
Win7怎麼設定屏保密碼?設定螢幕保護的密碼教程
設定屏保密碼需要進行兩個設定 1 若是賬戶沒有設定密碼那麼就需要設定賬戶密碼,2 開啟螢幕保護的密碼保護功能。首先開啟控制面板,然後選擇使用者帳戶,在這裡給賬戶設定賬戶密碼,設定好賬戶密碼後,然後進行下面的操作 在桌面上點右鍵,然後在彈出的右鍵選單中選擇 個性化 在開啟的個性化頁面中選擇 螢幕保護程...
C語言模擬練習(7)
1.乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。找出這兩個數字,程式設計實現。include void find int arr,int sz 查詢只出現一次的數字 if 1 k 出現1次為1 出現2次為2 int main int sz sizeof arr sizeof arr ...