Это довольно аккуратно!
Вы делаете правильный путь, но на самом деле вы должны использовать функцию atan2. Это устраняет необходимость любых 0 проверок.
Функция atan2 дает вам угол, который против часовой стрелки от положительного вектора x
(1, 0) --->
Пчелы находятся на 90 градусов от этого начального угла, поэтому вы должны вычесть 90 градусов от направления. (в зависимости от того, в какую сторону вы выполняете вычисления dy и dx, вам может потребоваться добавить)
Вы можете обнаружить, что направление быстро меняется, поэтому вы можете рассмотреть возможность ограничения следующего изменения набором изменений, которые вызывают изменение угла ниже некоторого порога. Это сделает движение немного более плавным.
Я бы на самом деле пошел на это, сгенерировав угол между, скажем, -pi / 8 и pi / 8 радиан и случайную длину. По сути, используя полярные координаты. Затем добавьте это новое случайное полярное смещение в положение x и y, например
newX = currentX + (randomLength * cos(randomAngle + currentAngle)) and
newY = currentY + (randomLength * sin(randomAngle + currentAngle))
Если вы работаете с углами, вы также можете получить более естественные эффекты, например, если вы хотите, чтобы пчелы оставались в определенной области, вы можете принудительно смещаться к центру области, когда они приближаются к краю. 1016 *
Обновление:
Так что я посмотрел поближе. Проблема в том, что вы ожидаете .rotate установить вращение, когда оно на самом деле добавляет к вращению
Есть 2 варианта исправления.
Поворот на разницу между предыдущим и текущим углом
Установить вращение, используя метод .transform
Вы можете увидеть решение 2 в действии здесь http://jsfiddle.net/c5A2A/