Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有坐标的HTML5画布沿路径拖动图像

带有坐标的HTML5画布沿路径拖动图像
EN

Stack Overflow用户
提问于 2014-02-04 13:30:12
回答 2查看 4.1K关注 0票数 4

是否有可能有一个坐标数组,并拖放图像仅沿这些坐标?我只想使用javascript,而不使用javascript库。我一直抓挠我的头和谷歌这个永远,并没有找到如何做到这一点,如果它是可能的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 14:25:37

演示:http://jsfiddle.net/m1erickson/7vmML/

示例代码:

代码语言:javascript
运行
AI代码解释
复制
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
    body{ background-color: ivory; }
    #canvas{border:1px solid red;}
</style>

<script>
$(function(){

    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    var $canvas=$("#canvas");
    var canvasOffset=$canvas.offset();
    var offsetX=canvasOffset.left;
    var offsetY=canvasOffset.top;
    var scrollX=$canvas.scrollLeft();
    var scrollY=$canvas.scrollTop();

    var isDown=false;
    var startX;
    var startY;

    var points=[];
    points.push({x:10,y:10});
    points.push({x:75,y:100});
    points.push({x:150,y:125});
    points.push({x:125,y:200});

    var imageX=-200;
    var imageY=-200;

    var img=new Image();
    img.onload=start;
    img.crossOrigin="anonymous";
    img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/house32x32transparent.png";
    function start(){
        drawAll();
    }

    function drawAll(){

        ctx.clearRect(0,0,canvas.width,canvas.height);

        ctx.beginPath();
        ctx.moveTo(points[0].x+4,points[0].y+4)
        for(var i=1;i<points.length;i++){
            var pt=points[i];
            ctx.lineTo(pt.x+4,pt.y+4);
        }
        ctx.stroke();
        //
        for(var i=0;i<points.length;i++){
            var pt=points[i];
            ctx.fillRect(pt.x,pt.y,8,8);
        }
        //
        ctx.drawImage(img,imageX,imageY);

    }

    function handleMouseDown(e){
      e.preventDefault();
      isDown=true;
    }

    function handleMouseUp(e){
      e.preventDefault();
      isDown=false;
    }

    function handleMouseOut(e){
      e.preventDefault();
      isDown=false;
    }

    function handleMouseMove(e){
      if(!isDown){return;}
      e.preventDefault();
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);

      var minDistance=1000;
      var minPoint=-1;
      for(var i=0;i<points.length;i++){
          var pt=points[i];
          var dx=mouseX-pt.x;
          var dy=mouseY-pt.y;
          var distance=Math.sqrt(dx*dx+dy*dy);
          if(distance<minDistance){
              minDistance=distance;
              imageX=pt.x-img.width/2;
              imageY=pt.y-img.height/2;
          }
      }
      drawAll();
    }

    $("#canvas").mousedown(function(e){handleMouseDown(e);});
    $("#canvas").mousemove(function(e){handleMouseMove(e);});
    $("#canvas").mouseup(function(e){handleMouseUp(e);});
    $("#canvas").mouseout(function(e){handleMouseOut(e);});

}); // end $(function(){});
</script>
</head>
<body>
    <h4>Drag mouse.  Image will snap to nearest point.</h4>
    <canvas id="canvas" width=300 height=300></canvas>
</body>
</html>

请注意,此示例代码使用jQuery侦听鼠标事件。如果您希望使用纯javascript,则可以使用以下事件绑定:

代码语言:javascript
运行
AI代码解释
复制
canvas.onmousedown=handleMouseDown;
canvas.onmouseup=handleMouseUp;
canvas.onmouseout=handleMouseOut;
canvas.onmousemove=handleMouseMove;

你可以像这样计算鼠标的位置:

代码语言:javascript
运行
AI代码解释
复制
  function getMousePos(canvas,e) {
      var rect=canvas.getBoundingClientRect();
      return{ x:e.clientX-rect.left, y:e.clientY-rect.top };
  }
票数 3
EN

Stack Overflow用户

发布于 2014-02-04 14:25:50

是的,计算到每个点的最短距离,并用最近的点覆盖鼠标位置。

让我们以一个简单的点数组为例:

代码语言:javascript
运行
AI代码解释
复制
var points = [10,200, 50,250, 100,100, 150,120, 200,240,
              250,200, 300,120, 350,180, 400,150];

现在,当你移动你的项目,你得到最近的点这样:

让我们首先获取鼠标x和y的位置(对于演示-在您的代码中,您将使用项目的位置):

