㈠ 碰撞檢測.矩形,圓,扇形 之間的有沒有產生碰撞的演算法
你可以吧地圖分割成一小格一小格的(用數組表示),存在物體則該數組元素值為1,不存在則為0。移動時,檢測碰到的格子的值,就可以知道是否發生碰撞了。
㈡ 游戲中,使用矩形碰撞如何判斷碰撞具體位置急急急急!!!
我也碰到過這個問題,近期准備做個2D的ACT游戲,想到了一個方法。如圖:在沒碰撞之前,假設矩形B向上運動,碰撞後矩形B與矩形A相交,如果在游戲中記錄下矩形B碰撞之前的位置,若發現滿足這樣的條件(這里用rectA代表「碰撞前」矩形A,rectB代表「碰撞前」矩形B),即rectB.bottom-rectA.bottom>(rectB.bottom-rectB.top),就說明矩形B是因為「向上」運動才碰到矩形A的,這樣就可以判斷出矩形B碰撞了矩形A的底部,其他情況同理。
㈢ 矩形判定方法四種
矩形的四種判定方法:
1、有一個角是直角的平行四邊形是矩形。
2、對角線相等的平行四邊形是矩形。
3、有三個角是直角的四邊形是矩形。
4、對角線相等且互相平分的四邊形是矩形。
矩形的性質定理應用:
用兩組對應相等的木條可以做一個活動的平行四邊形木框。輕輕拉動一個點,不管怎麼拉,它還是一個平行四邊形。再次演示平行四邊形的移動過程,移動到一個角是直角停止,得到一個長方形。
矩形截面容器主要用於石化、造紙、醫葯及環保等工業,在人們日常生活中也經常見到這種容器。在結構尺寸和壁厚相同情況下,矩形截面容器與圓柱殼容器相比,承載能力要差得多。
矩形容器結構形式有帶加強圈和無加強圈結構形式,在這兩種容器中,還有帶孔和不帶孔之分。對於疲勞載荷作用的矩形容器如消毒器,容器縱向拐角處應帶有大於壁厚3倍的內半徑的圓弧;對於帶門的容器,要特別注意開門和容器邊角的變形和開門密封墊片的選擇。
矩形容器設計主要是計算殼體最危險部位的薄膜應力和彎曲應力,最大應力是薄膜應力與彎曲應力的總和。矩形管是一種空心方形的截面輕型薄壁鋼管,也稱為鋼製冷彎型材。它是以Q235熱軋或冷軋帶鋼或卷板為母材經冷彎曲加工成型後再經高頻焊接製成的方形截面形狀尺寸的型鋼。
㈣ c++ 游戲碰撞檢測怎麼做
在游戲開發中,經常需要進行碰撞檢測演算法的實現,例如判斷前面是否有障礙以及判斷子彈是否擊中飛機,都是檢測兩個物體是否發生碰撞,然後根據檢測的結果通過碰撞檢測演算法做出不同的處理。
進行碰撞檢測演算法的物體可能有些的形狀和復雜,這些需要進行組合碰撞檢測,就是將復雜的物體處理成一個一個的基本形狀的組合,然後分別進行不同的檢測。
下面簡單介紹一下兩種最基本的形狀進行碰撞的時候進行的處理。
1、矩形和矩形進行碰撞檢測演算法
一般規則的物體碰撞都可以處理成矩形碰撞,實現的原理就是檢測兩個矩形是否重疊。我們假設矩形1的參數是:左上角的坐標是(x1,y1),寬度是w1,高度是h1;矩形2的參數是:左上角的坐標是(x2,y2),寬度是w2,高度是h2。
在檢測時,數學上可以處理成比較中心點的坐標在x和y方向上的距離和寬度的關系。即兩個矩形中心點在x方向的距離的絕對值小於等於矩形寬度和的二分之一,同時y方向的距離的絕對值小於等於矩形高度和的二分之一。下面是數學表達式:
x方向:| (x1 + w1 / 2) – (x2 + w2/2) | < |(w1 + w2) / 2|
y方向:| (y1 + h1 / 2) – (y2 + h2/2) | < |(h1 + h2) / 2|
在Java ME程序中,只需要將上面的條件轉換成代碼就可以實現了。
但是矩形碰撞只是一種比較粗糙的碰撞檢測演算法,因為很多實際的物體可能不是一個規則的矩形。
下面介紹一下圓形碰撞。
2、圓形和圓形的碰撞檢測演算法
圓形和圓形的碰撞應該說是一種最簡單的碰撞,因為在數學上對於兩個圓形是否發生重疊,有計算兩個圓心之間的距離的公式。那麼條件就變為:計算兩個圓心之間的距離是否小於兩個圓的半徑和。
假設圓形1的左上角坐標是(x1,y1),半徑是r1,圓形2的左上角的坐標是(x2,y2),半徑是r2。
因為MIDP1.0中沒有浮點數,而且浮點數的運算比較慢,所以我們將條件做一個簡單的變換:對於條件的兩邊都進行平方,這樣就去掉了開方的運算步驟。
下面是數學表達式:
(x1 – x2)2 + (y1 – y2)2 < (r1 + r2)2
在Java ME程序中,只需要將上面的條件轉換成代碼就可以了。
上面介紹的只是最基本的碰撞檢測演算法的實現,而實際的編程過程中遇到的碰撞檢測問題要比這些復雜很多,還需要其他形式的檢測,還需要進行更加深入的學習。
㈤ 關於碰撞的計算
不考慮轉動的話盤的碰撞就是它們法向速度的碰撞,用動量守恆計算就可以了啊。。。這么簡單的。。= = 然後撞上去的那個盤切向速度不變,疊加上剛才算出來的法向速度就好了啊。。
㈥ 推箱子游戲 箱子之間的碰撞演算法
箱子是正方形,這種碰撞還是比較容易的,如果是三維的那種碰撞演算法就麻煩了。一個箱子肯定有它在相對頁面上的x,y點坐標,x,y是正方形最左端點的坐標,然後還有個width,height的長和高。如果這個箱子與另一個箱子相交。說明這個箱子x+weight大於另一個箱子的x值,並且另一個箱子的x+weight大於這個箱子的x值。這個你可以花兩個矩形相交計算下就知道了。具體實現在java.awt.Rectangle.intersects中有。你可以去看下源碼。http://kickjava.com/src/java/awt/Rectangle.java.htm。至於更復雜圖形的演算法就不知道了,希望你研究出來
出的什麼錯應該列出來,要不然憑猜測很難得出正確答案。還有個問題就是推箱子每次應該只有一個箱子在動,所以應該只要判斷一下移動的箱子和其他所有箱子是否碰撞就行了,但是感覺你怎麼每個箱子都與其他箱子判斷是否碰撞了
㈦ VB圖形問題
碰撞演算法可以簡單,可以復雜.現在很多射擊游戲中採用的sprite 中心點檢測方式,既將子彈或玩家簡化一個中心點.這些可能主要為了在復雜而有藝術感的彈幕中讓玩家獲得更大的滿足而採用的演算法.
不過對於偏大型的物體,我們可能就需要詳細一點的信息;如果是格鬥游戲,也許就需要將sprite分割為多個方便檢測的三角形或者是矩形進行處理!
不過無論如何,碰撞檢測不可能完全精確,我們能做的就是:盡量的細化檢測,但為了效率起見,也可能將不規則的較小面積的面轉換為一個三角形或一個矩形進行檢測.很多游戲,即使sprite任意旋轉,如果其形體長寬比列相當的話,就可以用一個稍微小一點的正方形處理或者轉換為一個圓形了.
下面簡單說幾種情況:
不作旋轉的碰撞處理,適合於普通或者要求不高的射擊游戲
1) 矩形間的碰撞
BOOL InterRect(FpsApp *pMe,AEERect rect1,AEERect rect2)
{
if(rect1.x > rect2.x+rect2.dx)
return FALSE;
if(rect2.x > rect1.x+rect1.dx)
return FALSE;
if(rect1.y > rect2.y+rect2.dy)
return FALSE;
if(rect2.y > rect1.y+rect1.dy)
return FALSE;
return TRUE;
}
2) 矩形與由對角線的切開矩形而形成的三角形的檢測,
//分別是右下三角形,左下三角形,左上三角形,右上三角形的檢測…….
/////////////
BOOL InterRect45(FpsApp *pMe,AEERect rect1,AEERect rect2)
{
int nX = 0 ;
int nY = 0 ;
if(InterRect(pMe,rect1,rect2)==FALSE) //若將三角形擴展為矩形都不相交…
return FALSE; ///排除下面檢測的脫離情況了.
nX = rect1.x + rect1.dx - rect2.x ;
nY = rect2.y + rect2.dy - rect1.y - rect1.dy ;
//rect1的右下角相對rect2的左下角處理
//如果這樣獲取的nx,ny的斜率小於rect2的對角線斜率,必然相交
if( (nY*1000/nX) > (rect2.dy*1000/rect2.dx)),//小數處理轉換為整數處理
return FALSE; //
/// 當然不多拉.
return TRUE;
}
///下面的處理本來可以進行旋轉然後根據上面的函數檢測,但直接處理也不復雜
BOOL InterRect135(FpsApp *pMe,AEERect rect1,AEERect rect2)
{
int nX = 0 ;
int nY = 0 ;
if(InterRect(pMe,rect1,rect2)==FALSE)
return FALSE;
//rect1的左下角相對rect2的右下角處理
nX = rect1.x - rect2.x-rect2.dx ;
nY = rect2.y + rect2.dy - rect1.dy -rect1.y ; ////下面的了
if( (nY*1000/nX) < (-rect2.dy*1000/rect2.dx)),//小數處理轉換為整數處理
return FALSE; //
return TRUE;
}
BOOL InterRecto45(FpsApp *pMe,AEERect rect1,AEERect rect2)
{
int nX = 0 ;
int nY = 0 ;
//////////////////
if(InterRect(pMe,rect1,rect2)==FALSE)
return FALSE;
//////
nX = rect1.x+ rect1.dx - rect2.x;
nY = rect1.y -rect2.y;
if( (nY*1000/nX) > (-rect2.dy*1000/rect2.dx)),//小數處理轉換為整數處理
return FALSE;
return TRUE;
}
BOOL InterRecto135(FpsApp *pMe,AEERect rect1,AEERect rect2)
{
int nX = 0 ;
int nY = 0 ;
////////////////
if(InterRect(pMe,rect1,rect2)==FALSE)
return FALSE;
//////
nX = rect1.x - rect2.x ;
nY = rect2.y+ rect2.dy - rect1.y;
if( (nY*1000/nX) < (rect2.dy*1000/rect2.dx)),//小數處理轉換為整數處理
return FALSE;
return TRUE;
}
小型的圓形->處理為內接正方形,並作適當增加;
小型的三角形也作相應的處理
對於不規則的物體,我們只需要將它劃分為多個我們可以處理碰撞的單元即可,循環檢測是否碰撞……
以上的簡單碰撞判斷演算法,已經可以搞一個普通或碰撞檢測不太嚴格的平面射擊游戲了….