правильный алгоритм для реализации столкновений шара о стену
Всем привет, стоит задача реализовать простейшие столкновения шара о стены прямоугольника в котором он бесконечно движется (а в дальнейшем хочется развить это до биллиарда).
Шар движется прямолинейно, следовательно при ударе о стену отскакивать он будет под тем же углом который был до столкновения. Пусть первое столкновения это тот момент, когда шар впервые начинает свое движение по прямоугольнику, начиная с этого момента и в процессе своего движения координаты x и y фиксируются в неком объекте состояния для определения направления отскока. уточню последнее сказанное на примере: 1) если текущая координата х >= canvasWidth (это означает, что шар ударяется о правую стенку прямоугольника, либо летит в один из углов с правой стороны) - то делать что то с направлением отскока и зафиксировать х и у в объекте состояния. 2) если текущая координата y >= canvasHeight (это означает, что шар ударяется о нижнюю стенку прямоугольника, либо летит в нижний правый или левый угол) - то определить с помощью объекта состояний сторону(стенку) из которой шар двигался вниз и исходя из этого делать что то с направлением отскока, далее опять зафиксировать х и у в объекте состояний. ... и так далее тоесть при каждом определении момента удара шара о стену эти координаты х и у фиксируются чтобы была возможность выбрать нужное направление отскока (например если шар ударяется в правую стенку, отскакивая сверху, то следующий отскок будет влево и вниз, если шар ударяется в правую стенку снизу то отскок будет вверх и влево и т.д.) Проблема в том, что этот алгоритм не могу до конца реализовать, потому что получаются по 4 по 5 проверок для каждой из сторон и код становится трудным. Тоесть стало быть раз не получается реализовать, значит алгоритм неверный ?? но что в нем не так ?? подскажите верный алгоритм реализации этого дела ... спасибо p.s. использую HTML5 Canvas API без сторонних библиотек |
В простейшем случае движение можно представить как смещение по x и y на определенную величину (отдельную для x и y). Соответственно для равномерного движения можно просто менять при соударениях соответствующую величину смещения на противоположную. Но бильярд так не сделаешь. Тут надо подключать векторы и линейную алгебру. В общем, это на геймдев форумах всё обсуждается. Но понадобится матчасть.
|
Часовой пояс GMT +3, время: 02:23. |