【问题标题】:Let users draw a line (arrow) on a div/img让用户在 div/img 上画一条线(箭头)
【发布时间】:2023-03-25 05:55:01
【问题描述】:

使用 jQuery 插件:imgareaselect (http://odyniec.net/projects/imgareaselect/),我让用户选择图像的区域来添加 cmets(就像 flickr 一样)。 我的目标是让用户绘制指向特定图像区域的箭头,而不是绘制框。

知道是否(以及如何)我可以修改 imgareaselect 以绘制线条(带有箭头)而不是选择框?

我读到我可以使用 Canvas 或 processing.js,但 AFAIK 要么不起作用,要么对 IE 有限制。

谢谢, 亚瑟

【问题讨论】:

标签: javascript jquery drawing draw


【解决方案1】:

您可以使用 CSS 绝对定位在照片顶部制作一组箭头图像以叠加。例如,制作 18 个箭头,每个箭头都从最后一个旋转 360° / 18 = 20°。使用 CSS sprite 技术应该可以让您改变箭头的长度。

在下面的描述中,我将箭头的 start 称为文本框附近的结尾,将 end 称为指向文本框上的点图片。

要计算(顺时针)箭头角度以使用给定的一对像素指向的 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;

【讨论】:

  • 感谢您的快速回复!这似乎是一个很好的解决方案,但是,我想在用户拖放时向他们显示箭头,就像这个 Raphael.js 解决方案一样:fcargoet.evolix.net/demos/extjs/Ext.ux.DDArrow/example/…。但是,我希望箭头保持不变,并且我不想使用 Ext JS 库。 Raphael.js 似乎是一个不错的选择(适用于 IE)。我只需要找到一些示例代码来学习如何绘制箭头(而不是线条)。
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2011-05-05
  • 2015-05-21
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多