Как я создаю обнаружение коллизий для своих прыгающих мячей?

Ну, после нескольких дней копания в интернете. Я нашел решение и думаю, что когда-нибудь оно поможет кому-то другому.

 QRCodeWriter qw = new QRCodeWriter();

try {
    HashMap<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    hints.put(EncodeHintType.MARGIN, margin);
    BitMatrix matrix = qw.encode(msg, BarcodeFormat.QR_CODE, width, height, hints);
    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < width; y++) {
            bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
        }
    }
    return bmp;
} catch (WriterException e) {
    e.printStackTrace();
}

Чтобы изменить цвет QR-кода, и если у вас есть arraylist как у меня, который хранит все hex строки. Вы можете использовать петли for и вставить строку hex.

Для изменения цвета на основе кода

 for (int x = 0; x < width; x++) {
    for (int y = 0; y < width; y++) {
        bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
    }
}

Color.Black можно заменить на arraylist (в моем случае я заменяю его своим colorArray ) и Color.White - это цвет фона QR-кода.

1113 Ну, надеюсь, это когда-нибудь кому-нибудь поможет. Счастливое кодирование .

7
задан Zaheer Ahmed 2 December 2013 в 05:34
поделиться

6 ответов

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

Это на самом деле легче с кругами. Если у вас есть два круга радиуса r1 и r2, столкновение произошло, если расстояние между центрами меньше r1 + r2.

Расстояние между двумя центрами (x1, y1) и (x2, y2) может быть вычисляется и сравнивается как:

d = sqrt((y2-y1) * (y2-y1) + (x2-x1) * (x2-x1));
if (d < r1 + r2) { ... bang ... }

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

dsqrd = (y2-y1) * (y2-y1) + (x2-x1) * (x2-x1);
if (dsqrd < (r1+r2)*(r1+r2)) { ... bang ... }

Сложный бит при вычислении новых векторов движения (скорость, с которой ( x, y) изменяется со временем для данного объекта), поскольку вам необходимо учитывать текущие векторы движения и точку контакта.

Я думаю, что в качестве первого среза,

10
ответ дан 6 December 2019 в 14:09
поделиться

Я думаю, что вы, ребята, упускаете что-то более простое, особенно из-за того, что он использует pygame.

Вызов функции get_rect может установить границы изображений и ] Rect , который создается, используется для вычисления положения изображения и, если в анимации присутствует более одного объекта, его можно использовать для обнаружения столкновений. Можно использовать

colliderect & rect , проблема в том, что я понятия не имею, как бы вы это реализовали, особенно для неизвестного количества шаров.

Помня, что это питон.

1
ответ дан 6 December 2019 в 14:09
поделиться

Обнаружение столкновений было хорошо охвачено ответом Пакса . Что касается отскока объектов друг от друга, я предлагаю проверить следующие ссылки, касающиеся упругих столкновений , неупругих столкновений и коэффициентов восстановления .

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

1
ответ дан 6 December 2019 в 14:09
поделиться

Обнаружение столкновения - это только первый шаг. Давайте разберемся с этим.

Самое быстрое, что нужно сделать, это вычислить их квадратные ограничивающие рамки и посмотреть, не сталкиваются ли они. Две стороны должны пересекаться (сверху 1 и снизу или 2, и слева от 1 и справа от 2, или наоборот), чтобы ограничивающие рамки перекрывались. Нет перекрытия, нет столкновения.

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

Хорошо! У нас два шара сталкиваются. Теперь что? Ну, они должны отскакивать друг от друга. То, как они отскакивают, зависит от нескольких факторов.

Первый - это их эластичность. Два отскакивающих друг от друга резиновых шара отскакивают не так, как два стеклянных шара.

Вторым является их начальная скорость. Инерция заявляет, что они захотят продолжать двигаться в том же направлении, в котором они начали.

Третий - масса шаров. Шар с меньшей массой отскочит от гораздо большей массы с более высокой скоростью.

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

Два шара редко попадают точно в мертвых. Скользящие удары гораздо вероятнее. В любом случае, удар будет происходить вдоль нормали касательной, где сталкиваются шары. Вам необходимо рассчитать векторную составляющую обоих вдоль этой нормали, учитывая их начальные скорости. Это приведет к паре нормальных скоростей, которые оба шара приведут к столкновению. Сложите сумму и храните ее где-нибудь под рукой.

Теперь мы должны выяснить, что каждый шар отнимает у нее. Результирующая нормальная скорость каждого шара обратно пропорциональна массе данного шара. Другими словами, возьмите обратную величину массы каждого шара, сложите обе массы вместе, а затем выделите результирующую нормальную скорость от столкновения на основе отношения массы шара к сумме обратной величины массы обоих шаров. Затем добавьте к этому тангенциальную скорость, и вы получите результирующую скорость шара.

Эластичность в основном та же самая, за исключением того, что требуется некоторое базовое исчисление из-за того, что шары все еще движутся, даже когда они сжимаются. Я оставлю это вам, чтобы найти соответствующую математику.

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

Эластичность в основном та же самая, за исключением того, что требуется некоторое базовое исчисление из-за того, что шары все еще движутся даже при сжатии. Я оставлю это вам, чтобы найти соответствующую математику.

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

Эластичность в основном та же самая, за исключением того, что требуется некоторое базовое исчисление из-за того, что шары все еще движутся даже при сжатии. Я оставлю это вам, чтобы найти соответствующую математику.

3
ответ дан 6 December 2019 в 14:09
поделиться

В старые добрые времена, когда циклы ЦП были премиальными, кодеры использовали простой трюк для обнаружения коллизий: они использовали такие цвета, которые можно было бы узнать по цвету пикселя, если это был фон или объект. Это было сделано по крайней мере в некоторых играх C64.

Не знаю, готовы ли вы пойти по этому пути, хотя ..

0
ответ дан 6 December 2019 в 14:09
поделиться

First you need to check collision with rect.colliderect(other_rect)

after that if they are colliding, you can check pixel perfect collision. So you don't mess with object's radius or shape.

For pixel perfect collision checking, I use Masks: Make both mask objects with mask.from_surface, then put them to Mask.overlap function.

0
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: