Инициализация массива машинописных 3D - PullRequest
0 голосов
/ 10 апреля 2020

Итак, в данный момент я пытаюсь создать двумерную сетку для эффективности обнаружения столкновений и т. Д.

Основы настройки довольно просты, путем деления высоты и ширины объектов на I. можно найти их соответствующие «индексы», а затем выбросить значение в третье измерение массива в двух предыдущих координатах. Теоретически идея работает, но я не уверен, почему я не могу заставить код работать.

export class CollisionGrid {

widthSegment : number;
heightSegment : number;
grid : object[][][] = [];


constructor(height : number,  width : number, cellSize : number) {

    this.widthSegment = Math.round(width / cellSize);
    this.heightSegment = Math.round(height / cellSize);
}

addParticles(particles : Particle[]) : void {
    for(let particle of particles) 
    this.addParticle(particle);
}

addParticle(particle : Particle) : void {
    var ix = Math.round(particle.position.x / this.widthSegment);
    var iy = Math.round(particle.position.y / this.heightSegment);

    this.grid[ix][iy].push(particle); // This is the line throwing the error
}

queryGrid(position : ICoordinates) : object[] {

    const ix = Math.round(position.x / this.widthSegment);
    const iy = Math.round(position.y / this.heightSegment);

    return this.grid[ix][iy];
}

resetGrid() {
    this.grid = [];
}

}

Итак, указанная ошибка c: TypeError: Невозможно прочитать свойство '2' из неопределенного. Свойство '2' отвечает одному из 2D-индексов, который ему не нравится. Я не совсем уверен, почему выдает эту ошибку. Это потому, что мне нужно вручную инициализировать вложенные массивы?

Любая помощь будет очень полезна, спасибо.

1 Ответ

0 голосов
/ 10 апреля 2020

Вам нужно инициализировать каждое измерение индивидуально, как показано ниже:

addParticle(particle : Particle) : void {
    var ix = Math.round(particle.position.x / this.widthSegment);
    var iy = Math.round(particle.position.y / this.heightSegment);
    if(!Array.isArray(this.grid[ix])){
       this.grid[ix] =[];
       this.grid[ix][iy] = [];
     } else if(!Array.isArray(this.grid[ix][iy])){
      this.grid[ix][iy] = [];
     }

    this.grid[ix][iy].push(particle); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...