2011-07-04 83 views
7

Tôi đang cố vẽ các mũi tên cong trong canvas html. Tôi không có vấn đề gì để vẽ một đường cong nhưng tôi không biết cách đặt > ở cuối dòng (hướng).HTML Canvas - Vẽ mũi tên cong

ctx.beginPath(); 
    ctx.fillStyle = "rgba(55, 217, 56,"+ opacity +")"; 
    ctx.moveTo(this.fromX,this.fromY); 
    ctx.quadraticCurveTo(this.controlX, this.controlY, this.toX, this.toY); 
ctx.stroke(); 

Ý tưởng của tôi là lấy một phần nhỏ của dòng ở cuối và vẽ một hình tam giác. Làm cách nào để tôi có được tọa độ của một điểm trong dòng?

Dưới đây là hình ảnh để hiểu rõ hơn.

Curve with arrow

Trả lời

15

Vì bạn đang sử dụng một đường cong bậc hai, bạn biết hai điểm mà làm cho một dòng trỏ trong "hướng" của mũi tên đầu của bạn:

enter image description here

Vì vậy, ném xuống một smidge trig và bạn có cho mình một giải pháp. Dưới đây là một chức năng khái quát hóa mà sẽ làm điều đó cho bạn:

http://jsfiddle.net/SguzM/

function drawArrowhead(locx, locy, angle, sizex, sizey) { 
    var hx = sizex/2; 
    var hy = sizey/2; 

    ctx.translate((locx), (locy)); 
    ctx.rotate(angle); 
    ctx.translate(-hx,-hy); 

    ctx.beginPath(); 
    ctx.moveTo(0,0); 
    ctx.lineTo(0,1*sizey);  
    ctx.lineTo(1*sizex,1*hy); 
    ctx.closePath(); 
    ctx.fill(); 

    ctx.translate(hx,hy); 
    ctx.rotate(-angle); 
    ctx.translate(-locx,-locy); 
}   

// returns radians 
function findAngle(sx, sy, ex, ey) { 
    // make sx and sy at the zero point 
    return Math.atan2((ey - sy), (ex - sx)); 
} 
+5

+1, chỉ thay đổi tôi thực hiện ở đây: http://jsfiddle.net/SguzM/1/ là thay đổi việc sử dụng của 'atan 'to' atan2' để hỗ trợ các góc âm và ngăn phân chia bằng 0. – Variant

+0

Ah, suy nghĩ tốt! –

+0

rất tốt cảm ơn cả hai bạn – deep

Các vấn đề liên quan