2012-08-04 3 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

+0

그건 내 문제 : 라인의 길이는 라인의 시작점에서 얼마나 멀리 포인터에 따라 달라질 수 있습니다. 고정 된 선 길이로 고정 된 각도로도 문제가되지 않을 것입니다. –

+0

하지만 차이는별로 없지만 코드가 없습니다. 예제를 생성 할 수 있도록 어딘가에 배치 코드 (canvase, listeners)를 제공 할 수 있습니까? – Bergi

답변

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 데모를 알아 채지 못했습니다, 정말 고마워요, 이것이 도움이 될 것입니다. 정확히 달성하려고 노력하고 있습니다. –

+1

당신의'img_update'는 에러를 던지고,'contexto '. 수정하면 onMouseUp 이미지가 삭제됩니다 - 튜토리얼 코드는 두 개의 캔버스를 사용하고 정적 요소를 다른 캔버스로 복사합니다. – Bergi

+0

당신이 JS 콘솔에서 말하고 점검 할 때까지 나는 이것을 깨닫지 못했습니다. 감사합니다. –

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 여기서 내가 뭘 잘못하고 있니? 나는 이것을 쉽게 바꿀 수 있었지만 당신이 필요로하는 것을 정확하게 이해하는데 어려움을 겪고있다. –

+0

아마도 제가 주제에 대해 조금 잘못 설명했을 것입니다. 그 이유는 이것이 제가 의도 한 바가 아니기 때문입니다. 위의 해결책을 참조하십시오. 어쨌든 정말 고마워요, 고마워요. –

관련 문제