碰撞检测期间的浮点问题

时间:2017-02-27 09:42:57

标签: javascript floating-point collision-detection rectangles

我有一堆轴对齐的矩形,定义如下:

function Rect(x,y,w,h) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.halfWidth = this.w*0.5;
    this.x1 = this.x - this.halfWidth;
    this.x2 = this.x + this.halfWidth;
}

轴的原点(0,0)是左上角。 水平移动通过以下功能实现:

Rect.prototype.moveX = function(dx){
    this.x += dx;
    this.x1 = this.x - this.halfWidth;
    this.x2 = this.x + this.halfWidth;
};

在游戏循环中,在碰撞检查期间,我得到了,例如:

rect[1].x2 = 115.57166301905819; rect[2].x1 = 166.1619546484768;

沿x轴的最终距离计算如下:

dx = -50.590291629418616 

这意味着,rect[2]可以向左移动最大dx个单位,即:

来自:rect[2].x = 341.1619546484768 致:rect[2].x = 290.5716630190582

现在,有时,函数moveX会导致错误的计算:

rect[2].x1 = rect[2].x - 175; // 175 is halfWidth
rect[2].x1 = 115.57166301905818 // <- less than 115.57166301905819

...这意味着,最后,rect[1]rect[2]相互交叉(不需要的结果)。

有任何解决此问题的提示吗?

0 个答案:

没有答案