http://jsfiddle.net/WnxdS/3/
В моей реализации (в соответствии с ответом rsplak) мы отслеживаем изменение движения мыши между моментом срабатывания мыши и моментом запуска мыши. Затем, с помощью простых преобразований, мы поворачиваем это изменение на 45 градусов по часовой стрелке и изменяем позицию перетаскиваемого объекта из его исходного положения на эту величину.
Это простые преобразования:
а. Сначала мы переворачиваем координату y (ось y на компьютере указывает вниз)
[x] [ x]
[y] --> [-y]
б. Затем выполняем вращение:
[cos(t) -sin(t)][ x] [xcos(t)+ysin(t)]
[sin(t) cos(t)][-y] --> [xsin(t)-ycos(t)]
с. И тогда мы откроем координату у.
[xcos(t)+ysin(t)] [ xcos(t)+ysin(t)]
[xsin(t)-ycos(t)] --> [-xsin(t)+ycos(t)]
Так что, если мы изменим координаты мыши (dx, dy), мы будем увеличивать координаты перетаскиваемого объекта на (dx * cos (45) + dy * sin (45), -dx * sin (45) + dy * cos (45))