Ответы пользователя по тегу Алгоритмы
  • Как определить коллизию квадратов?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Для определения коллизии между двумя квадратами можно использовать простой алгоритм:

    Определить границы каждого квадрата, то есть вычислить координаты левого верхнего угла и правого нижнего угла для каждого квадрата.
    Проверить, пересекаются ли границы квадратов по осям X и Y. Если пересекаются, значит квадраты могут столкнуться.
    Для проверки столкновения на самом деле нам нужно убедиться, что оба квадрата пересекаются на самом деле, а не только их границы. Для этого нужно проверить, есть ли пересечение между сторонами квадратов.
    Вот пример функции на JavaScript, которая реализует этот алгоритм:
    function detectCollision(sq1, sq2) {
      // вычисляем границы квадратов
      const sq1_left = sq1.x;
      const sq1_right = sq1.x + sq1.side;
      const sq1_top = sq1.y;
      const sq1_bottom = sq1.y + sq1.side;
      
      const sq2_left = sq2.x;
      const sq2_right = sq2.x + sq2.side;
      const sq2_top = sq2.y;
      const sq2_bottom = sq2.y + sq2.side;
      
      // проверяем, пересекаются ли границы квадратов по осям X и Y
      const x_collide = sq1_right >= sq2_left && sq1_left <= sq2_right;
      const y_collide = sq1_bottom >= sq2_top && sq1_top <= sq2_bottom;
      
      // если пересекаются, проверяем наличие пересечения сторон
      if (x_collide && y_collide) {
        const top_collision = sq1_bottom >= sq2_top && sq1_top <= sq2_top;
        const bottom_collision = sq1_top <= sq2_bottom && sq1_bottom >= sq2_bottom;
        const left_collision = sq1_right >= sq2_left && sq1_left <= sq2_left;
        const right_collision = sq1_left <= sq2_right && sq1_right >= sq2_right;
        
        return top_collision || bottom_collision || left_collision || right_collision;
      }
      
      return false;
    }


    Здесь sq1 и sq2 представляют объекты квадратов со следующими свойствами:
    const square = {
      x: 100, // координата левого верхнего угла по оси X
      y: 50, // координата левого верхнего угла по оси Y
      side: 30 // длина стороны квадрата
    };


    Эта функция возвращает true, если квадраты пересекаются, и false в противном случае
    Ответ написан
    Комментировать
  • Как из массива целых чисел найти все возможные комбинации (не только двух чисел, а и более) дающие искомую сумму?

    TMProject
    @TMProject
    Frontend developer React/Redux
    const arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 8, 11, 13, 31, 31, 44, 51, 81, 65, 63];
    const target = parseInt(prompt("enter number", "52"));
    
    function findCombinations(sum, startIndex, currentCombination) {
      if (sum === target) {
        console.log(currentCombination);
        return;
      }
    
      for (let i = startIndex; i < arr.length; i++) {
        const num = arr[i];
        const newSum = sum + num;
        if (newSum <= target) {
          findCombinations(newSum, i + 1, [...currentCombination, num]);
        }
      }
    }
    
    arr.sort((a, b) => b - a); // сортируем массив по убыванию, чтобы начинать с самых длинных комбинаций
    findCombinations(0, 0, []);
    Ответ написан
    Комментировать