简单的距离碰撞与多物体碰撞检测方法

标签:
杂谈 |
分类: 动画软件 |
通过hitTestObject和hitTestPoint进行hit都有不足,我们可以自己计算碰撞检测。
var dx:Number = a.x - b.x;
var dy:Number = a.y - b.y;
var dist:Number = Math.sqrt(dx*dx+dy*dy);
if(dist<minDist)
{
trace("hit");
}
c(n,m) =
n!/(n-m)!*m!
var
tmp:String="";
for(var j:int=0;j<count;j++)
{
tmp +=
"["+ball[i]+","+ball[j]+"] ";
}
trace(tmp);
var
tmp:String="";
for(var j:int=i+1;j<count;j++)
{
tmp +=
"["+ball[i]+","+ball[j]+"] ";
}
trace(tmp);
简单的距离碰撞检测:
我们从理想的状态开始,两个圆进行测试。
如何求出两个圆的当前距离呢?
几何学中有:平面两点间距离公式,正好解决这个问题。
import flash.events.Event;
//有两个球a,b
a.radius = a.width/2;
b.radius = a.height/2;
a.startDrag(true);
//碰撞距离
var minDist:Number = a.radius+b.radius;
this.addEventListener(Event.ENTER_FRAME,testHit);
function testHit(e:Event):void
{
}
注意:圆的大小并不是一样大,所以距离是两个球的半径,而非一个球的半径*2
多物体碰撞检测:
如果有两个球碰撞很容易,如果有多个球则需要多次判断。
如果:
有两个球(a,b):判断a->b
有三个球(a,b,c):判断a->b, a->c,
b->c
球越多可能性就越多。
根据组合公式:c(n,m)可以求出 20个球就需要判断190次。
注:c(n,m),有n个不同的元素,任意取出m个元素进行组合(m<=n)。
我们最基本的做法是:用双重循环进行检测
var ball:Array=["a","b","c","d","e","f"];
var count:int=6;
for(var i:int=0;i<count;i++)
{
}
[a,a] [a,b] [a,c]
[a,d] [a,e]
[a,f]
[b,a] [b,b] [b,c]
[b,d] [b,e]
[b,f]
[c,a] [c,b] [c,c]
[c,d] [c,e]
[c,f]
[d,a] [d,b] [d,c]
[d,d] [d,e]
[d,f]
[e,a] [e,b] [e,c]
[e,d] [e,e]
[e,f]
[f,a] [f,b] [f,c]
[f,d] [f,e]
[f,f]
观察:
[a,a]自己和自己碰撞,很不合理
[a,b]和[b,a]这两个检测是一样的,有冗余成份。
所以我们可以这样处理:
假设i=0, j=i+1就不出现重复的现像了。
修改如下:
var ball:Array=["a","b","c","d","e","f"];
var count:int=6;
for(var i:int=0;i<count-1;i++)
{
}
[a,b] [a,c] [a,d]
[a,e] [a,f]
[b,c] [b,d] [b,e]
[b,f]
[c,d] [c,e] [c,f]
[d,e] [d,f]
[e,f]
可以看出效率提升了一半。
前一篇:hitTest碰撞检测
后一篇:vim