㈠ 碰撞检测.矩形,圆,扇形 之间的有没有产生碰撞的算法
你可以吧地图分割成一小格一小格的(用数组表示),存在物体则该数组元素值为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;
}
小型的圆形->处理为内接正方形,并作适当增加;
小型的三角形也作相应的处理
对于不规则的物体,我们只需要将它划分为多个我们可以处理碰撞的单元即可,循环检测是否碰撞……
以上的简单碰撞判断算法,已经可以搞一个普通或碰撞检测不太严格的平面射击游戏了….