代码语言:javascript
运行
AI代码解释
复制
var rect = canvas.getBoundingClientRect(),
    x = e.clientX - rect.left,
    y = e.clientY - rect.top,

现在,您可以迭代点数组并获得与鼠标x和y的最短距离的点:

代码语言:javascript
运行
AI代码解释
复制
var i = 0,
    pIndex = -1,
    minDist = 999999999,
    dist;

/// get shortest distance
for(; i < points.length; i+=2) {

    /// get distance from current point to mouse x,y
    dist = getDistance(x, y, points[i], points[i+1]);

    /// if less than previous distance, update
    if (dist < minDist) {
        minDist = dist;  /// current low
        pIndex = i;      /// point index
    }
}

pointX = points[pIndex];
pointY = points[pIndex+1];

计算距离的函数是简单的三角函数,计算低音值:

代码语言:javascript
运行
AI代码解释
复制
function getDistance(x1, y1, x2, y2) {
    var dx = x2 - x1,
        dy = y2 - y1;
    return Math.abs(Math.sqrt(dx * dx + dy * dy));
}

现在,您可以在(pointX, pointY)绘制您的项目。

现场演示

这里的例子使用了一个非常粗糙的点数组。如果您需要更好的分辨率,您可以使用像这条这样的线条更流畅或插入线上的点。下面是一个应用线条平滑来提高其分辨率和平滑度的版本(您可以通过将张力设置为0来降低平滑度,还可以通过更改分段数来调整分辨率,请参见下面的演示):

下面是一个使用线条平滑的演示

还请记住,您可能需要优化检查范围,例如,先执行粗略的迭代,然后使用3-4最近的点,并在所表示的范围之间进行更精细的迭代。

更新

要只在按住,移动出现时才允许抓取,请将这些行添加到代码中:

代码语言:javascript
运行
AI代码解释
复制
var allowMove = false;

