Найти радианы угла отражения - PullRequest
2 голосов
/ 29 апреля 2011


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

То, что я до сих пор делал, это с помощью мыши ты (щелкаешь и отпускаешь) отбиваешь мяч в этом направлении, используя радианы. Теперь я хотел бы, чтобы мяч ударялся о стенку, отскакивая под углом отражения. Например. если мяч ударяется о правую стенку, движущуюся в радианах в -0,65, он должен отскочить назад в радианах примерно на -2,5

Не могли бы вы объяснить мне, как я это делаю? Спасибо

Ответы [ 3 ]

8 голосов
/ 29 апреля 2011

Если вы работаете с радианами, вы должны (всегда) выражать их в пи, просто делите на пи. Облегчите работу и поймите.

-0.65 rad = -0.207*Pi rad
-2.5 rad = -0.796*Pi rad

Полный круг - 2 * Пи. Нормаль для горизонтальной поверхности равна 0,5 * Пи (или -0,5 * Пи).

normal = 0.5*Pi
angle of incidence = i + Pi - 0.5*Pi //EDIT: +Pi, need to invert the direction
angle of reflection = 0.5*Pi - angle of incidence

См. Отражение в Википедии для изображения и некоторого объяснения. Это дает эту формулу для горизонтальной стены:

r = 0.5*Pi - (i + Pi - 0.5*Pi)
r = 2*Pi - i 
r = -i //subtract 2*Pi

Например

i = -0.207*Pi //gives
r = 0.207*Pi //for a horizontal wall

Аналогично по вертикали стена:

r = 0 - (i + Pi - 0)
r = -Pi - i

РЕДАКТИРОВАТЬ Я понял, что это не правильно. Чтобы формула работала, i должен указывать точно в противоположном направлении. Исправлено, надеюсь, теперь это правильно. Если у меня будет время, я добавлю изображение, объясняющее ошибку и решение.

2 голосов
/ 29 апреля 2011

Такого рода вещи гораздо проще сделать с помощью векторов (как в точечных векторах, а не в массиве векторов).

Предполагая, что у вашего круга есть Вектор v (направление, в котором он движется), и вы сталкиваетесь с линией, которая имеет нормализованный нормальный Вектор n (нормаль - это Вектор, который проходит перпендикулярно линии - нормализованный означает, что он имеет длина 1), то вы можете рассчитать отражение следующим образом:

// gets the dot product between 2 points
public function dot( a:Point, b:Point ):Number
{
    return ( a.x * b.x ) + ( a.y * b.y );
}

// reflects a point
public function reflect( p:Point, dir:Point ):void
{
    // using the formula [R = V - (2 * V.N) * N] or [V -= 2 * N * (N.V)]
    var vn2:Number  = 2.0 * MathHelper.dot( p, dir );
    p.x = p.x - ( dir.x * vn2 );
    p.y = p.y - ( dir.y * vn2 );
}

Тогда звоните reflect( v, n );

В зависимости от того, с какой стороны линии вы сталкиваетесь (слева или справа), вам может понадобиться умножить последние x и y на -1

Для хорошего обзора Векторов посмотрите http://tonypa.pri.ee/vectors/start.html (это старо, но понятия являются здравыми)

0 голосов
/ 29 апреля 2011

С помощью простой математики вы можете преобразовать радианы в градусы и наоборот:

var radians :Number = 90 * (Math.PI / 180);
var degrees :Number = radians * (180 / Math.PI);
trace(radians, degrees)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...