Ответы пользователя по тегу Java
  • Как выглядит алгоритм нахождения пересечения 1000 объектов?

    FlashManiac
    @FlashManiac
    I am from Krypton!
    Была такая же проблема в игре было много кораблей и снарядов. И надо было найти все пересечения снарядов со всеми кораблями. Алгоритм с простым перебором был жутко медленный. Поэтому мы сделали так:
    Разбили пространство на виртуальные квадраты с размером size
    Для этого мы создаем map и для каждой окружности мы ищем ее key.
    key = Math.floor(circle.x / size) + "_" + Math.floor(circle.y / size)
    if(!map[key]) map[key] = [];
    map[key].push(circle);

    Далее мы просто проходимся по ключам map и проверяем пересечения окружностей внутри квадрата. Получается, что проверок становится намного меньше благодаря группировки кругов в квадраты.

    Так же можно оптимизировать проверку пересечений кругов. Для круга мы должны знать его радиус.
    function isCollided(circle0, circle1)
    {
          var maxDistanceSquared = circle0.radius + circle1.radius;
          maxDistanceSquared *= maxDistanceSquared;
          
          var dx = circle0.x - circle1.x;
          var dy = circle0.y - circle1.y;
          
          var currentDistanceSquared = dx * dx + dy * dy;
          
          return currentDistanceSquared < maxDistanceSquared;
    }
    Ответ написан
  • If/else VS Ternary Conditional(тройное условие)?

    FlashManiac
    @FlashManiac
    I am from Krypton!
    Все просто! Использую такое правило во всех языках:
    ? и : используем там где нужно задать какое то значение и на результат значения влияет условие, так же запись должна быть краткой, примеры:
    // нахождение максимального значения
    max = a > b ? a : b; 
    
    // нахождения первого валидного значения
    result = x != null ? x : y != null ? y : null; 
    
     // возврат значения по условию
    return exists ? a : b;


    if / else / switch /case используем в остальных случаях, пример:
    // тут не разложить в тернарный оператор
    if (visible) {
        a = displayObject.x; // установка переменной a
    } else {
        b = displayObject.y; // установка переменой b
    }
    Ответ написан
    Комментировать