Вы можете сделать набор изображений стрелок для наложения, используя абсолютное позиционирование CSS, поверх фотографии. Например, сделайте 18 стрелок, каждая из которых повернута от последней на 360 ° / 18 = 20 °. Использование техники спрайтов CSS должно позволять вам изменять длину стрелки.
В последующем описании я ссылаюсь на начало стрелки в качестве конца рядом с текстовым полем, а конец - на точку, указанную на рисунке.
Чтобы вычислить угол стрелки (по часовой стрелке) для использования с учетом пары координат x-y пикселя, на который указывает пиксель, и координат текстового поля, мы используем:
var radians = Math.atan2(startY - endY, startX - endX),
degrees = radians * 180 / Math.PI;
if (degrees < 0) degrees += 360;
Тогда ваш сценарий может выбрать ближайшую готовую стрелку:
var approxDegrees = Math.round(degrees / 20) * 20;
Когда стрелка загружена, расположите ее верхний левый угол (относительно конца) в соответствии с:
var approxRadians = approxDegrees / 180 * Math.PI,
imageX = arrowLength * Math.cos(approxRadians),
imageY = arrowLength * Math.sin(approxRadians);
где l - длина стрелки.
Наконец, обрежьте стрелку:
var width = Math.abs(endX - startX);
var height = Math.abs(endY - startY);
и поместите центр текстового поля в начале стрелки.
var textX = (startX + textWidth) / 2;
var textY = (startY + textHeight) / 2;