2012-08-04 110 views
2

一段时间以来,我一直在试图使用JavaScript在HTML5 Canvas中实现此功能。下面是一个例子图片:跟随鼠标的两条线之间的固定角度

Here's an example picture.

你可以看到一个例子,我只画来帮助自己,告诉你什么,我试图实现以上。 我想要做的是以下几点:在画布上有一个给定的X,Y坐标,这一点是两条线的固定起点。两条线之间的角度应始终固定,例如:40°。这两条线应该跟着鼠标在它们之间有一个固定的角​​度。在网站上搜索我可以达到以下状态: 基于this tutorial我可以创建鼠标后面的两条线,两条线的终点总是远离鼠标100px,但是当然,给我一个固定的角​​度,当我在画布上移动鼠标时,角度发生变化。

下面是绘制两条线的我的JS代码的一部分:

context.clearRect(0, 0, canvas.width, canvas.height); 
    context.beginPath(); 
    context.moveTo(xcoord, ycoord); 
    context.lineTo(ev._x+100, ev._y); 
    context.stroke(); 
    context.closePath(); 

    context.beginPath(); 
    context.moveTo(xcoord, ycoord); 
    context.lineTo(ev._x-100, ev._y); 
    context.stroke(); 
    context.closePath(); 

如果我和我的鼠标点击,我不松开按钮,两线跟随鼠标,这就是为什么context.clearRect部分在那里。

任何帮助将不胜感激,因为我自己无法解决这个问题。

+0

应如何根据鼠标坐标定位角度?线应该多久? – Bergi 2012-08-04 16:50:19

+0

这是我的问题:线的长度会根据指针离线的起点有多远而有所不同。用固定的线长,固定角度也不会成为问题:) – 2012-08-04 18:58:24

+0

但是没有太大的区别,生病写一些代码。你能否提供包装代码(canvase,listeners),以便我可以生成一个例子? – Bergi 2012-08-04 19:04:04

回答

7

首先,得到想要的线路长度:

var delta = {x: event.x - coord.x, y: event.y - coord.y}; 
var len = Math.sqrt(delta.x*delta.x + delta.y*delta.y); 

然后得到的角度(与atan2),并添加40°:

var angle = Math.atan2(delta.y, delta.x); 
var angle_left = angle + 40/180 * Math.PI; 
var angle_right = angle - 40/180 * Math.PI; 

现在你可以从这点:

var left = { 
    x: coord.x + Math.cos(angle_left) * len, 
    y: coord.y + Math.sin(angle_left) * len 
}; 
var right = { 
    x: coord.x + Math.cos(angle_right) * len, 
    y: coord.y + Math.sin(angle_right) * len 
}; 

Demo at jsfiddle.net - Your fiddle updated

+0

[这里是你要求的包装代码](http://jsfiddle.net/JpeVq/)这个节目在行动中看起来会如何,当然,角度在这个角度是不固定的。 现在我有点难以实现你的解决方案,因为我真的对JS没有经验。**编辑**:我没有注意到你的jsfiddle演示,非常感谢你,这应该有所帮助,因为这正是我想要实现的:) – 2012-08-04 19:56:55

+1

你的'img_update'引发错误,没有'contexto '。如果修复,这将删除onMouseUp上的图像 - 教程代码使用两个画布并将静态元素复制到另一个上。 – Bergi 2012-08-04 20:08:13

+0

我没有意识到这一点,直到你说,并在JS控制台中检查它,谢谢。 – 2012-08-04 20:15:32

0

这是你需要的吗?您可以查看这里工作的例子:http://edumax.org.ro/extra/new/Stack1/

var canvas, ctx; 

function viewDidLoad(){ 
canvas = document.getElementById("canvas"); 
ctx = canvas.getContext("2d"); 
canvas.height = 500; 
canvas.width = 500; 
canvas.addEventListener("mousemove", mouse_move_handler, false); 
} 

function mouse_move_handler(e){ 
var mouse = getCursorPosition(e); 
canvas.width = canvas.width; 
ctx.fillStyle="#00ffaa"; 
ctx.fillRect(0, 0, 500, 500); 
ctx.beginPath(); 
ctx.moveTo(mouse.x-100, mouse.y); 
ctx.lineTo(mouse.x, mouse.y+100); 
ctx.lineTo(mouse.x+100, mouse.y); 
ctx.lineWidth = 5; 
ctx.strokeStyle = "Black"; 
ctx.stroke(); 
ctx.closePath(); 
} 

// Get Current Mouse Position 
function getCursorPosition(e) { 
    var x, y; 
    if (e.layerX || e.layerY) { 
     x = e.layerX; 
     y = e.layerY; 
    } 
    else { 
     x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
     y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
    }    
    return {x:x, y:y}; 
    } 
window.onload = viewDidLoad; 
2
如何

这个呢? :http://edumax.org.ro/extra/new/Stack2/

var canvas, ctx; 

function viewDidLoad(){ 
canvas = document.getElementById("canvas"); 
ctx = canvas.getContext("2d"); 
canvas.height = 500; 
canvas.width = 500; 
canvas.addEventListener("mousemove", mouse_move_handler, false); 
} 


var px, py; 

function mouse_move_handler(e){ 
var mouse = getCursorPosition(e); 

var centreX = canvas.width/2; 
var centreY = canvas.height/2; 


var line = Math.sqrt((mouse.y-centreY)*(mouse.y-centreY)+(mouse.x-centreX)*(mouse.x-centreX)); 

var k1 = 100; 
var k2 = line-100; 

var dx =(mouse.x-centreX)/ line; 
var dy = (mouse.y-centreY)/line; 

var x1 = mouse.x+100*dy; 
var x2 = mouse.x-100*dy; 
var y1= mouse.y-100*dx; 
var y2= mouse.y+100*dx; 

if(line>=100){ 
px = ((k1*centreX) + (k2*mouse.x))/(k1+k2); 
py = ((k1*centreY)+(k2*mouse.y))/(k1+k2); 



canvas.width = canvas.width; 
ctx.fillStyle="#00ffaa"; 
ctx.fillRect(0, 0, 500, 500); 
ctx.beginPath(); 
ctx.moveTo(x1, y1); 

ctx.lineTo(px, py); 
ctx.lineTo(x2, y2); 

ctx.lineWidth = 5; 
ctx.strokeStyle = "Black"; 
ctx.stroke(); 
ctx.closePath(); 
} 
} 

// Get Current Mouse Position 
function getCursorPosition(e) { 
    var x, y; 
    if (e.layerX || e.layerY) { 
     x = e.layerX; 
     y = e.layerY; 
    } 
    else { 
     x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
     y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
    }    
    return {x:x, y:y}; 
    } 
window.onload = viewDidLoad; 
+0

@Laszlo Parazs我在这里做错了什么?我可以很容易地改变这一点,但我无法准确理解你需要什么。 – 2012-08-04 20:04:46

+0

我可能在自己的主题中解释了自己的错误,因为这不完全是我的意思,请参阅上面的解决方案。无论如何,我真的很感谢你的努力,谢谢。 – 2012-08-04 20:12:15