HTML画布 - 绘制弯曲的箭头

dee*_*eep 9 html5 canvas draw html5-canvas

我正在尝试在html画布中绘制弯曲的箭头.我没有问题画一条曲线,但我不知道怎么把它放>在线的末端(方向).

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();
Run Code Online (Sandbox Code Playgroud)

我的想法是在最后占据一小部分线并绘制一个三角形.如何获得线中某点的坐标?

以下是更好理解的图像.

带箭头的曲线

Sim*_*ris 17

由于您使用的是二次曲线,因此您知道两条点使得一条线指向箭头的"方向":

在此输入图像描述

因此,抛下一个微微的触发器,你就有了自己的解决方案.这是一个可以为您完成的通用函数:

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));
}
Run Code Online (Sandbox Code Playgroud)

  • +1,只改变我在这里做的:http://jsfiddle.net/SguzM/1/将`atan`更改为'atan2`以支持负角度并防止除零. (5认同)
  • 在此操作之后,您应该将画布转换并旋转回初始状态,以便画布不会使用此函数中设置的方向进行绘制.我在drawArrowhead函数的末尾添加了3行,请看这里:http://jsfiddle.net/SguzM/89/ (2认同)