查找线在网格中穿过的单元格

时间:2018-11-25 05:52:51

标签: vector collision-detection trigonometry

我很难使我的代码正确无误。我尝试了从谷歌搜索中找到的3种不同解决方案,它们似乎都非常有效,但是似乎偶尔会错失一个盒子enter image description here

如您所见,红线直到结束几乎是完美的。

我正在使用存储桶进行空间分区,由于某种原因,存储桶已经很近了,但并不是我所需要的。这是我目前拥有的代码,想知道可能是什么问题

 getBucketsForLine(a, b) {
        var x0 = Math.floor(a.x / this.cellSize);
        var y0 = Math.floor(a.y / this.cellSize);


        var x1 = Math.floor(b.x / this.cellSize);
        var y1 = Math.floor(b.y / this.cellSize);

        var dx = Math.abs(x1 - x0);
        var dy = Math.abs(y1 - y0);

        var x = x0;
        var y = y0;

        var n = 1 + dx + dy;
        var x_inc = x1 > x0 ? 1 : -1
        var y_inc = y1 > y0 ? 1 : -1
        var error = dx - dy;

        dx *= 2;
        dy *= 2;

        let cells =[];

        while (--n > 0) {
            cells.push({ x, y });
            if(error > 0) {
                x += x_inc;
                error -= dy;
            } else if (error < 0) {
                y += y_inc;
                error += dx;
            } else if (error === 0) {
                x += x_inc;
                y += y_inc;
                error -= dy;
                error += dx;
                --n;
            }
        }
        let buckets = [];
        for(let i = 0; i < cells.length; i++) {
            buckets.push(cells[i].x + cells[i].y  * this.columns);
        }
        return buckets;

    }

0 个答案:

没有答案