Нахождение чисел в пределах области 10 в двух массивах - PullRequest
0 голосов
/ 12 апреля 2019

В настоящее время я программирую веб-игру для своего проекта APCS на конец года. Я пытаюсь найти ближайшее число в массиве, который полон координат для городов. Так как это координаты, мне нужно сделать это для массивов X и Y. Например, x = [10, 20, 30], y = [20, 10, 23], первый город будет в [10, 20]. Но так как точно найти это точное местоположение было бы сложно, вокруг него есть область из 10 координат, чтобы вы могли исследовать город.

Вот мой текущий код:

function setTowns() {
  for(i = 0; i < 9000; i++){
    townLocations.x.push(random(-1000, 1000));
    townLocations.y.push(random(-1000, 1000));
  }
}

function checkTown() {
  var townX = townLocations.x;
  var townY = townLocations.y;

  for(i = 0; i < townX.length; i++){
    if((Math.abs(townX[i]) - Math.abs(bb.location.x)) < 10){
      console.log(townX[i]);
      for(i = 0; i < townY.length; i++){
        if((Math.abs(townY[i]) - Math.abs(bb.location.y)) < 10){
          console.log(townY[i]);
          return true;
        }
        else {
          return false;
        }
      }
    }
  }
}

checkTown () вызывается каждый раз, когда игрок двигается.

1 Ответ

0 голосов
/ 12 апреля 2019

Изображение карты выглядит так:

1 0 0 0 0 0
0 0 1 0 0 1
0 0 ??‍♀️ 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0

Единицы города, а в нулях ничего нет ??‍♀️ отмечает игрока.

Вы можете использовать теорему Пифагора , чтобы определить любой тип "столкновения". Допустим, игрок находится недалеко от двух городов (городов), и у каждого города есть своя собственная координата (X, Y), а также игрок. Нарисуйте треугольник в своем уме, где координаты Y для обоих мест создают одну сторону треугольника, а координаты X - другую сторону. Расстояние - это гипотенуза.

Предположим, что расстояние для столкновения (читай: обнаружение) равно 1. Если игрок находится на координате (3, 3), будет ли город с координатой (2, 4) достаточно близким? Одна сторона треугольника будет идти от 3 до 2, а другая от 3 до 4. Что такое гипотенуза, то есть расстояние?

ОК, это математика для детей, потому что вы, вероятно, можете увидеть это сразу, но давайте посмотрим на математику за ней.

let playerXCoordinate = 3;
let playerYCoordinate = 3;

let townXCoordinate = 2;
let townYCoordinate = 4;

let xDifference = playerXCoordinate - townXCoordinate; // 3 - 2
let yDifference = playerYCoordinate - townYCoordinate; // 3 - 4

    // Pythagorean theorem
let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √(1^2 + 1^2) = √1 = 1

let isWithinDistance = hypotenuseAsDistance <= 1 // true

Давайте возьмем другой пример. На этот раз с городом, расположенным по адресу (5, 4).

let xDifference = 3 - 5;
let yDifference = 3 - 4

let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √((3-5)^2 + (3-4)^2) = √(2^2+1^2) = √(4+1) = √5 = 2.23606797749979

let isWithinDistance = hypotenuseAsDistance <= 1 // false

Однако более короткая версия доступна как часть объекта Math.

let xDifference = 3 - 5;
let yDifference = 3 - 4;

let hypotenuseAsDistance = Math.hypot(xDifference, yDifference);

Итак, что касается вашего примера, это будет что-то вроде этого.

let playerXPos = 3; // just an example
let playerXPos = 4; // just an example

let townArrLength = townLocations.x;
let detectionRange = 10;

let townXPos = 0;
let townYPos = 0;
let distance = 0;

for (let i = 0; i < townArrLength; i++) {
  townXPos = townLocations.x[i];
  townYPos = townLocations.y[i];
  distance = Math.hypot(playerXPos - townXPos, playerYPos - townYPos);

  if (distance <= detectionRange) {
     // do something
  }
}

Для получения дополнительной информации:
https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection

...