canvas.onmousedown = function() {
    allowMove = true;
}
canvas.onmouseup = function() {
    allowMove = false;
}
canvas.onmousemove = function(e) {
    
    if (!allowMove) return;

    ... as before ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21563876

复制
相关文章
Erlang语言不是用来解决所有问题的语言
Erlang应用场合 未来的计算是并发计算。现今甚至桌面CPU也是多核的,当用户给服务器购买了越来越多的CPU时,他们更期望能最大限度地利用他们的新投资,但是今天的许多软件系统并不能很好地做到这一点。 整个软件行业也在发生重大变革,由卖工具软件转向卖服务(软件免费,这也是开源软件兴起的过程),由单纯客户端向B/S或C/S转化,相应的存储和计 算向服务器端转移,由原来的PC客户端向客户端多元化(如手机、PDA、电视机顶盒等)转化。这些变革趋势,使得用户可以更方便地访问到服务的同时,服务 器也要承受越来越高的负荷,并行/分布的需求逐渐增加。 Erlang语言不是用来解决所有问题的语言,至少现在还不是。Erlang最初专门为通信应用设计的,比如控制交换机或者变换协议等,非常适合于构 建分布式,实时软并行计算系统。它是一门专注的语言,可以适应现代服务器要求高负荷、高可靠、持续服务的需求。它要解决的问题域包括:高并发、分布式、持 续服务、热升级和高可靠等问题。 Erlang应用实例 典型的Erlang应用是由很多被分配不同任务的“节点(Node)”组成的“集群 (Cluster)”。一个Erlang节点就是一个Erlang虚拟机的实例,用户可以在一台机器(服务器、台式机或者笔记本)上运行多个节点。 Erlang节点自动跟踪所有连接着的其他节点。要添加一个节点仅仅需要将其指向任何一个已建节点就可以了。只要这两个节点建立了连接,所有其他节点马上 就会感应到新加入的节点。Erlang进程使用进程ID向其他进程传递报文,进程ID包含着运行此进程的节点信息。因此进程不需要理会正在与其交流的其他 进程实际在何处运行。一组相互连接的Erlang节点可以看作是一个网格计算体或者一台超级计算机。 erlang的odbc应用程序结构图 Yaws是一个Erlang写的Web服务器。ErLang本身带有一个HTTP Server,叫做inet。Yaws对于inet,就相当于Servlet对于Http Server。Yaws也可说是一个Web开发框架,Yaws的ehtml类似于jsp、 php、ruby template。Yaws并发能力是Apache的15倍,有人利用16台集群服务器所做的显示,Yaws可以承受超八万并发活动,Apache在四千 就宕机了。 erlang和ruby的简单测试 Ejabberd也是Erlang很好的应用实例,也是目前可扩展性最好的一种 Jabber/XMPP服务器,支持分布多个服务器,并且具有容错处理,单台服务器失效不影响整个集群运作。Ejabberd基于ErLang+ Mnesia构建,项目已成功发展5年,占据30%左右Jabber服务器市场。 Tsung则是多协议分布式压力测试工具,可用于测试Http、Soap、Postgresql和Jabber/XMPP服务器。而Wings则是一个3D建模程序,软件支持Windows、Mac OSX和Linux等操作系统,这两个项目都基于Erlang构建。 Erlang将会成为一个非常重要的语言。如果有了大公司的支持,它甚至可能成为下一个Java。因为它是个开源项目,非常适合多核处理、Web服务等领域。事实上,它也是编写在多核机器上运行的高可靠性系统的唯一成熟语言。 Erlang始于20年前,是一个并发性Prolog,Joe Armstrong创造了它。第一个大型Erlang项目是一个由几百人创建的电信交换系统,系统有数百万行代码。系统主要关注的就是可靠性,并且系统有 难以置信的可靠性历史。据Joe介绍,“它有99.9999999%的可靠性”。 这意味着每10亿秒才有1秒宕机时间,或者说10亿分钟有1分钟宕机时间。十亿秒大概是30年,10亿分钟大概有2000年。99.999% 的可靠性大概是每年宕机5分钟,这已经是很好的了。了解可靠性的人都知道,可靠性系统有 99.9999%的,甚至99.99999%的,但是估计没听过有99.9999999%可靠性的,可基于Erlang的系统实现了。 但这还不是令Erlang壮大的理由,因为不是什么人都关注可靠性。也不是因为 Erlang是一个函数式语言,更不是并行Erlang是个面向对象语言。其发展迅速的主要原因是唯一一个有可靠实现和完善类库的成熟的并行开发语言,在 不久的将来所有的桌面系统、笔记本电脑都将是多核的,而要让程序在多核上更快的运行就要使程序能充分利用多核处理的能力。 Erlang带有一组类库。多数类库是用于构建各类Internet服务的。 Erlang有Web服务器和数据库。Erlang社区认为它是构建可靠Web服务器和Web服务的首选语言。Erlang是一个构建可靠系统的框架/平 台,它构建的平台可以持续运行而无需关闭,可以每天更新软件,甚至可以定期的更换硬件。这些特性是电信应用所需要的,它还是在线银行、
用户7705674
2021/10/06
1.1K0
在Windows上运行单节点的Cassandra
Cassandra可以安裝在很多系统上, 我是安装在windows server 2008 R2上,安装相当简单,只要把下载下来的压缩包解压缩放到一个目录下就可以了,这里主要是记录下使用体验: Cassandra官网: http://cassandra.apache.org/,下载页面 http://cassandra.apache.org/download/ Cassandra用java开发的,要求安装JVM 1.6以上,推荐 Version 6 Update 23  到Java官网下载 http://w
张善友
2018/01/19
2.4K0
在Windows上运行单节点的Cassandra
在 Ubuntu Linux 上安装最新的 Erlang
Erlang 在 Ubuntu 的 Universe 仓库 中可用。启用该仓库后,你可以使用下面的命令轻松安装它:
用户8965210
2021/09/27
2.9K0
Elixir: 编程语言的未来
这篇文章谈一谈最近火爆的 Elixir,同时说一下对编程语言选择的看法。同时作为 Erlang 发烧友,Elixir 不可不提。即使有了那么多编程语言 Elixir 也值得接触。本文主要分为以下四块内
时见疏星
2018/06/01
3K0
Erlang 01 - 子进程规范
子进程规范是一个用于描述监督者管理的进程的元组. 对于大多数监督者而言, 子进程会随监督者的启动而启动, 并在监督者的生命周期结束时退出. 对于单个需要监督的进程, init/1函数给出的描述如下:
Reck Zhang
2021/08/11
1.1K0
在较小内存的机器上运行Elasticsearch与Kibana
因为穷,只买得起1G内存的乞丐配置版的云服务器,但是又想玩玩Elasticsearch+Kibana。而Elasticsearch默认的heap size就是1G,很容易卡死,因此需要手动修改一下配置。
dandelion1990
2019/07/16
5.2K0
[答疑]人翻书,翻书的操作是在人上还是书上
我有个问题,有个类书,一个类人,现在人想翻书,那么翻这个方法是放在书的类上,还是人的类上
用户6288414
2019/09/23
7280
[答疑]人翻书,翻书的操作是在人上还是书上
Struts2的Action是单例还是多例 / SpringMVC的controller默认是单例还是多例?
根据文章,Struts2的Action是单例模式,而SpringMVC的Controller默认是单例模式。单例模式可以提高SpringMVC性能,不需要每次相应请求都创建一个对象。然而,在特殊情况下,需要在Controller类定义属性时,单例肯定会出现竞争访问,需要将单例改为多例模式。在Spring整合Struts2开发时,如果需要用使用Struts2多例,就在spring的action bean配置的时候设置scope=\"prototype\"。
程裕强
2018/01/02
1.9K0
Ruby vs Elixir | 2022 该选哪个?
Ruby 和 Ruby on Rails 可能并不需要过多的介绍,因为它们已经被广泛的应用在 Web 开发领域。
RiemannHypothesis
2022/09/28
1.7K0
工业互联网爆火的背后,是顺势而为还是逆流而上?
工业互联网是互联网和新一代信息技术在工业全领域、全产业链、全价值链中的融合集成应用,是实现工业智能化的综合信息基础设施。
SDNLAB
2020/04/16
4520
这有“三高一快零故障”网络架构实践,还有掉坑逃生指南
内容来源:2017 年 11 月 04 日,中兴高级系统架构师魏猷君在“2017厦门软件技术峰会”进行《高可靠性网络架构实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
IT大咖说
2018/07/30
7810
这有“三高一快零故障”网络架构实践,还有掉坑逃生指南
View Merge 在安全控制上的变化,是 BUG 还是增强 ?
什么是 View Merge View Merge 是 12C 引入的新特性,也是一种优化手段。当查询中引用了 View 或 inline view 时,优化器可以将主查询中的查询条件并入视图当中去进行优化选择以获得代价最小的执行计划。而如果视图不属于当前执行语句的用户,View Merge 就可能存在潜在 OPTIMIZER_SECURE_VIEW_MERGING(默认是 TRUE)控制。当执行语句的用户缺乏对视图的 MERGE VIEW 权限,也没有 MERGE ANY VIEW 权限时,是否允许优化器
数据和云
2018/03/29
7620
检查高 CPU 进程在 Linux 上运行时间的脚本
给 long-running-cpu-proc.sh 设置可执行的 Linux 文件权限。
用户4988085
2021/09/15
2.2K0
View Merge 在安全控制上的变化,是 BUG 还是增强 ?
View Merge 是 12C 引入的新特性,也是一种优化手段。当查询中引用了 View 或 inline view 时,优化器可以将主查询中的查询条件并入视图当中去进行优化选择以获得代价最小的执行计划。而如果视图不属于当前执行语句的用户,View Merge 就可能存在潜在 OPTIMIZER_SECURE_VIEW_MERGING(默认是 TRUE)控制。当执行语句的用户缺乏对视图的 MERGE VIEW 权限,也没有 MERGE ANY VIEW 权限时,是否允许优化器进行 View Merge 优化。
数据和云01
2019/05/26
5550
在一台机器上配置 redis 哨兵模式
最后要检查服务器防火墙有没有开放这些端口 6379, 6380, 6381, 26379, 26380, 26381
北漂的我
2021/01/18
1.6K0
Erlang设计原则Behaviour
ChildSpec参数{Id, StartFunc, Restart, Shutdown, Type, Modules}
职场亮哥
2020/10/10
7650
数据中台是真火还是炒作?
马云老师在2019年说了一段话,“很多人会把数据比作石油,我们现在搭建的数据中台,就是希望扮演发电厂的角色”,这一段话,现在被大众认为是“数据中台”这个概念的起源。
凯哥
2020/01/17
8600
数据中台是真火还是炒作?
从 10 Gb 到 40 Gb,从百万级到千万级转发,打造高性能 TGW
腾讯架构师
2017/09/08
6.5K1
从 10 Gb 到 40 Gb,从百万级到千万级转发,打造高性能 TGW
小程序可以打破平台限制在硬件设备上运行吗?
在小程序技术日益成熟、生态日益善的前景下,运营者们发现小程序“即用即走、轻量开发”的特点非常契合各种硬件设备的使用场景;开发者们对“一次开发,多端运行”的诉求也变得越来越强烈。
用户10245619
2023/01/11
7790
用 abstract unix socket 实现进程单实例运行
http://stackoverflow.com/questions/2964391/preventing-multiple-process-instances-on-linux
byronhe
2021/06/25
1.3K0

相似问题

如何根据类的基数对个体进行分类

14

如何在excel中根据条件对值进行分类

10

如何根据某一条件对组进行小计

22

根据条件对特定行数进行平均

12

根据其他数据集的条件对变量进行分类

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档