Проблема в математике, если вы хотите ограничить момент объекта на окружности, он вычислит угол вектора от центра к положению мыши. А затем вы рассчитываете новую позицию, используя угол и centerRadius
. Вы в основном помещаете прямую бесконечную линию, начинающуюся в центре мышки, а затем вычисляете пересечение линии с окружностью.
deltaLeft = p.left - centerPointX;
deltaTop = p.top - centerPointY;
var radians = Math.atan2(deltaTop, deltaLeft)
p.left = Math.cos(radians) * centerRadius + centerPointX
p.top = Math.sin(radians) * centerRadius + centerPointY
jsfiddle demo
Если вы действительно хотите иметь диапазон от centerRadius - 5
до centerRadius + 5
, то это можно легко расширить до:
var length = Math.sqrt(deltaLeft * deltaLeft + deltaTop * deltaTop);
// change the position only if mouse is outside if the centerRadius +/- 5 range
if (length <= centerRadius - 5 || length >= centerRadius + 5) {
var radians = Math.atan2(deltaTop, deltaLeft)
if (length < centerRadius) {
length = centerRadius - 5;
} else {
length = centerRadius + 5;
}
p.left = Math.cos(radians) * length + centerPointX
p.top = Math.sin(radians) * length + centerPointY
}
демонстрация скрипки