Javascript 在html5画布中使用鼠标旋转图像

Javascript 在html5画布中使用鼠标旋转图像,javascript,jquery,html,rotation,html5-canvas,Javascript,Jquery,Html,Rotation,Html5 Canvas,我在使用html5用鼠标旋转图像时遇到了一些问题。我有一个背景图像和一个前景图像。图像显示正确,但我无法使前景图像旋转 var canvas = document.getElementById("canvas"), ctx = canvas.getContext("2d"); var canvasOffset = $("#canvas").offset(); var offsetCX = canvasOffset.left; var offsetCY = canvasOffset.top;

我在使用html5用鼠标旋转图像时遇到了一些问题。我有一个背景图像和一个前景图像。图像显示正确,但我无法使前景图像旋转

var canvas = document.getElementById("canvas"),
  ctx = canvas.getContext("2d");

var canvasOffset = $("#canvas").offset();
var offsetCX = canvasOffset.left;
var offsetCY = canvasOffset.top;
var cx = canvas.width / 2;
var cy = canvas.height / 2;
var r = -2.3;

var background = new Image();
background.src = "http://i.imgur.com/dHDMocI.png";

background.onload = function drawBackground() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.drawImage(background, 0, 0);

  var pijl = new Image();
  pijl.src = "http://i.imgur.com/2N70aC1.png";

  pijl.onload = function drawPijl() {
    var xOffset = pijl.width / -2;
    var yOffset = pijl.height / -2;
    ctx.save();
    ctx.translate(242, 233);
    ctx.rotate(r);
    ctx.drawImage(pijl, xOffset, yOffset);
    ctx.restore();
  }
}

function handleMouseDown(e) {
  mouseX = parseInt(e.clientX - offsetCX);
  mouseY = parseInt(e.clientY - offsetCY);
  drawBackground(false);
  isDown = ctx.isPointInPath(mouseX, mouseY);
  console.log(isDown);
}

function handleMouseUp(e) {
  isDown = false;
}

function handleMouseOut(e) {
  isDown = false;
}

function handleMouseMove(e) {
  if (!isDown) {
    return;
  }

  mouseX = parseInt(e.clientX - offsetCX);
  mouseY = parseInt(e.clientY - offsetCY);
  var dx = mouseX - cx;
  var dy = mouseY - cy;
  var angle = Math.atan2(dy, dx);
  r = angle;
  drawBackground();
}

$("#canvas").mousedown(function(e) {
  handleMouseDown(e);
});
$("#canvas").mousemove(function(e) {
  handleMouseMove(e);
});
$("#canvas").mouseup(function(e) {
  handleMouseUp(e);
});
$("#canvas").mouseout(function(e) {
  handleMouseOut(e);
});
以下是我的JSFIDLE:

我使用了这段代码的一部分,我对其进行了编辑以用于我的图片:

我的目标是能够在按下鼠标时围绕其中心旋转前景图像(大白色箭头),并在释放鼠标时固定。我想我实现了我用错的代码。如果我手动更改变量“r”(角度)并运行代码,则图像确实会旋转

任何帮助都将不胜感激。

Scope 第一个问题是变量/函数范围不正确造成的。查看这些错误(它们将出现在控制台中):

未捕获引用错误:
isDown
未定义

未捕获引用错误:
drawPijl
未定义

未捕获引用错误:
pijl
未定义

正确界定这三个方面

逻辑 能够进行研究是一项宝贵的技能。看

编码实践 可以很容易地浓缩为:

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

这些是你的主要问题

快乐编码


下面是一个有效的示例,它演示了另一个可能需要修复的问题。

Scope 第一个问题是变量/函数范围不正确造成的。查看这些错误(它们将出现在控制台中):

未捕获引用错误:
isDown
未定义

未捕获引用错误:
drawPijl
未定义

未捕获引用错误:
pijl
未定义

正确界定这三个方面

逻辑 能够进行研究是一项宝贵的技能。看

编码实践 可以很容易地浓缩为:

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

这些是你的主要问题

快乐编码



这是一个有效的解决方案,并演示了另一个可能需要解决的问题。

对于html5画布,我是一个新手,所以我不确定是否能够用这些信息解决它,但我肯定会尝试一下。谢谢。@ArnoVosman请参见编辑。这里有一个实用的小提琴:试着用它。我希望这会有帮助。但你必须纠正旋转算法。@DmitriyLoskutov,谢谢!我将您的一些代码编辑成这样:现在似乎工作得更好了。剩下的唯一问题是我无法单击箭头,因为它将跳转到另一个位置(-pi/2弧度)。你知道为什么吗-编辑:将pi/2添加到“angle”变量中,它成功了!对于html5画布,我是一个新手,所以我不确定是否能够用这些信息修复它,但我肯定会尝试一下。谢谢。@ArnoVosman请参见编辑。这里有一个实用的小提琴:试着用它。我希望这会有帮助。但你必须纠正旋转算法。@DmitriyLoskutov,谢谢!我将您的一些代码编辑成这样:现在似乎工作得更好了。剩下的唯一问题是我无法单击箭头,因为它将跳转到另一个位置(-pi/2弧度)。你知道为什么吗-编辑:将pi/2添加到“angle”变量中,它成功了!