Nano Hash - криптовалюты, майнинг, программирование

Проблема коллизии C++

Я проверяю столкновение между многочисленными движущимися квадратами в дереве квадрантов.

Когда два квадрата сталкиваются, я инвертирую их скорость следующим образом:

    for (auto pair : collisionPairs)
    {
        auto& square1 = static_cast<Square&>(*(pair.first));
        auto& square2 = static_cast<Square&>(*(pair.second));

        square1.setVelocity(-square1.getVelocity());

        square2.setVelocity(-square2.getVelocity());

    }

Проблема в том, что обнаружение столкновений происходит не всегда в одном кадре.

Иногда это столкновение между одинаковыми квадратами более одного кадра, потому что квадраты пересекались слишком глубоко.

Таким образом, квадраты перекрываются, и они продолжают бесконечно изменять свою скорость, что приводит к скорости 0 ( -velocity + Velocity = 0 )

Как я мог это исправить?

РЕДАКТИРОВАТЬ: я обнаружил, что проблема с глубоким пересечением была вызвана моим деревом квадрантов, я забыл проверить столкновение с объектами дочерних деревьев.

Теперь это ВСЕ ЕЩЕ происходит, но очень редко, например, 1 из 100 столкновений, раньше было ~ 20 из 100 столкновений.

26.04.2014

  • Возможно, вам также следует изменить их положение, чтобы они больше не перекрывались, прежде чем они начнут двигаться в новом направлении. 26.04.2014
  • ОБНОВЛЕНИЕ: см. мое редактирование, пожалуйста. (Я приму один из ответов позже, потому что кажется, что есть несколько возможностей его исправить.) 26.04.2014
  • Пожалуйста, не размещайте ссылки на код! Сузьте его до соответствующих частей и покажите в своем вопросе. 26.04.2014

Ответы:


1

В дополнение к чистому обнаружению столкновений я бы также проверил, движутся ли центры квадратов друг к другу или нет, и только в первом случае меняет свою скорость. Чтобы я привел пример, вам нужно будет предоставить информацию о вашей реализации класса Square.

Изменить: по сути, логика будет выглядеть примерно так:

if (collision detected) {
    if ( (square2.posx-square1.posx)* (square2.vx-square1.vx) < 0) {            
        // EDIT: exchange velocities of square1 and square2 in x direction
    }
    if ( (square2.posy-square1.posy)* (square2.vy-square1.vy) < 0) {             
        // EDIT: exchange velocities of square1 and square2 in y direction
    }
}

Это, конечно, далеко от реалистичной симуляции столкновений, но если вы просто хотите увидеть, правильно ли работает обнаружение столкновений, этого должно быть достаточно. Кстати. Я предполагаю, что все края прямоугольника ориентированы по осям x и y.

26.04.2014
  • меняют скорость только в первом случае, а во втором? В любом случае, мне не нужно реалистичное столкновение, это было просто для тестирования моего дерева квадрантов, реверсирование в порядке, даже если это странно. 26.04.2014
  • Если они не движутся навстречу друг другу, значит, их скорость уже изменилась на противоположную, и нет необходимости менять ее снова. 26.04.2014
  • Ах, я вижу, я неправильно понял 26.04.2014
  • Это кажется самым простым способом, но мне трудно понять, движутся ли центры друг к другу, есть ли простая формула, чтобы проверить это, зная положение и скорость двух квадратов? 26.04.2014
  • Смотрите мою правку. Извините, что не использовал ваши настоящие классы 26.04.2014
  • Спасибо, что сделали это для меня (у меня плохо с логикой), работает отлично 26.04.2014

  • 2

    Вы можете дать своему классу Square дополнительное состояние inCollision() или около того и проверить это дополнительно:

    if(!square1.inCollision()) {
        square1.setVelocity(-square1.getVelocity());
        square1.setInCollision(true);
    }
    
    // Analogous code for square2
    

    // Set inCollision state to false, when you build the collisionPairs
    // Simplyfied pseudo code:
    if(intersect(square1,square2) {
         // make_pair blah blah
    }
    else {
         square1.setInCollision(false);
         square2.setInCollision(false);
    }
    
    26.04.2014
  • Я думаю, что это может создать некоторые проблемы, если объект сталкивается с более чем одним объектом одновременно. 26.04.2014
  • @broncoAbierto Вот почему я написал здесь Упрощенный псевдокод:. 26.04.2014
  • Я думаю, даже если бы это было упрощено, состояния inCollision было бы недостаточно. В каждом кадре, как только объект A обнаруживает столкновение с объектом B, для объекта A больше не будет обнаружено столкновений. Было бы необходимо сохранить состояние каждой возможной пары коллизий. 26.04.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..